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 클래스에서 해당 클래스들을 인스턴스화할 때 발생한다.
'컴퓨터 과학 > 소프트웨어공학' 카테고리의 다른 글
[소프트웨어공학] SOLID(4) : 인터페이스 분리 원칙(Interface Segregation Principle, ISP) (0) | 2024.03.29 |
---|---|
[소프트웨어공학] SOLID(3) : 리스코프 치환 원칙(Liskov Substitution Principle, LSP) (0) | 2024.03.29 |
[소프트웨어공학] SOLID(2) : 개방 폐쇄 원칙 (Open-Closed Principle, OCP) (0) | 2024.03.29 |
[소프트웨어공학] SOLID(1) : 단일 책임 원칙 (Single Responsibility Principle, SRP) (0) | 2024.03.29 |
[소프트웨어공학] 결합도와 응집도 (0) | 2024.03.21 |