[C#] 인터페이스(Interface), 열거형(Enum) ⭐⭐⭐
카테고리: Sparta C Sharp
C# 인터페이스(Interface), 열거형(Enum)
C#은 다중상속을 지원하지 않는다. -> 인터페이스는 다중상속이 가능하다.
인터페이스(Interface), 열거형(Enum)
다중 상속을 사용하지 않는 이유
- 1. 다이아몬드 문제 : 한 클래스가 두 개 이상의 부모 클래스로 부터 동일한 멤버를 상속받는다.
코드가 복잡, 가독성 저하- 2. 설계의 복잡성 증가 : 클래스간의 관계가 복잡
코드의 유지 보수성이 저하- 3. 이름 충돌과 해결의 어려움 : 다중 상속받는 멤버들의 이름이 충돌할 수 있다.
복잡성 증가, 오류 발생 가능성- 4. 설계의 일관성, 단순성 유지 : c#은 단일 상속으로 일관성, 단순성 유지 가독성, 이해도
1. 인터페이스(Interface)
다중상속 지원. 클래스가 구현해야 하는 멤버들을 정의, I로 시작 (IUseable)
클래스에 대한 제약 조건을 명시하는 것. = 클래스가 인터페이스를 구현할 경우, 모든 인터페이스 멤버를 구현해야한다.
사용이유
- 1. 코드의 재사용성 : 다른 클래스에서 해당 인터페이스를 구현하여 동일한 기능을 공유, 동일한 동작을 수행할 수 있다.
- 2. 다중 상속 제공 : C#은 단일상속을 지원하지만, Interface는 다중 상속을 지원, 여러 인터페이스(기능)을 조합할 수 있다.
- 3. 유연한 설계 : 클래스와 인터페이스 간에 느슨한 결합
구현 예제
// 아이템을 사용할 수 있는 인터페이스
public interface IUsable
{
void Use();
}
// 아이템 클래스
public class Item : IUsable
{
public string Name { get; set; }
public void Use()
{
Console.WriteLine("아이템 {0}을 사용했습니다.", Name);
}
}
// 플레이어 클래스
public class Player
{
public void UseItem(IUsable item)
{
item.Use();
}
}
// 게임 실행
static void Main()
{
Player player = new Player();
Item item = new Item { Name = "Health Potion" };
player.UseItem(item);
}
- 인터페이스 IUseable을 상속받은 클래스 Item
- Item은 Use라는 메서드를 구현해야한다.
- Player 클래스에서 item.Use를 사용
- Main 에서 Player, Item 인스턴스화(Name )
다중 상속 구현 예제
// 인터페이스 1
public interface IItemPickable
{
void PickUp();
}
// 인터페이스 2
public interface IDroppable
{
void Drop();
}
// 아이템 클래스
public class Item : IItemPickable, IDroppable
{
public string Name { get; set; }
public void PickUp()
{
Console.WriteLine("아이템 {0}을 주웠습니다.", Name);
}
public void Drop()
{
Console.WriteLine("아이템 {0}을 버렸습니다.", Name);
}
}
// 플레이어 클래스
public class Player
{
public void InteractWithItem(IItemPickable item)
{
item.PickUp();
}
public void DropItem(IDroppable item)
{
item.Drop();
}
}
// 게임 실행
static void Main()
{
Player player = new Player();
Item item = new Item { Name = "Sword" };
// 아이템 주울 수 있음
player.InteractWithItem(item);
// 아이템 버릴 수 있음
player.DropItem(item);
}
- 인터페이스 IItemPickabel, IDroppable 을 상속받은 클래스 Item
- Item은 Pickup, Drop 을 구현해야 한다.
- Main에서 아이템을 줍고 버리는 기능 수행
궁금한 점
Player 클래스에 매개변수 가 왜 인터페이스일까, 클래스Item으로 해도 되지 않을까?- 이유
클래스로 해도 가능하다, 하지만 나중에 InterFace가 많아지면서 그 메서드가 무슨 기능을 하는지 한눈에 보기 쉽게 Ineterface로 하면 좋다.
추상 클래스의 장단점
- 인터페이스와 비슷하지만 다른.
- 단점 : 단일상속만 가능, 유연성 제한
- 장점 : 하위 클래스에 재정의 X, 코드 중복방지, 확장성 제공
2. 열거형 Enum
서로 관련된 상수들의 집합을 정의할 때 사용 ENUM = 자료형
각 상수는 정숫값으로 지정
사용하는 이유
- 가독성 : 연관된 상수들을 명명할 수 있다.
- 자기 문서화 : 의미 있는 이름을 사용
- 스위치 문과의 호환성 : 스위치 문에서 다양한 상숫값에 대한 분기를 쉽게 작성
열거형 사용 switch
// out 키워드 사용 예시
enum MyEnum
{
Value1 = 10,
Value2, // ->11 이전값의 +1
Value3 = 20
}
// 형변환
int intValue = (int)MyEnum.Value1; // 열거형 값을 정수로 변환
MyEnum enumValue = (MyEnum)intValue; // 정수를 열거형으로 변환
// 스위치문과 사용
switch(enumValue)
{
case MyEnum.Value1:
// Value1에 대한 처리
break;
case MyEnum.Value2:
// Value2에 대한 처리
break;
case MyEnum.Value3:
// Value3에 대한 처리
break;
default:
// 기본 처리
break;
}
// 월 열거형
public enum Month
{
January = 1,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
}
// 월 출력 예제
// 처리하는 함수
static void ProcessMonth(int month)
{
if (month >= (int)Month.January && month <= (int)Month.December)
{
Month selectedMonth = (Month)month;
Console.WriteLine("선택한 월은 {0}입니다.", selectedMonth);
// 월에 따른 처리 로직 추가
}
else
{
Console.WriteLine("올바른 월을 입력해주세요.");
}
}
// 실행 예제
static void Main()
{
int userInput = 7; // 사용자 입력 예시
ProcessMonth(userInput);
}
Enum호기심
Enum에 없는 int값 을 넣으면? 어떻게될까? 오류가 뜨나? ->
튜터님에게 물어봤다.
enum MyEnum
{
Value1 = 10,
Value2, //11 +1
Value3 = 20
}
// 게임 실행
static void Main()
{
int intValue = (int)MyEnum.Value1; // 열거형 값을 정수로 변환
intValue = int.Parse(Console.ReadLine());
//MyEnum enumValue = (MyEnum)intValue; // 정수를 열거형으로 변환
MyEnum enumValue = (MyEnum)100; // 정수를 열거형으로 변환
switch (enumValue)
{
case MyEnum.Value1:
Console.WriteLine("10"+MyEnum.Value1);
break;
case MyEnum.Value2:
Console.WriteLine("11"+MyEnum.Value2);
break;
case MyEnum.Value3:
Console.WriteLine("20"+MyEnum.Value3);
break;
default:
// 기본 처리
break;
}
Console.WriteLine(intValue);
Console.WriteLine("enumvalue : " + enumValue); //Value1~3출력 enumValue=100 일때는 100이 출력된다.
Console.WriteLine(MyEnum.Value1);
Console.WriteLine(MyEnum.Value2);
Console.WriteLine(MyEnum.Value3);
}
- enumValue 에 10 -> Value1, 11 -> Value2, 20 -> Value3
- 100을 넣으면? -> 100이 출력됌
MyEnum enumValue = (MyEnum)100; 에서 오류가 안 뜨고 출력 부분에서 100이 출력됨- 매칭이 안되는 값을 저장하려고 할 때 어떤 주소값에
값으로 저장이 되긴 한다.
[C#] C# 인터페이스(Interface), 열거형(Enum)
댓글남기기