반응형
상속 테스트 1
- 부모 클래스 생성
open class Animail(var name: String, var age: Int, val gender: String){
/* 키워드 비교를 위한 속성 정의*/
open var test1: Int = 0
var test2: Int = 0
/* animail이 가지는 기능 정의*/
fun eat(food: String){
println("${name}이(가) ${food}를(을) 먹습니다.")
}
fun sleep(hour: Int){
println("${name}이(가) ${hour}시간 동안 잡니다.")
}
}
- Animail을 상속 받는 자식 클래스 생성
class Rabbit(name: String, age: Int, gender: String, var location: String, var weight: Int, var kinds:String ) : Animail(name, age, gender){
/* rabbit만 가지는 기능 정의*/
fun jump(){
println("${location}에 살고 있는 몸무게가 ${weight}kg인 ${kinds}종 토끼${name}이(가) 깡총깡총 뜁니다.")
}
// name: String, age: Int, gender: String는 부모 필드 값,
// var location: String, var weight: Int, var kinds:String 는 rabbit이 가지는 속성
}
- 출력하기
fun main(){
//이름 나이 성별은 animail에서 초기화 나머지는 rabbit에서 초기화 됨
var rabbit = Rabbit("엽기토끼",25, "중성", "종로",100,"라이언헤드")
rabbit.eat("햄버거")
rabbit.sleep(5)
rabbit.jump()
}
출력 결과
엽기토끼이(가) 햄버거를(을) 먹습니다.
엽기토끼이(가) 5시간 동안 잡니다.
종로에 살고 있는 몸무게가 100kg인 라이언헤드종 토끼엽기토끼이(가) 깡총깡총 뜁니다.
상속 테스트 2
- 부모클래스
open class Parent(var parentProp: Int){
fun parentFunc(){
println("parent func")
}
}
- 자식 클래스
class Child(prop: Int, var childProp: Int) : Parent(prop){
fun childFunc(){
//자식 객체에서 부모 객체의 속성을 사용하기 위해서 super 활용 가능
//부모 객체에 따로 제한 되어 있는 키워드가 없기 때문에 super 없이도 호출 가능
println("${super.parentProp}")
println("${parentProp}")
super.parentFunc()
parentFunc()
}
}
- 출력하기
fun main(){
var p =Parent(1)
var c = Child(2, 3) //다형성을 활용하여 아래의 코드로 바꿀 수 있음
//Parent p = new Child(); 자바의 다형성
var poly: Parent = Child(4, 5) //실제 객체는 child이지만, parent타입으로 저장합니다.
poly.parentFunc()
//poly.childFunc() parent타입이기 때문에 Child가 가지고 있는 해당 기능은 사용하지 못 함. 해결방법 : 다운 캐스팅
/* is로 if문 안에 조건을 작성하면 블럭 내의 레퍼런스 변수는 다운 캐스팅 된다*/
if(poly is Child) {//is 연산자를 사용하여 다운 캐스팅 할 수 있음
poly.childFunc()
}
/* 직접 다운 캐스팅을 하기 위해서는 as 연산자를 사용한다.*/
(poly as Child).childFunc()
}
출력 결과
parent func
4
4
parent func
parent func
4
4
parent func
parent func
오버라이딩 사용 예시
open class Parent2(){
/* 오버라이딩 불가*/
fun parentFun(){
println("from parentFunc")
}
/* 오바라이딩 가능 / 인자 없이 생성*/
open fun overridableParentFunc(){
println("from overridableParentFunc")
}
/* 오바라이딩 가능 / 인자 ㅇ*/
open fun overridableParentFuncWithArg(arg1: Int, arg2: String){
println("from overriableParentFuncWithArg($arg1, $arg2)")
}
}
class Child2 : Parent2(){
/* 재정의 불가. open 키워드를 붙이지 않아 final 메소드로 생성 되었다.*/
/* override fun parentFun(){
}*/
override fun overridableParentFunc() {
println("from overrided overridableParentFunc")
}
override fun overridableParentFuncWithArg(arg1: Int, arg2: String) {
super.overridableParentFuncWithArg(arg1, arg2)
println("from overrided overriableParentFuncWithArg($arg1, $arg2)")
}
}
fun main(){
var p = Parent2()
p.parentFun()
p.overridableParentFunc()
p.overridableParentFuncWithArg(100, "Hello")
//var c = Child2() child2 타입
var c: Parent2 = Child2() //다형성을 이용한 parent2 -> child2 타입이 아니지만 오버라이딩 ㅁㅔ소드가 더 우선이여서 정상적으로 호출 가능
c.parentFun()
c.overridableParentFunc()
c.overridableParentFuncWithArg(200,"World")
}
출력 결과
from parentFunc
from overridableParentFunc
from overriableParentFuncWithArg(100, Hello)
from parentFunc
from overrided overridableParentFunc
from overriableParentFuncWithArg(200, World)
from overrided overriableParentFuncWithArg(200, World)
반응형
'프로그래밍 > Kotlin' 카테고리의 다른 글
[코틀린 / Kotlin] 컬렉션 Set , Map (mutableSetOf() , Pair) (0) | 2022.10.20 |
---|---|
[코틀린 / Kotlin] 컬렉션 _ List (add, remove, removeAt, contains, listOf ...) (0) | 2022.10.20 |
[코틀린 / Kotlin] 데이터 클래스 (0) | 2022.10.20 |
[코틀린 / Kotlin] lazy 와 lateinit 를 활용한 지연 초기화 (0) | 2022.10.20 |
[코틀린 / Kotlin] getter와 setter (0) | 2022.10.20 |