728x90
반응형
상속
kotlin은 기본적으로 클래스간의 상속이 금지되어있다.
상속을 하려면 이 기본값을 상속금지에서 상속가능으로 변경해주어야 한다. 변경해줄 때 클래스 앞에 open을 붙인다.
// open을 붙인다
open class Animal(var name:String, var age:Int, var type:String){
fun introduce(){
println("[$type] Hi my name is $name and I'm $age!")
}
}
//상속을 받을 때 안의 매개변수는 상속을 받는 것이므로 var을 선언하지 않고 매개변수의 이름만 선언한다.
//선언을 할 때 사용할 기본값만 선언하고 상속을 받으면서 고정될 기본값을 다음 : 뒤에 붙인다.
class Dog(name:String, age:Int) : Animal(name, age, "Dog"){
// 자손만 사용할 수 있는 메서드도 역시 생성 가능하다
fun bark(){
println("bark bark!")
}
}
fun main(){
var sally = Animal("sally", 5, "Dog")
sally.introduce()
var sam = Dog("sam", 4)
// 상속을 받았기 때문에 부모의 메서드를 사용할 수 있다.
sam.introduce()
// 자손만 사용할 수 있는 메서드도 역시 생성 가능하다
sam.bark()
}
[Dog] Hi my name is sally and I'm 5!
[Dog] Hi my name is sam and I'm 4!
bark bark!
오버라이드
자바와는 다르게 오버라이딩, 즉 부모의 메서드를 자손의 메서드에서 사용이 불가능하다.
역시나 오버라이딩을 할 때도 위의 상속 개념과 같게 open을 앞에 붙여주게 된다면 자손의 객체에서도 동일한 이름의 메서드를 오버라이딩 할 수 있게 해준다.
open class Animal(var name:String, var age:Int, var type:String){
fun introduce(){
println("[$type] Hi my name is $name and I'm $age!")
}
// open을 붙여주어 오버라이딩이 가능하게 한다.
open fun live(){
println("We are wild animals")
}
}
class Dog(name:String, age:Int) : Animal(name, age, "Dog"){
// 부모 객체의 메서드를 오버라이드, override를 붙여준다
override fun live(){
println("we are domestic animals")
}
}
fun main(){
var sam = Dog("sam", 4)
// 부모의 메서드 오버라이드.
sam.live()
}
we are domestic animals
추상화, abstract
추상화, 즉 클래스와 그의 메서드를 구현하되 내용은 적지않고 이 추상화 클래스를 상속받는 클래스가 구현을 대신 한다. 부분적으로 구현을 할 수 있으나 전부 구현되지 않은 미완성 클래스라고 이해하자.
추상화로 구현할 때는 abstract를 클래스명 앞과 메서드명 앞에 붙인다.
abstract class cat(){
abstract fun eat()
fun jump(){
println("Jump!")
}
}
위의 만든 cat 추상화 클래스를 활용한다면 아래와 같이 활용할 수 있다.
// 추상화 클래스를 만든다. 전부 구현되지 않은 미완성 메서드 껍데기
abstract class cat(){
abstract fun eat()
fun jump(){
println("Jump!")
}
}
//추상화 클래스를 상속받아서 미완성된 메서드를 구현한다.
class DomesticCat : cat(){
override fun eat(){
println("eating fish")
}
}
// 미완성 메서드를 실행한다.
fun main(){
var cats = DomesticCat()
cats.eat()
cats.jump()
}
eating fish
Jump!
인터페이스
마지막으로 kotlin의 인터페이스에 대해 알아보자.
kotlin의 인터페이스는 생성자를 가질 수 없고 구현부가 있는 함수는 open함수, 구현부가 없는 함수는 abstract함수로 간주하기 때문에 재정의를 해줄 필요 없이 서브클래스(인터페이스를 받는 클래스)에서 override를 붙여 재선언이 가능하다.
아래 예시를 보면서 이해하자
//두개의 인터페이스를 만든다.
interface move{
fun move(){
println("move move")
}
}
interface eat{
fun eat()
}
//서브클래스인 Dog을 생성하고 두개의 인터페이스를 콤마를 통해 받는다.
//두개의 구현부를 구현한다.
class Dog(var name: String, var age:Int) : move, eat{
// 두개의 메서드를 override modifier를 통해 서브클래스에서 재정의하여 실행한다.
override fun eat() {
println("eat DogFood")
}
override fun move() {
println("go for a walk!")
}
}
// 구현된 메서드를 실행한다.
fun main(){
var cats = Dog("Sally", 3)
cats.eat()
cats.move()
}
eat DogFood
go for a walk!
728x90
반응형
'Kotlin > 문법' 카테고리의 다른 글
kotlin의 클래스 - 객체지향 (0) | 2022.04.30 |
---|---|
kotlin 반복문 while, for - step (0) | 2022.04.29 |
kotlin 조건 연산자 - when, if (0) | 2022.04.29 |
kotlin 함수 만들기, Any 사용하기 (0) | 2022.04.29 |
kotlin 명시적 형변환, 배열 (0) | 2022.04.29 |