본문 바로가기

Language/Kotlin

[Kotlin] 7장. 다양한 클래스와 인터페이스 1 - 추상 클래스와 인터페이스

728x90

추상클래스

abstract 키워드를 사용하며, 일반적인 객체를 생성하는 방법으로 인스턴스화 시킬 수 없다.

추상 클래스를 설계할 때 멤버인 프로퍼티나 메서드도 abstract로 선언될 수 있으며, abstract로 선언되지 않은 메서드나 프로퍼티는 특정 초기화나 구현이 필요하다.

abstract 키워드로 선언되면 미완성이라는 것이기 때문에 해당 클래스를 사용하는 하위 클래스에서 반드시 재정의 및 초기화를 진행해야 한다.

 

 

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

 

 

인터페이스

인터페이스에는 abstract로 정의된 추상 메서드나 일반 메서드가 포함된다.

추상 클래스는 상속을 통해 하위 클래스로 확장해 나갈 수 있다. 하지만, 하나의 상속만 허용하기 때문에 2개 이상의 상속을 받을 수 없다는 단점이 있으며, 상위-하위 클래스 간의 강한 연관이 생기면서 하위 클래스는 상위 클래스에 영향을 받게 된다.

반면 인터페이스는 2개 이상의 인터페이스를 사용하여 다중 상속과 같은 효과를 낼 수 있다.

 

interface 키워드를 사용해 선언하고, 상속한 하위 클래스에서는 override를 사용해 해당 메서드를 구현.

interface 키워드를 사용하는 경우, 메서드는 일반 혹은 추상 메서드 모두 선언이 가능하지만 프로퍼티는 오직 추상 메서드로만 선언해야 한다.

 

 

위의 예제에서 category의 경우 interface에 선언된 프로퍼티이기 때문에 abstract 키워드가 없어도 추상 프로퍼티가 된다. 따라서 인터페이스 Pet을 상속받은 Cat 클래스에서 override를 통해 category를 초기화 시켜주었다.

Pet에서 Patting은 내용이 선언되어있는 일반 메서드이고 feeding은 추상 메서드이기 때문에, Cat에서는 feeding을 override 하여 구현해주어야 된다.

 

게터(Getter)를 구현한 프로퍼티

인터페이스에서는 프로퍼티에 값을 저장할 수 없다.

하지만, val로 선언된 프로퍼티는 보조 필드인 field를 사용할 수 없기 때문에 값을 설정할 수는 없지만, 게터를 통해 내용을 구현할 수 있다.

 

위의 예제에서 msgTags 와 같이 val로 선언한 후에 getter를 선언하여 사용하면 된다.

 

여러 인터페이스의 구현

상속은 오직 1개의 클래스만 가능하지만, 인터페이스는 여러개를 사용하여 다중 상속과 같은 형태로 사용이 가능하다.

 

 

인터페이스 Bird, Horse 를 사용하는 Animal 클래스에서는 추상 메서드인 fly와 run, 추상 프로퍼티인 speed와 wings를 구현 및 초기화 하여 사용한다.

 

728x90