[ 추상 클래스 ]
구조
public abstract class Character
{
public int Health { get; set; }
public abstract void Move();
public void TakeDamage(int damage)
{
Health -= damage;
}
}
추상 클래스는 접근제한자 뒤에 abstract 키워드를 넣어서 만들 수 있다. 클래스 내에는 abstract 키워드가 있는 추상 메서드와 넣지 않은 일반 메서드가 포함된다. 추상 메서드는 구체적인 구현을 포함하지 않고 선언만 한다.
public class Player : Character
{
public override void Move()
{
Debug.Log("Player moves");
}
}
추상 클래스를 상속받은 클래스는 override 키워드를 사용해서 추상 메서드를 재정의한다.
특징
추상 클래스를 상속 받은 클래스는 추상 메서드를 반드시 구현해야 한다. 일반적인 클래스와 다른 점은 일반 클래스는 virtual을 반드시 override 하지 않아도 되지만, 추상 클래스는 abstract 키워드가 붙은 메서드는 강제 구현을 해야 한다. 즉 구현을 해야하는 부분과 하지 않아도 되는 부분이 공존할 때 추상 클래스를 사용할 수 있다. 추상 메서드는 구체적인 구현을 해당 클래스가 아닌, 자식 클래스에서 해야 한다. 또한 추상 프로퍼티도 생성할 수 있고, 인스턴스는 생성할 수 없다.
추상 클래스는 전체적인 흐름을 잡을 때 사용할 수 있다. 예를 들어 협업을 할 때, 투두 리스트처럼 반드시 구현을 해야 하는 메서드를 추상 메서드로 설정해서 필요한 기능들을 잊지 않고 구현할 수 있도록 한다. 또한 다른 팀원이 기능을 구현할 때, 어떤 구체적인 사항을 만들어야 할지 잘 모를 때에도 추상 클래스라는 가이드라인을 제시해서 최소한의 필수적인 기능들을 갖추게 한다. 이외에도 개발자마다 사용하는 메서드명이 달라지지 않기 때문에 메서드명이 통일된다.
[ 인터페이스 ]
구조
public interface IPay
{
void Pay();
}
public class Cash : IPay
{
public void Pay()
{
Consoel.WriteLine("현금을 지불한다.");
}
}
public class Card : IPay
{
public void Pay()
{
Consoel.WriteLine("카드단말기에 꽂는다.");
}
}
public class SasungPay : IPay
{
public void Pay()
{
Consoel.WriteLine("카드단말기에 댄다.");
}
}
인터페이스는 class 키워드 대신 interface 키워드를 사용한다. 인터페이스에서는 구체적인 구현을 하지 않고, 상속 받은 클래스에서 한다.
특징
구체적인 기능을 구현하지 않고, 추상화 개념을 사용하여 기능을 정의하여 묶어 놓은 것이다. 기능은 같지만 이를 작동하는 구체적인 내용이 다를 때 사용할 수 있다. 따라서 중복되는 코드를 작성하지 않아도 돼서 코드가 간결해지고 관리가 쉽다.
예를 들어 결제 기능을 사용하고 싶을 때, 결제 기능이 있는 결제 수단은 다양하다. 현금, 카드, 삼성페이 모두 결제 기능을 지원한다. 하지만 현금은 지폐 또는 동전을 지급하고, 카드는 카드단말기에 꽂고, 삼성페이는 카드단말기에 갖다 대면 결제가 된다. 이처럼 결제라는 기능만 제시해 놓고, 구체적인 구현은 상속받은 클래스에서 한다.
인터페이스를 이용해서 특정 기능이 있는지 탐색할 수도 있다. 만약 게임 오브젝트가 여러 오브젝트와 상호작용할 때, 특정 인터페이스를 구현하고 있는지 여부를 확인해서 해당 인터페이스 내 기능을 호출할 수 있는지 검사할 수 있다.
인터페이스에 대한 기초적인 내용은 아래 글의 '인터페이스' 목차에서 확인할 수 있다.
2024.04.30 - [Coding/C#] - [내일배움캠프 12일차 TIL] 인터페이스, enum, 델리게이트, 람다, Func, Action, LINQ, Nullable
[ 회고 ]
추상 클래스와 인터페이스는 이름은 몇 번 들어봤지만, 사실상 구조나 사용법을 거의 이해하지 못해서 한 번도 사용하지 못하고 있던 개념들이었다. 강의를 처음 들었을 때에는 어느 정도 감이 잡히다가도 막상 다시 보면 이해가 잘 되지 않았다. 그리고 추상 클래스와 인터페이스가 비슷하게 느껴져서 정확히 무슨 차이가 있는지도 헷갈렸다.
하지만 TIL을 작성하면서 두 개념들을 정리하다보니 사용하는 때가 다르다는 것을 알게 됐다. 추상 클래스는 기능을 구현할 때 정의한 메서드들을 반드시 구현해야 함으로써 필수 요소들을 빠뜨리지 않게 한다. 인터페이스는 동일한 기능을 구체적인 세부 사항만 다르게 구현하고 싶을 때, 기능만 정의하고 세부적인 내용들은 각각의 클래스에서 구현하도록 한다. 이처럼 사용처가 다르고, 둘은 구분해서 봐야 한다는 것을 알게 됐다.
'Coding > C#' 카테고리의 다른 글
[내일배움캠프 16일차 TIL] 제네릭, out, ref, 문자열 빌더 (0) | 2024.05.07 |
---|---|
[내일배움캠프 15일차 TIL] 로직 설계, 기능별 파일 구분, 폴더 구조 (0) | 2024.05.03 |
[내일배움캠프 13일차 TIL] 클래스 메모리 구조, 기본값 세팅, 박싱/언박싱 (0) | 2024.05.01 |
[내일배움캠프 12일차 TIL] 인터페이스, enum, 델리게이트, 람다, Func, Action, LINQ, Nullable (0) | 2024.04.30 |
[내일배움캠프 11일차 TIL] 배열과 리스트 비교, 로직 설계 방법 (0) | 2024.04.29 |