
아래와 같이 클래스를 만들었을 경우
1. Override, 다형성
open class Country ( var fullName: String, var capital: String, var language: String) {
fun printFullName () {
println("fullName: $fullName")
}
fun printCapital () {
println("capital: $capital")
}
fun printLanguage () {
println("language: $language")
}
open fun singNationalAnthem () {
println("singNationalAnthem")
}
}
class Korea (fullName: String, capital: String, language: String) : Country( fullName, capital, language) {
override fun singNationalAnthem () {
super.singNationalAnthem()
println("sing Korea")
}
}
class USA ( fullName: String, capital: String, language: String) : Country( fullName, capital, language) {
override fun singNationalAnthem () {
super.singNationalAnthem()
println("sing USA")
}
}
- Country 라는 클래스를 Korea, USA 라는 클래스에서 상속.
- 자식 클래스에서는 super.METHOD 를 통해 부모 클래스의 메서드를 호출 할 수 있다.
- +커스터마이징이 가능하다 (== 다형성)
fun main (args: Array<String>) {
val korea = Korea("대한민국", "서울", "한국어")
korea.singNationalAnthem()
val usa = USA("미국", "워싱턴", "영어")
usa.singNationalAnthem()
}
/** output
singNationalAnthem
sing Korea
singNationalAnthem
sing USA
*/
이렇게 출력이 된다.
Java의 문법과는 또 달라서 [ Java(public) / Kotlin(open) ] 신기하다.
뭔가 public 공공의 라는 뜻보다는 open 이 더 직관적이기도 하고
2. Abstract. 추상매서드
다음으로 추상메서드에 대해 메모한다.
//추상클래스
abstract class Game {
//일반메서드
fun startGame () {
println("Game Start")
}
//추상메서드
abstract fun printGameName ()
}
class OverWatch: Game() {
//추상메서드는 하위 클래스에서 반드시 구현해야함
override fun printGameName() {
println("This game is OverWatch.")
}
}
Game이라는 클래스를 만들었다.
Game > 메서드로 printGameName 이라는 메서드를 만들어놓았다.
: 추상메서드는 반드시!!! 오버라이딩 한 메서드에서 만들어야한다.
fun main (args: Array<String>) {
val overwatch = OverWatch() //새로운 인스턴스 생성
overwatch.startGame()
overwatch.printGameName()
}
새로운 인스턴스 overWatch 를 생성.
해당 클래스에 선언된 메서드를 실행하였다.
printGameName 메서드는 추상메서드로 선언(abstract)
예전에는 이게 무슨소린지 전혀 이해를 못했었는데, 다시 보니 또 바로 이해되는게 신기하다.