오늘의 공부 📝
오늘은 인터페이스 개념에 대해 집중적으로 학습하였다. 인터페이스는 클래스가 특정 동작을 수행할 수 있도록, 해당 동작에 대한 규약을 정의해 주는 추상화 개념이다. 인터페이스는 클래스와 달리 메서드의 구현을 포함하지 않으며, 그저 클래스가 가져야 할 메서드의 시그니처(이름, 매개변수, 반환 타입)만을 정의한다. 인터페이스는 여러 클래스들이 동일한 동작을 하도록 보장해주고, 다형성을 활용한 유연한 설계를 가능하게 해준다.
인터페이스는 특정 동작을 정의하고, 그 동작을 여러 클래스가 공통적으로 구현할 수 있도록 한다. 인터페이스 자체는 인스턴스화할 수 없으며, 클래스에서 인터페이스를 구현하여 사용할 수 있다. 한 클래스는 여러 인터페이스를 동시에 구현할 수 있어, 인터페이스를 통한 다중 상속의 효과도 얻을 수 있다.
인터페이스란?
인터페이스는 클래스와는 다르게 메서드, 속성, 이벤트 등의 시그니처만을 정의하고, 이를 구현하는 클래스에서 구체적인 동작을 정의하도록 강제하는 구조이다. 인터페이스를 사용하면 클래스 간의 결합도를 낮추고, 코드의 유연성을 높일 수 있다.
주요 특징:
- 메서드, 속성 시그니처만 정의:
- 인터페이스는 메서드나 속성의 시그니처만 정의하고, 구체적인 구현은 포함하지 않는다. 즉, 메서드의 반환 타입, 이름, 매개변수만 정의하고, 그 구현은 인터페이스를 구현하는 클래스가 담당
- 강제된 구현:
- 클래스가 특정 인터페이스를 구현하기로 했으면, 인터페이스에 정의된 모든 메서드와 속성을 반드시 구현해야 한다. 만약 이를 구현하지 않으면 컴파일 오류가 발생
- 다중 구현 가능:
- 한 클래스는 여러 개의 인터페이스를 동시에 구현할 수 있다. 이를 통해 클래스는 다양한 역할을 수행할 수 있게 되고, 다형성을 극대화가 가능
- 다형성 활용:
- 인터페이스는 다형성의 기반이 된다. 인터페이스를 통해 클래스들이 서로 다른 구현을 가지면서도 동일한 방식으로 동작할 수 있도록 보장한다. 즉, 인터페이스를 통해 동일한 메서드를 호출하더라도, 각 클래스의 특성에 따라 다른 방식으로 동작 가능인터페이스 사용 예시
인터페이스 사용 예시
// 인터페이스 정의
interface ICharacter
{
// 공통적인 행동을 정의 (구현은 하지 않음)
void Attack();
void Defend();
}
// 인터페이스 구현 - 전사 클래스
class Warrior : ICharacter
{
public void Attack() => Console.WriteLine("검을 사용한다!");
public void Defend() => Console.WriteLine("방패를 사용한다.");
}
// 인터페이스 구현 - 마법사 클래스
class Mage : ICharacter
{
public void Attack() => Console.WriteLine("주문을 사용한다!");
public void Defend() => Console.WriteLine("방어막을 만든다.");
}
// 프로그램 실행 예시
class Program
{
static void Main()
{
// ICharacter 타입을 통해 Warrior와 Mage를 동일한 방식으로 참조
ICharacter warrior = new Warrior();
ICharacter mage = new Mage();
// 동일한 메서드를 호출하지만 각 클래스의 구현에 따라 다른 동작을 수행
warrior.Attack(); // 출력: 검을 사용한다!
mage.Attack(); // 출력:주문을 사용한다!
warrior.Defend(); // 출력: 방패를 사용한다.
mage.Defend(); // 출력: 방어막을 만든다.
}
}
코드 설명
- ICharacter 인터페이스: Attack, Defend, UseSkill 메서드를 정의하여 캐릭터의 기본 행동을 정의한다.
- Warrior와 Mage 클래스: ICharacter 인터페이스를 구현하여 각각의 클래스가 ICharacter의 메서드를 구체적으로 구현한다.
- Program 클래스: ICharacter 타입을 사용하여 Warrior와 Mage 객체를 동일한 방식으로 참조하고, 메서드를 호출한다. 메서드는 인터페이스의 시그니처에 따라 호출되지만, 각 클래스에서 구현된 방식에 따라 동작한다.
인터페이스를 사용하는 이유
-
- 클래스 간의 결합도를 낮추고 싶을 때:
- 인터페이스는 특정 클래스가 아닌, 클래스의 동작만을 정의하기 때문에 클래스 간의 결합도를 낮출 수 있다. 이를 통해 코드의 유연성이 증가하고, 각 클래스가 독립적으로 수정될 수 있다.
- 다양한 클래스가 동일한 동작을 수행해야 할 때:
- 예를 들어, 여러 캐릭터 클래스(Warrior, Mage)가 모두 Attack, Defend 등의 동작을 수행해야 한다면, 인터페이스를 통해 동일한 동작을 정의하고 이를 각 클래스에서 구현하도록 강제할 수 있다.
- 다중 상속이 필요한 경우:
- C#에서는 클래스의 다중 상속을 지원하지 않지만, 인터페이스를 통해 다중 상속의 효과를 얻을 수 있다. 한 클래스가 여러 인터페이스를 구현하여 다양한 역할을 수행할 수 있다.
- C#에서는 클래스의 다중 상속을 지원하지 않지만, 인터페이스를 통해 다중 상속의 효과를 얻을 수 있다. 한 클래스가 여러 인터페이스를 구현하여 다양한 역할을 수행할 수 있다.
- 클래스 간의 결합도를 낮추고 싶을 때:
마무리 😺
처음에는 추상 클래스의 개념이 다소 헷갈렸지만, 사용 사례를 통해 공부하면서 그 구조와 목적을 명확하게 이해할 수 있었다. 특히, 공통적인 기능을 제공하면서도 특정 기능을 자식 클래스에서 반드시 구현하도록 강제하는 방식이 어떻게 유연한 설계를 가능하게 하는지 알게 되었다. 이 개념은 앞으로 객체 지향 설계에서 매우 유용하게 사용할 수 있을 것 같다. 추상 클래스를 통해 코드의 일관성과 확장성을 더욱 확보할 수 있도록 노력 해야겠다!
'내일배움캠프' 카테고리의 다른 글
내일배움캠프 15일차: where,any (0) | 2024.10.02 |
---|---|
내일배움캠프 14일차: 이벤트 (2) | 2024.10.01 |
내일배움캠프 12일차: const와 readonly (0) | 2024.09.27 |
내일배움캠프 11일차: 추상 클래스 (0) | 2024.09.26 |
Newtonsoft.Json을 사용한 게임 데이터 저장(내일배움캠프 10일차) (1) | 2024.09.25 |