티스토리 뷰
본 포스팅의 내용은 [깡샘의 코틀린 프로그래밍]을 공부하고 작성자가 생각을 정리하기 위해서 작성한 글이므로 더욱 자세한 내용을 알고 싶으신 분은 [깡샘의 코틀린 프로그래밍]을 강력 추천합니다!!
1. 추상 클래스
1.1. 추상 클래스 선언(abstract)
- 추상 함수는 미완성 함수 혹은 실행 영역이 없는 함수를 의미한다.
- 추상 클래스는 추상 함수를 포함하는 클래스를 의미한다.
- 추상 프로퍼티란 선언부만 있는 프로퍼티를 말한다.
- abstract 예약어를 활용하여 추상 함수, 추상 프로퍼티와 추상 클래스를 명시할 수 있다.
1.2. 추상 클래스 이용
- 추상 클래스는 그 자체로는 객체를 생성할 수 없고 하위 클래스에서 추상 멤버들을 구현하여 생성해야 한다.
- 추상 클래스는 공통 코드(라이브러리, 프레임워크)를 작성하는 개발자에게 유용한 방법이다.
2. 인터페이스
- 인터페이스는 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 인터페이스의 역할이자 개념이다.
- 인터페이스는 추상 함수를 선언하는 것이 주목적이다.
2.1. 인터페이스 선언 및 구현(interface)
- 인터페이스의 주목적은 추상 함수를 선언하는 것이지만, 필요하다면 인터페이스 내에 구현 내용이 있는 함수도 얼마든지 포함할 수 있다.
- 인터페이스 구현을 명시할 때 ( )를 작성할 수 없다. 콜론( : ) 뒤에 구현하고자 하는 인터페이스명만 작성하면 된다.
interface MyInterface {
var data1: String
fun myFun1() {
// 인터페이스에서도 구현 내용이 있는 함수가 구현 가능하다.
}
fun myFun2()
}
class MyClass : MyInterface {
override var data1 : String = "hello weekyear"
override fun MyFun2() {
// ...
}
}
- 인터페이스를 선언할 때 다른 인터페이스를 상속받을 수도 있으며, 한꺼번에 여러 인터페이스를 상속받을 수도 있다.
- 클래스에서 여러 인터페이스를 나열하여 한꺼번에 구현할 수도 있다.
- 코틀린은 다중 상속을 지원하지 않으므로 상속받을 클래스는 하나만 명시할 수 있으며, 인터페이스를 여러 개 구현할 수 있다.
- 클래스 상속과 인터페이스 구현을 동시에 명시할 때 작성하는 순서는 따로 없지만 보통 클래스를 먼저 작성한다.
- 인터페이스를 객체의 타입으로 이용할 수 있다. 다만 인터페이스의 타입으로 선언할 경우 본래 클래스 타입의 함수나 프로터리를 활용하지 못 한다.
2.2. 인터페이스와 프로퍼티
- 인터페이스 내에 원한다면 함수 이외에 프로퍼티도 추가할 수 있다.
- 인터페이스 내에서 프로퍼티를 정의할 때 규칙은 다음과 같다.
- 추상형으로 선언하거나 get( ), set( ) 함수를 정의해야 한다.
- 추상 프로퍼티가 아니라면 val은 get( ) 함수를 꼭 선언해야 한다.
- 추상 프로퍼티가 아니라면 var은 get( ), set( ) 함수를 꼭 선언해야 한다.
- 인터페이스의 프로퍼티를 위한 get( ), set( ) 함수에서는 field를 사용할 수 없다.
(field를 사용할 수 없는 프로퍼티를 만든다는 것은 프로퍼티의 값을 유지하거나 변경하는 용도로는 사용할 수 없다는 의미다.)
2.3. 오버라이드 함수 식별
- 같은 이름의 추상 함수가 여러 개일 때 하위 클래스에서 한 번만 함수를 재정의해주면 된다.
- 같은 이름의 추상 함수와 구현된 함수가 있을 때 단순하게 추상 함수를 하위 클래스에서 구현하면 되고 구현된 함수를 다시 사용하고 싶을 때 super 키워드를 이용해 호출하면 된다.
- 같은 이름으로 구현된 함수가 여러 개일 때는 함수명 충돌 에러가 발생한다.
- 충돌 에러가 발생하면 같은 이름의 함수로 재정의하여 어느 것을 이용할지 혹은 둘 다 이용할지 타입으로 식별해 명시해줘야 한다.
자바 vs. 코틀린
- 코틀린에서는 추상 함수 이외에 추상 프로퍼티도 선언할 수 있다.
- 코틀린의 인터페이스는 Java 8과 거의 같다.
참고 자료
[깡샘의 코틀린 프로그래밍] 강성윤 지음 <루비페이퍼>
반응형
'Programming > 코틀린(Kotlin)' 카테고리의 다른 글
[코틀린] 코틀린 API의 범위 지정 함수 (0) | 2021.04.26 |
---|---|
[코틀린] Object 클래스 (feat. 깡샘) (0) | 2021.04.25 |
추상 클래스와 인터페이스의 사용 목적 (0) | 2021.04.12 |
[코틀린] 09. 상속 (feat. 깡샘) (0) | 2021.04.12 |
[코틀린] 08. 프로퍼티 (feat. 깡샘) (0) | 2021.04.11 |
댓글