안녕하세요 윌리엄이예요~~
오늘은 지난시간에 배운 주 생성자와 부생성자를 바탕으로 상속과 다형성에 대해 알아보겠습니다
상속이란?
흔히 자식이 부모에게 유산 받을때 "상속"이라는 말을 사용하죠?
클래스에서도 이와 동일하게 상속이라는 말이 존재합니다!
부모클래스에서 가지고있는 추상화된 속성 (프로퍼티,메소드)을 자식이 그대로 사용 할 수 있는 관계를 나타내죠
또한 자식은 부모의 속성에 추가적으로 속성을 추가 할 수있어요!
그럼 상속을 왜 사용할까요?

이유는 똑같은 작업을 반복적으로 안해도 되기 때문이예요
예를 들어 부모가 집을 사서 가족이 같이 산다면 자식은 굳이 집을 또 살필요가 없죠(학생이라면)
그냥 거기서 필요한 생활용품만 사면 되는것처럼 말이죠!
지금까지 상속에 대한 정의를 소개 했고
코틀린에서 상속은 어떻게 사용하는지 소개 할께요!
상속사용하는 법!
1.모든 클래스는 묵시적으로 Any()라는 클래스를 상속 받습니다!
-> 즉 상속이 가능한 부모클래스 또한 Any클래스를 상속받는다는것이죠
(Any는 모든것을 허용하므로 정확한 "형"을 모를때 사용합니다)
2.open class
-> 자신이 상속가능한 부모클래스가 되려면 앞에 open을 붙혀야한다
3.기본적으로 파생클래스는 파생 불가!
-> 한번 파생 받은 자식클래스는 부모가 될수없습니다!
4.부모클래스(기본클래스)에선 생성자 가 있으면 다 써줘야한다
->부모가 전달할것이 메소드가 아닌 프로퍼티라면 생성자를 다 명시해야한다
(유산을 어떤걸 줘야할지 알려줘야겠죠?)
5.반드시 부모 클래스가 가지는 생성자의 내용이 주 혹은 부 생성자에 정의 되어야한다
->4.에서 전달할 프로퍼티가 있다면 부모 클래스에서 모두 써줘야 한다고 했죠?
따라서 전달 받은 생성자를 자식 클래스의 주생성자 혹은 부 생성자에
반드시 명시를 해줘야합니다(유산 받을 걸 확인! "잘 받았습니다!!")
6.추가적으로 프로퍼티를 넣고 싶을때 주 생성자에서는 val 또는 var로 바로 사용가능 합니다 but 부생성자는 ..
->만약 부모가 준 생성자에서 추가적으로 자신만의 프로퍼티를 정의하고 싶다면
주생성자는 바로 생성자에 넣을수있습니다
하지만 부 생성자의경우 this키워드(자기 자신의 컨텍스트에 있는 프로퍼티)를 이용하여 프로퍼티를 만들어야 합니다
7. 마지막으로 주생성자는 부모의 생성자를 부 생성자는 super를 이용하여 부모의 생성자에 전달(초기화)해줘야 한다
다형성(Polymorphism)이란?
이름이 동일한 것처럼 보이지만 매개변수가 서로 다른 형태를 취하거나 실행 결과를 다르게 가질 수 있는 것을 다형성(polymorphism) 이라고 합니다.
오버라이딩
버튼을 누를때 "누른다"는 행위는 같은데 속성이 저장, 취소 이렇게 나뉠때 즉 속성이 바뀔때 사용하는것입니다
그런데 누른다는것이 상위 클래스 즉 부모클래스에도 있다면 자식에서 재정의 하면 되는것이 오버라이딩입니다!
(메서드나 프로퍼티의 이름은 같지만 기존의 동작이 다른 동작으로 재정의하는 것)
오버라이드 하는법
1.부모 클래스 내에서 오버라이드 할 함수 앞에 open을 붙인다.
2.자식 클래스 내에서 오버라이드 할 함수 앞에 override를 붙인다.
final
또한 오버라이드 한 함수를 또 자신의 자식에게 오버라이드 허용해주기 싫다면
final override fun () 이렇게 final키워드를 붙여주면 됩니다!
정리
val lark = Lark("myLark", 2, "short","smile")
val lark_:Bird = Lark("myLark", 2, "short","smile")
lark.fly()
lark_.fly()
lark의 경우 기본적으로 Lark형이므로 val lark : Lark() 생략가능합니다
이번엔 하나는 Lark 클래스를 하나는 Bird클래스를 상속받는 프로퍼티의 값을 보겠습니다
결과부터 보면
저는 처음의 Bird()클래스를 상속받은 lark_.fly의 값은 Bird클래스의 fly메소드가 나올줄알았습니다

하지만 두개 모두 lark클래스의 fly메소드가 실행되었는데요
이유는 Lark함수의 fly메소드가 이미 오버라이드 한 상태여서 부모를 상속하든 자기 자신을 상속(?)하든
이미 오버라이드 된 자신을 가리키게 되기때문입니다!
오버로딩
이번에는 동작은 같지만 입력 인자가 다른 경우를 생각해 봅시다. 동일한 클래스에서 ‘출력한다’라는 행위를 print() 라는 같은 이름의 메서드로 여러 개를 만들 때
print(123)과 같이 인자로 숫자를 사용해 출력하거나 print("hello")와 같이 문자를 사용해 출력할 수 있습니다.
출력의 동작은 동일하지만 인자의 형식만 달라지는 경우로 오버로딩(overloading) 이라고 부릅니다.
오늘은 상속과 다형성 오버라이딩과 오버로딩을 살펴봤는데요
저는 처음에 오버라이딩 오버로딩이 헷갈렸어요!
그래서 쉽게 ride(타다)라는 동사를 생각해서 동작을 가리키는 method를 관련한다고 생각하니깐 쉽게 구별되더라고요!ㅎㅎㅎ 참고 하셨으면 좋겠어요
(물론 load도 동사지만^^)
그럼 다음시간에 super와 this키워드에 대해 알아보도록 할께요!!
긴 글 읽어 주셔서 감사합니다!
질문이나 잘못된 정보는 언제든지 환영합니다!

'Kotlin > 객체지향의 기본' 카테고리의 다른 글
클래스의 개념과 생성자 (0) | 2021.07.03 |
---|