인터페이스와 열거형
다중상속을 사용하지 않는 이유
- 다이아몬드 문제:
한 클래스가 두 개 이상의 부모 클래스로부터 동일한 멤버를 상속받을 때 같은 이름의 멤버가 있을 경우 어떤 부모클래스의 멤버인지 애매해짐 - 설계의 복잡성 증가:
다중상속 시 클래스간의 관계가 복잡해지며 클래스간의 상속 관계 파악이 어려워지고 코드의 유지보수가 어려워짐 - 이름 충돌과 충돌 해결의 어려움:
여러개의 클래스로부터 상속받은 멤버들이 충돌할 수 있고 이를 해결하기 위해서는 이름을 재정의하거나 부모클래스를 지정해야하는데 그렇게 되면 코드가 복잡해지고 오류 가능성도 증가한다
이러한 이유로 C#에서는 단일 상속만 가능하도록 제한하여 코드의 일관성과 단순성을 유지한다
만약 다중상속이 필요하다면 인터페이스를 이용하여 유사하게 구현할 수 있다
인터페이스를 사용하는 이유
- 코드의 재사용성:
다른 클래스에서 해당 인터페이스를 구현하여 동일한 기능을 공유할 수 있다
다양한 클래스가 인터페이스로 동일한 동작을 수행하므로 코드 재사용성 향상 - 다중 상속 제공:
C#은 다중상속을 지원하지 않지만 인터페이스를 사용하면 다중상속이 가능하다
클래스가 여러가지 인터페이스를 구현하도록 해서 여러개의 기능을 조합할 수 있다 - 유연한 설계:
클래스와 인터페이스 간에 느슨한 결합 형성 가능
구현부와 제시부를 분리해 클래스에서는 인터페이스를 구현하기만 하면 되므로 유연하고 확장 가능한 설계가 가능해진다
인터페이스
인터페이스 특징
- 클래스가 구현해야하는 멤버를 정의하는 것
- 클래스의 일종이 아니고 클래스에 대한 제약조건
- 인터페이스를 상속받은 클래스는 해당 인터페이스의 멤버를 모두 구현해야함
- 다중상속 지원
인터페이스 구현
- 인터페이스 및 멤버 정의하기
interface 키워드 사용, 이름은 I로 시작
interface IMyInterface
{
void Method1();
int Method2(string str);
}
- 인터페이스 구현하기
클래스에서 상속받은 후 멤버 구현
class MyClass : IMyInterface
{
public void Method1()
{
// 구현
}
public int Method2(string str)
{
// 구현
return 0;
}
}
인터페이스 vs 추상클래스
인터페이스 장단점
- 인터페이스는 멤버를 정의만 하고 구현하지 않는다
- 다중상속을 지원하며 여러 클래스가 하나의 인터페이스를 구현할 수 있다
- 클래스간의 결합도를 낮추고 코드를 유연하게 만든다
- 코드의 재사용성과 확장성을 향상시킨다
- 클래스에서 인터페이스의 멤버를 모두 구현해야하므로 작업량이 증가할 수 있다
추상클래스 장단점
- 추상클래스는 일부 동작의 구현을 가지고, 추상 메서드를 포함할 수 있다
- 단일 상속만 가능하고 다른 클래스와 함께 상속계층구조를 형성할 수 있다
- 코드의 중복을 방지하고 확장성을 제공한다
- 하위 클래스에서 구현하지 않아도 될 경우 유용
- 다중상속이 불가능하고 유연성이 제한된다
열거형
사용하는 이유
- 가독성:
연관된 상수의 이름을 지정할 수 있다. 코드의 가독성이 증가하고 상수로 사용할 때 실수로 다른 값을 할당하는 것을 방지한다 - 자기문서화:
의미있는 이름을 사용해 상수를 명명하므로 상수의 의미를 명확하게 한다 - 스위치 문과의 호환성:
스위치 문에서 다양한 상수값에 대한 케이스를 쉽게 작성할 수 있다
특징
- 서로 관련된 상수들의 집합을 정의한다
- 정수 값으로 지정한다
열겨형 구현
- 열거형 정의
enum 키워드 사용, 0부터 순서대로 값이 할당된다
enum MyEnum
{
Value1,
Value2,
Value3
}
- 열거형 사용
MyEnum myEnum = MyEnum.Value1;
- 열거형 상수 값 지정
상수 값을 직접 할당 할 수 있다. 지정된 요소부터 1씩 증가하며 자동으로 상수 값이 할당된다
enum MyEnum
{
Value1 = 10,
Value2,
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;
}
'내일배움캠프_TIL' 카테고리의 다른 글
8월 28일 TIL (0) | 2023.08.28 |
---|---|
8월 25일 TIL (0) | 2023.08.25 |
8월 23일 TIL (0) | 2023.08.23 |
8월 21일 TIL (0) | 2023.08.22 |
8월 18일 TIL (0) | 2023.08.18 |