Kotlin, 클래스의 기본

Yebali·2021년 8월 11일
0

약간의_Kotlin

목록 보기
5/19

속성값만 있는 클래스

class Person (var name: String, val birthYear: Int)

fun main() {
	var a = Person("박보영", 1990)
    
    println("안녕하세요. ${a.birthYear}년생 ${a.name}입니다")
}

내부 매서드 없이 속성값만 가지는 클래스는 위에서 처럼 선언 될 수 있다.
하지만 대부분의 클래스는 매서드를 함께 가지고 있다.

일반적인 클래스

class Person (var name: String, val birthYear: Int) {
    fun introduce() {
        println("안녕하세요. ${birthYear}년생 ${name}입니다")
    }
}

fun main() {
    var a = Person("박보영", 1990)
		
    a.introduce()
}

매서드는 클래스의 {} 내부에 위치하고, 함수를 선언 해주는 것과 동일하게 만들어 준다.

클래스의 생성자

'class Person (var name: String, val birthYear: Int)' 부분에서
'(var name: String, val birthYear: Int)' 부분이 생성자를 정의하는 부분이다.
클래스의 속성을 선언함과 동시에 생성자를 선언하는 방법이다.

기본 생성자

Kotlin에서는 'init'이라는 특수한 함수를 클래스 내부에 정의해서 생성자를 통해 인스턴스가 만들어 질 때 일정한 동작을 할 수 있도록 지원한다.

class Person (var name: String, val birthYear: Int) {
    init {
        println("안녕하세요. ${this.birthYear}년생 ${this.name}입니다")
    }
    
    fun introduce() {
        println("안녕 날 소개하지.")
    }
}

fun main() {
    var a = Person("박보영", 1990)
		
    a.introduce()
}

보조 생성자

기본 생성자외의 보조 생성자는 아래와 같이 만들 수 있다.
중요한 점은 보조 생성자를 만들 때에는 반드시 기본 생성자를 호출하여 속성들을 초기화해주어야 한다.
방법은 보조 생성자 뒤에 ': this(속성1, 속성2, ...)' 을 사용하면 된다.

class Person (var name: String, val birthYear: Int) {
    // 기본 생성자
    init {
        println("안녕하세요. ${this.birthYear}년생 ${this.name}입니다")
    }
    // 보조 생성자
    constructor(name:String) : this(name, 1997) {
     	println("보조 생성자가 사용되었습니다.")   
    }
    
    fun introduce() {
        println("안녕 날 소개하지.")
    }
}

fun main() {
    var a = Person("박보영") // 보조 생성자를 사용해서 인스턴스 생성
		
    a.introduce()
}

클래스의 상속

Kotlin은 기본적으로 클래스의 상속이 막혀있다.
클래스를 상속하기 위해서는 'open' 키워드를 사용해야한다

// 상속을 위해 'open' 키워드 사용
open class Animal(var name:String, var age:Int, var type:String) {
    fun introduce() {
        println("타입:${type}, 이름:${name}, 나이:${age}")
    }
}

class Dog (name:String, age:Int) : Animal (name, age, "dog") {
    fun bark() {
        println("멍멍")
    }
}

class Cat (name:String, age:Int) : Animal (name, age, "cat") {
 	fun meow() {
        println("야옹")
    }   
}

fun main() {
    var a = Dog("별이", 5)
    var b = Cat("냥이", 7)
    
    a.introduce()	
    a.bark()
    
    b.introduce()
    b.meow()
}

수퍼 클래스의 속성을 서브클래스에서 다시 선언 할 수 없기 때문에 Cat에는 'var'이나 'val' 키워드를 사용하지 않는다.
서브 클래스로 인스턴스를 생성할 때에는 반드시 수퍼 클래스의 생성자를 호출해주어야 한다.

class Cat (name:String, age:Int) : Animal (name, age, "cat")

profile
머리에 다 안들어가서 글로 적는 중

0개의 댓글