본문 바로가기
NSLog(@"%@", dailyLog)

[Kotlin 20200803] 객체 지향 프로그래밍

by 틴디 2020. 8. 3.
728x90
반응형

해당 내용은 Do it! 코틀린 프로그래밍 책을 공부하며 인용 및 정리한 것입니다. 저의 개인적인 견해나 의견이 포함되어 있습니다. 코드는 되도록 책을 보고 응용해서 작성했습니다.

05_3 상속과 다형성

상속의 장점 : 상위 클래스의 있는 내용을 하위 클래스에서 다시 구현하지 않아도 됨

다형성 장점 : 하나의 이름으로 다양한 기능을 수행할 수 있음

 

상속과 클래스의 계층

- 파생 클래스(하위 클래스)에서는 기반 클래스(상위 클래스)와 다른 프로퍼티와 메서드만 추가하여 사용해도 됨

- 코틀린의 최 상위 클래스 Any 클래스 -> 상위 클래스를 명시하지 않으면 Any 클래스를 상속 받음

- 코틀린에서 상속할 수 있는 클래스를 선언하려면 open 키워드 사용. open 키워드를 적지 않을 경우 기본 클래스로 선언됨(최종 클래스로 상속 할 수 없음)

+) 자바에서 상속할 수 없는 클래스로 선언하고 싶은 경우 final 키워드 사용

 

하위 클래스 선언

open class Shape(var width: Int, var height: Int, var name: String) {
    fun drawShap() = println("this shap is $name")
    fun printFeature() = println("width: $width, height: $height")
}

// 주 생성자를 이용하여 상속
class Rectangle(width: Int, height: Int, name: String) : Shape(width, height, name) {
    fun printRec() = println("this class is Rectangle class")
}

// 부 생성자 이용하여 상속
class Circle : Shape {
    var round: Double
    
    constructor(width: Int,
                height: Int,
                name: String,
                round: Double) : super(width, height, name) {
        this.round = round // 확장 : 새로 생성한 프로퍼티
    }
}

 

다형성

- 오버로딩 

- 오버라이딩

 

오버로딩(overloading)

- 동일한 클래스 안에서

- 같은 이름의 메서드로 여러번 정의하되, 매개변수는 다르게

- 클래스 메서드, 일반 함수 오버로딩 가능 

- 주로 다양한 자료형에 대해 대응하기 위해 사용되고 있음

fun add(x: Int, y: Int) = x + y

fun add(x: Int, y: Int, z: Int) = x + y + z

fun add(x: Double, y: Double) = x + y

+) 옛날에 한 강사님이 알려주시길 load가 적재하는 의미도 있기 때문에 트럭에 똑같은 짐을 계속 over해서 쌓아올리는 걸 연상하면 쉽다고 설명해 주셨다.

 

오버라이딩(Overriding)

- 재정의

- 하위 클래스에서 새로 만들어지는 메서드가 이름이나 매개변수, 반환값이 상위 클래스와 같은 경우 하위 클래스에 의해 재정의 됨. 

- 전혀 다른 기능 정의 가능

- 오버라이딩 하기 위해서 기반 클래스는 open 키워드, 파생 클래스는 override 키워드 사용

open class Shape { // 상속하기 위해 open 키워드 사용
    open fun draw() = print("draw shape") // 오버라이딩을 위해 open 키워드 사용
}

class Rectangle : Shape() {
    override fun draw() = print("draw Rectangle") // 재정의를 위해 override 키워드 사용
}

- open 키워드가 없는 메서드의 경우 overriding 불가능

- 오버라이딩을 통해 재정의하고 싶지 않은 경우 아래와 같이 final 키워드 사용

open class Shape { // 상속하기 위해 open 키워드 사용
    final fun draw() = print("draw shape") // 오버라이딩 불가능하게 하는 final 키워드
}

class Rectangle : Shape() {
    override fun draw() = print("draw Rectangle") // 에러
}

- 하위 클래스에서 특정 메서드 재설계 시 유용한 기법 

 

05_4 super와 this의 참조

super.propertyName // 상위 클래스 프로퍼티 참조

super.method() // 상위 클래스 메서드 참조

super() // 상위 클래스 생성자

this.propertyName // 현재 클래스 프로퍼티 참조

this.method() // 현재 클래스 메서드 참조

this() // 현재 클래스 생성자 참조

 

super로 상위 객체 참조

- 상위 클래스에서 구현한 내용은 그대로, 필요한 내용만 추가하고 싶을 때

- super.method() 를 통해 상위 클래스의 메소드를 실행 시킬 수 있음

- 상위 클래스의 동작을 수행하고 일부는 재정의 하는 등 유용하게 사용 가능

 

this로 현재 객체 참조하기

- 오버로딩된 같은 클래스의 생성자를 호출 할 수 있음

- 상속을 통해서 클래스를 만드는 경우 -> 상위 클래스 생성자 있는 경우 반드시 하위 클래스에서 호출해야 함

 

-> this, super 로 위임하여 다른 생성자를 처리할 수 있게 됨

 

주 생성자와 부 생성자 함께 사용하기

- 객체의 인자 수에 따라 부 생성자 혹은 주 생성자를 호출

- 예제 코드 : 주생성자 -> 프로퍼티 할당 -> 초기화 블록 -> 부생성자

 

바같 클래스 호출

- 이너 클래스 : 클래스 안에 클래스

- super@outerClassName

- 이너 클래스에서 상위 클래스 호출 시 사용

 

728x90
반응형

댓글