본문 바로가기
컴퓨터 과학/소프트웨어공학

[소프트웨어공학] 팬인(Fan-in) 과 팬아웃(Fan-out)

by webcodur 2024. 3. 19.
728x90

목차

     

     

    1. FAN?

    "Fan"이란 단어는 원래 "부채질하다", "공기를 움직이게 하다"는 의미에서 유래되었지만, 컴퓨터 과학과 전자공학에서는 "분산하다", "확산시키다" 혹은 "집중시키다"와 같은 개념으로 사용된다. 특히, 팬인(Fan-in)과 팬아웃(Fan-out) 용어에서는 데이터 흐름이나 전기 신호의 방향과 분포를 나타내는 데 쓰인다.

    • 팬인(Fan-in): 여러 입력 신호나 데이터 스트림이 하나의 단일 지점으로 집중되는 것을 의미한다. 예를 들어, 여러 센서로부터의 데이터가 하나의 처리 유닛으로 모이는 상황에서 사용된다.
    • 팬아웃(Fan-out): 하나의 신호원이나 데이터 스트림이 여러 출력 포인트로 분산되는 것을 의미한다. 예를 들어, 하나의 처리 유닛에서 여러 다른 유닛으로 데이터를 전송하는 상황을 설명할 때 사용된다.

    이 개념들은 정보의 흐름을 시각화하고, 시스템의 설계와 구조를 평가하는 데 중요한 역할을 한다. 이를 통해 개발자와 엔지니어는 시스템의 효율성, 재사용 가능성, 복잡성, 유지 관리성 등을 분석하고 개선할 수 있다.

     

     

    2. 소프트웨어 개발에서의 의미

     

    팬인(Fan-in)

    • 재사용성이 높은 코드나 모듈은 일반적으로 높은 팬인 값을 가진다.
    • 다양한 장소에서 해당 코드나 모듈을 호출하기 때문
    • 높은 팬인 값은 모듈이나 함수가 안정적이고 신뢰성 있고, 변경 시 영향을 받는 범위가 크다는 것을 의미한다

    팬아웃(Fan-out)

    • 한 모듈이 너무 많은 다른 모듈에 데이터를 전송하고 있다면 (즉, 높은 팬아웃 값을 가지고 있다면), 이는 복잡성이 높고 유지 관리가 어렵다는 신호일 수 있다.
    • 낮은 팬아웃 값은 모듈이나 함수가 단순하고, 의존성이 적으며, 이해하고 관리하기 쉽다는 것을 의미할 수 있다.

    팬인 팬아웃 모듈 수 계산

    • IN OUT 계산은 모듈에 들어온 값과 나간 값을 기준으로 카운트 해주면 된다.

     

    FAN IN

    m a b c d e f g h i
    0 1 1 1 1 1 1 1 1 1

     

    FAN OUT

    m a b c d e f g h i
    3 2 1 2 1 1 0 0 0 0

     

     

    3. C# 코드 예시

    다음은 간단한 게임 개발 시나리오를 나타낸 C# 코드이다.  플레이어, 무기, 그리고 적을 다루는 클래스를 정의할 것이다.  각 클래스의 상호작용에 따라 팬인과 팬아웃을 평가할 수 있다. 코드 내 팬인(Fan-in)과 팬아웃(Fan-out)을 수동으로 계산해 보자.

    using System;
    
    public class Player
    {
        public int Health { get; set; }
        public Weapon EquippedWeapon { get; set; }
    
        public Player()
        {
            Health = 100;
            EquippedWeapon = new Weapon("Sword", 10);
        }
    
        public void Attack(Enemy enemy)
        {
            int damage = EquippedWeapon.CalculateDamage();
            enemy.TakeDamage(damage);
        }
    }
    
    public class Weapon
    {
        public string Name { get; set; }
        public int Damage { get; set; }
    
        public Weapon(string name, int damage)
        {
            Name = name;
            Damage = damage;
        }
    
        public int CalculateDamage()
        {
            return Damage;
        }
    }
    
    public class Enemy
    {
        public int Health { get; set; }
    
        public Enemy()
        {
            Health = 50;
        }
    
        public void TakeDamage(int damage)
        {
            Health -= damage;
        }
    }
    
    class Game
    {
        static void Main()
        {
            Player player = new Player();
            Enemy enemy = new Enemy();
    
            Console.WriteLine("Enemy health before attack: " + enemy.Health);
            player.Attack(enemy);
            Console.WriteLine("Enemy health after attack: " + enemy.Health);
        }
    }
    

     

     

    팬인과 팬아웃 계산

    • Player 클래스
      • 팬인: Game 클래스에서 사용됨 (팬인 = 1)
      • 팬아웃: Weapon, Enemy 클래스를 사용 (팬아웃 = 2)
    • Weapon 클래스
      • 팬인: Player 클래스에서 사용됨 (팬인 = 1)
      • 팬아웃: 없음 (팬아웃 = 0)
    • Enemy 클래스
      • 팬인: Player 클래스에서 공격을 받음 (팬인 = 1)
      • 팬아웃: 없음 (팬아웃 = 0)
    • Game 클래스
      • 팬인: 없음 (시작점이므로 팬인 = 0)
      • 팬아웃: Player, Enemy 클래스를 사용 (팬아웃 = 2)

    이 시나리오에서 Player 클래스는 다른 두 클래스(Weapon, Enemy)와 상호작용하므로 팬아웃이 상대적으로 높다. 팬인은 주로 Game 클래스에서 해당 클래스들을 인스턴스화할 때 발생한다.