코틀린은 아무것도 안쓰면 기본 final (오버라이드 불가)
open 키워드가 있어야 상속 가능해짐
자식이 오버라이드할 메소드 또한 open 키워드 붙여줘야한다!
extends 키워드 -> : 으로 변경
상속하는 클래스명 옆에 반드시 생성자 호출문 '( )' 명시되어야한다!!
오버라이드할 메소드에 override라고 명시해줘야함 써줘야함
부모의 메소드 기능 받는 super 키워드 써서 쓴다
package com.bsj0420.ex01kotlinhello
fun main() {
//1.코틀린의 상속
var obj:Second = Second()
obj.a= 500
obj.b= 200
obj.show()
}
//First를 상속하는 클래스
//상속 문법이 extends => : 으로 바뀜
//상속하는 클래스명 옆에 반드시 생성자 호출문 명시되어야한다!!
class Second : First(){
// First의 멤버 a, show() 보유한 상태
var b:Int = 20
//상속받은 show메소드 기능 개선 - override
//코틀린은 반드시 override라고 명시해줘야함 써줘야함
//또한 부모에 오버라이메소드에고 open 햐줘야함 (기본이 final이라서)
override fun show(){
super.show()
println("b : $b")
}
}
//상속해줄 클래스
//코틀린은 아무것도 안쓰면 기본 final임 - 오버라이드 불가
//open 키워드가 있어야 상속 가능해짐
open class First {
var a:Int = 10
//open 해줘야 자식에서 오버라이딩 할 수 있다
open fun show(){
println("a : $a")
}
}
다운 캐스팅 형변환 키워드 : as
자바에서는 형변환 하려는 클래스 앞에 (자식 클래스) 를 붙여줌
package com.bsj0420.ex01kotlinhello
fun main() {
//2.업캐스팅, 다운캐스팅
//부모자식 관계일 때
var f:First = Second() //up casting
//찾을 수는 있지만 Second()의 것은 쓸수 없음
f.show() //실제 참조하는 객체의 show가 호출 : 다형성
println()
//b의 값을 쓰고 싶으면
//var s:Second = f // error - down casting
var s:Second = f as Second // 형변환 연산자 as
s.b = 500
s.a = 600
s.show()
}
//First를 상속하는 클래스
//상속 문법이 extends => : 으로 바뀜
//상속하는 클래스명 옆에 반드시 생성자 호출문 명시되어야한다!!
class Second : First(){
// First의 멤버 a, show() 보유한 상태
var b:Int = 20
//상속받은 show메소드 기능 개선 - override
//코틀린은 반드시 override라고 명시해줘야함 써줘야함
//또한 부모에 오버라이메소드에고 open 햐줘야함 (기본이 final이라서)
override fun show(){
super.show()
println("b : $b")
}
}
//상속해줄 클래스
//코틀린은 아무것도 안쓰면 기본 final임 - 오버라이드 불가
//open 키워드가 있어야 상속 가능해짐
open class First {
var a:Int = 10
//open 해줘야 자식에서 오버라이딩 할 수 있다
open fun show(){
println("a : $a")
}
}
package com.bsj0420.ex01kotlinhello
open class Person constructor(var name:String, var age:Int){
//멤버변수 만들면서 매게변수까지 만든 것
//상속과 오버라이드를 위해 open
init {
println("create Person instance")
}
open fun show(){
println("name : $name age : $age")
}
}
package com.bsj0420.ex01kotlinhello
//이미 상속해 주는 Person 클래스에 name, age 프로터티가 존재함
//따라서 주 생성자에서 또 name,age 트로퍼티 만들면 안된다 (-> var 붙이면 오버라이드 되어버림)
//그러니 그냥 매개변수로 name과 age 받기
open class Student constructor(name:String, age:Int, var major:String) : Person(name, age){
//name:String, age:Int 는 이미 상속받은 것에 있으니 부모걸 받으면 됨 (매개변수로)
// major 만 매개변수이면서 멤버변수로 만들어 주면됨
init {
println("ceate Student instance")
}
//override 키워드가 붙은 메소드는 기본 open메소드임!!
//따라서 추가로 open 쓰지 않는다
override fun show() {
//super.show
println("name: $name age: $age major:$major")
}
}
package com.bsj0420.ex01kotlinhello
//보조 생성자를 이용하여 상속 받기
//보조 생성자를 이용할 때 부모 클래스의 주 생성자를 호출() 을 쓰지 않는다
class Professor : Person {
//교수 만의 고유 멤버면수 만들기
var subject:String? = null //nullabel 변수로 만들어주기
//보조 생성자 만들기
//보조 생성자를 사용하면 부모 클래스의 생성자를 이곳에서 호출한다 : super()
constructor(name:String, age:Int, subject:String):super(name, age) {
this.subject = subject
println("create Prefessor instance")
}
override fun show() {
//super.show()
println("name : $name age: $age subject: $subject")
}
}
package com.bsj0420.ex01kotlinhello
// 주 생성자의 constructor 키워드 생략
class AlbaStudent(name:String, age:Int, major:String, var task:String):Student(name,age,major) {
init {
println("create AlbaStident instance")
}
override fun show() {
//super.show()
println("name: $name age: $age major:$major task: $task")
}
}
package com.bsj0420.ex01kotlinhello
fun main() {
//상속 마무리 연습
//일반, 교수, 학생, 근로학생의 멤버를 상속 받아 객체 생성
var p = Person("sam",26)
p.show()
println()
var s = Student("robin",23,"java")
s.show()
// create Person instance
// ceate Student instance
// name: robin age: 23 major:java
//상속받은 Person의 생성자도 호출되고 있음을 보자
println()
var ps = Professor("kim", 48, "mobile optimization")
ps.show()
println()
var abStu = AlbaStudent("lee",27,"ios","pc Management")
abStu.show()
}