코틀린은 객체지향 언어이기 때문에 클래스와 상속을 지원한다. 객체지향에 대해 간단하게 설명하자면, 프로그램은 코드가 줄줄히 써져있는 것이 아니라, 자신의 역할을 수행하는 객체라는 것들이 상호작용 하는 것이라는 관점이다.
코틀린이 깔려지 있지 않더라도 Ktolin 플레이그라운드에서 따라해볼 수 있다.
클래스는 객체 지향 설계의 가장 중요한 개념인 객체를 만들어내기 위한 틀이다. 객체의 상태(속성)와 행동(메서드)를 정의한다.
속성은 객체의 상태를 나타내는 고정되거나 변할 수 있는 값들이다.
메서드는 클래스 내부에 구현된 함수로 항상 객체를 통해서만 호출 할 수 있다.
fun main() {
class Student (val name: String, val classRoom: Int) {
fun retrieve() {
println("Nam is $name, class room is $classRoom")
}
}
val minSu = Student("MinSu",5)
val dongGook = Student("dongGook",3)
minSu.retrieve()
dongGook.retrieve()
}

class Student (val name: String, val classRoom: Int) { 에서 정의된 name, classRoom 과 같은 것들이 속성, 아랫중의 fun retrieve() {로 정의된 함수가 메서드이다.
그리고 val minSu = Student("MinSu",5)와 같이 이미 만들어진 클래스를 기반으로 만들어 낸 객체들을 인스턴트라고 한다.
minSu라는 인스턴스는 Student라는 클래스를 기반으로 생성되었기 때문에 Student의 메서드인 retrieve()를 사용할 수 있다. 함수처럼 그냥 불러올 수 는 없고 객체명.메서드명()으로 호출해야한다.
자식 클래스가 부모 클래스의 특성을 물려받는 것이다.
fun main() {
open class Student (val name: String, val classRoom: Int) {
fun retrieve() {
println("Nam is $name, class room is $classRoom")
}
}
class Graduate (name: String, classRoom: Int) : Student(name, classRoom)
val minSu = Graduate("MinSu",5)
val dongGook = Graduate("dongGook",3)
minSu.retrieve()
dongGook.retrieve()
}

위와같이 Graduate라는 클래스는 Student라는 클래스를 상속했기 때문에 retrieve()라는 메서드를 정의하지 않고도 사용할 수 있다.
자식 클래스가 부모클래스에서 상속 받은 속성이나 메서드를 재정의 하는 것이다.
fun main() {
open class Student (val name: String, val classRoom: Int) {
open fun retrieve() {
println("Name is $name, class room is $classRoom")
}
}
class Graduate (name: String, classRoom: Int) : Student(name, classRoom) {
override fun retrieve() {
println("$name 은 졸업하기 전에 $classRoom 반 이었습니다.")
}
}
val minSu = Student("MinSu",5)
val dongGook = Graduate("dongGook",3)
minSu.retrieve()
dongGook.retrieve()
}

Graduate는 상속을 받았기 때문에 retrieve를 정의 할 필요가 없지만 부모 클래스와 다르게 사용하고 싶기 때문에 Override하였다.
오버라이드를 하여도 부모클래스에서는 변화가 없고, 자식 클래스에서만 변화가 있음을 알 수 있다.