will come true

[Kotlin] 추상클래스 vs 인터페이스 본문

카테고리 없음

[Kotlin] 추상클래스 vs 인터페이스

haehyun 2023. 5. 18. 09:01

(2023-05-18 초안 -> 수정 예정)

추상클래스를 상속받는 추상클래스⭐

개념적 분류를 위함. Animal 추상 클래스를 상속받은 MarineAnimal 그러나 아래로 Dolphine, Shark 등 자식 클래스를 더 만들어서 구현화할 예정이기 때문에 MarineAnimal이 최종 자식 클래스가 아니기 때문에 한 번 더 추상클래스 abstract로 선언해준다. 이로 인해 추상 클래스인 MarineAnimal 만으로드는 객체 생성 불가능하다. 만약 MarineAnimal 을 일반 클래스로 선언할 경우 상속받은 Animal 추상클래스의 미완성 추상메서드들을 반드시 MarineAnimal 클래스 내에서 구현해놔야 한다. (추상 메서드의 강제성) 하지만 어차피 해당 추상메서드들은 Dolphine, Shark에 따라서 다르게 작성해놔야 한다. 즉 한 단계 더 내려간 자식 클래스에서 한 번만 구현해주면 되는 코드이므로 MarineAnimal은 추상클래스가 되어야 한다.

인터페이스, 추상클래스 사용 목적

인터페이스, 추상클래스 둘 다 자식 클래스에서 중복되는 변수나 메서드들을 추상화하는 용도, 분류하는 그룹핑 개념.

  • 자식 클래스들에서 공통으로 나타나는 변수, 메서드들의 중복을 최소화하기
    • 멤버변수 추상화 ⇒ 추상 클래스 만들기
    • 메서드 추상화 ⇒ 인터페이스 만들기
  • 이렇게 추상화된 추상 클래스, 인터페이스들을 각각의 자식 클래스들에 맞게 상속(extends), 구현(implements)하도록 내려준다.

+ 멤버 변수는 클래스에만 정의할 수 있고 인터페이스에 정의되는 변수는 static final 모든 타입들이 공유하는 변수다. 각 객체별로 따로 관리해야 하는 변수가 있다면 클래스로 구현해야 한다.
메서드만 있을 경우엔 인터페이스로 가능
중복 코드 최대한 많이 묶기
변수없이 메서드만 있는 것들은 인터페이스로 변환 가능

print 메서드 관련으로 자식 클래스에서 중복되는 구문이 있다면 부모 클래스에 선언해두고 자식 클래스에서 오버라이딩 하는 과정에서 super()로 공통코드 부분을 호출하면 된다.
이렇게 구현하고자 할 경우 부모 클래스를 추상 클래스로 선언해선 안됨 (=추상클래스는 메서드 몸체 기재 불가능)
부모 클래스에서 선언해둘 코드가 없을 경우엔 추상 클래스로, 조금이라도 구현부가 있다면 일반 클래스로 선언 후 상속

 

공통 속성 추출해서 분류하기

로직 구상 및 설계하기

 

클래스 주생성자⭐

주생성자에서 (var type:String)과 같이 쓰는 건 해당 클래스의 새로운 멤버 변수를 선언하는 것이고 (type:String)과 같이 쓰는 건 상위 클래스에서 상속받은 멤버 변수를 그대로 쓰는 것이다. 즉 해당 자식 클래스 타입으로 객체를 생성할 때 괄호 안에 들어간 멤버를 매개변수로 선언해줘야 한다는 점은 같으나

val t1 = TestClass(”type”)

이 전달받은 매개변수를 생성자에 넣어 ‘부모 클래스로부터 상속받은 멤버변수에 대입하기’인지, ‘부모클래스에는 없던 멤버 변수를 새로 선언한 뒤 대입하기’ 두 동작 중 어떤 것을 수행하는지 차이인 것이다.

 

Comments