추상 클래스와 인터페이스

이가현·2023년 8월 8일
0

코틀린

목록 보기
7/12

추상 클래스와 인터페이스

추상 클래스(Abstract Class)는 선언 등의 대략적인 설계 명세와 공통의 기능을 구현한 클래스다. 이를 상속하려면 하위 클래스에서 추상 클래스의 내용을 구체화해야한다.

인터페이스는 대략적인 설계 명세를 가지고 몇 가지 기본적인 부분은 구현할 수 있지만, 하위 클래스에서 더 자세히 구현해야한다. 추상 클래스와 다르게 인터페이스에서는 프로퍼티에 상태 정보를 저장할 수 없다. 단, 다중 상속과 같이 여러 개의 인터페이스를 하나의 클래스에서 구현하는 것이 가능하다.

추상 클래스

abstract 키워드와 함께 선언한다. 일반적인 객체를 생성하는 방법으로 인스턴스화될 수 없다. 프로퍼티나 메서드도 abstract로 선언될 수 있다. 추상 메서드라고 부른다. 이는 아직 미완성되었다는 의미를 줄 수 있다.

추상 클래스에서는 상속을 위해 open 키워드를 사용할 필요가 없다. 마찬가지로 추상 프로퍼티나 메서드에도 open 키워가 필요없다. abstract 키워드 자체가 상속과 오버라이딩을 허용한다.



displaySpecs( )는 기존에 가지고 있던 일반 메서드다. 각 객체의 start, stop은 추상 메서드로부터 오버라이딩되어 하위 클래스에서 구현되었다.

만일 추상 클래스로부터 하위 클래스를 생성하지 않고 단일 인스턴스로 객체를 생성하려면 object를 사용해서 지정할 수 있다.

익명 객체를 지정하는 object 키워드를 사용했다. 콜론 오른쪽에 생성자 이름을 사용하고 블록에서 관련 메서드를 오버라이딩해 구현한다.

인터페이스

인터페이스에는 abstract로 정의된 추상 메서드나 일반 메서드가 포함된다. 객체를 생성할 수 없고 하위 클래스를 통해 구현 및 생성해야 한다.

인터페이스는 클래스가 아니다. 따라서 상속이라는 형태로 하위 클래스에 프로퍼티와 메서드를 전하지 않는다.

Cat 클래스는 Pet 인터페이스를 구현한 클래스다. 추상 프로퍼티나 추상 메서드였던 부분을 override 키워드를 사용해 구현한다.

만일 애완동물의 종류가 더 늘어난다면 그만큼 많은 수의 오버로딩된 메서드가 필요하다. 매번 작성하기 번거롭기에 인터페이스를 사용한다.


Pet 인터페이스에 종을 위한 프로퍼티를 선언하고 어떤 애완동물과 놀게 될 지 알 수 있다. 이제 애완동물에 따라 오버라이딩 할 필요가 없다.

기존의 Master 클래스가 의존적이었으나 인터페이스를 통해 의존성을 제거했다.

또한, 인터페이스를 사용하면 여러 인터페이스로부터 구현할 수 있다. 일종의 다중 상속과 같은 형태가 될 수 있다.


Bird와 Horse라는 2개의 인터페이스로 Pegasus를 정의했다. 모든 추상 프로퍼티와 추상 메서드를 오버라이딩해 구현해주었다. 이미 기본 구현이 되어있는 jump는 필요에 따라서만 오버라이딩할 수 있다.

만일 이름이 동일한 경우 super<인터페이스 이름>.메서드 이름( ) 형태로 구분할 수 있다.

커피 제조기 만들어 보기

인터페이스에서도 by 위임자를 사용할 수 있다. 이를 활용해 커피 제조기를 만들어보자.

커피 제조기를 위한 용어
히터 - 일반적인 켜기, 끄기, 뜨거운 상태 확인
전기 히터 - 추상적인 히터를 구체화
펌프 - 열사이펀 과정을 위한 펌핑 기능
열사이펀 - 커피 추출을 위한 방법 중 하나
커피 모듈 - 추출 방법을 선택할 수 있다. (여기선 오로지 열사이펀 방법)
드립 커피 모듈 - 커피 모듈을 전기 히터와 열사이펀을 조합해 구체화
커피 제조기 - 최종 제품, 브루잉 과정 진행

.
.

  • 히터 인터페이스

    히터를 켜고 끄거나 뜨거운 상태를 나타내는 메서드만 선언되었다.

.
.
.

  • 전기 히터 클래스

    heating 프로퍼티를 가지고 있으며 기본값은 false다.

.
.
.

  • 펌프 인터페이스
  • 열사이펀 클래스

    펌프 인터페이스의 추상 메서드를 열사이펀 클래스에서 구체화했다.

Heater by heater 위임을 통해 isHot( )을 그대로 사용했다.

.
.
.

  • 커피 모듈 인터페이스
  • 드립 커피 모듈 클래스

    by lazy를 사용해 전기 히터와 열사이펀이 접근되는 시점에 초기화하도록 했다. 또한 임시 프로퍼티인 _thermosiphon을 사용해 private으로 선언하였다. 이것은 외부에서 초기화하지 못하고 오직 클래스 내부에서 초기화되로록 한 것이다.

.
.
.

  • 커피 제조기 클래스

    이 객체들을 통해 열사이펀의 방법으로 theSiphon을 생성한다.

프로젝트가 점점 커질 수록 인터페이스를 사용해야한다. 특정 구현에 의존적이지 않은 코드를 만들 수 있는 장점이 있다. 따라서 기능의 정의와 구현을 분리할 수 있고 구현 내용을 확장하거나 교체하기 쉽다.

0개의 댓글