코틀린 클래스 선언
class 클래스명(변수) { }코틀린은 자바, C++과는 달리 클래스 선언 부분에서 이름에 괄호를 붙여 생성자를 만들 수 있다.
자바는 멤버변수를 field라고 하지만 코틀린 프로퍼티라는 용어를 사용한다.
자바는 생성자를 꼭 정의해야 하지만 코틀린은 생략이 가능하다.
코틀린에는 주 생성자와(primary constructor)와 부생성자가(secondary constructor)가 존재한다.
주 생성자는 class 선언과 함께 선언하고, 부 생성자는 추가적인 생성자가 필요할 때 사용한다.
생성자를 정의하지 않으면 기본으로 인자가 없는 생성자를 만들어 준다.
부모의 생성자는 super(), 클래스 내 생성자중 다른 생성자는 this()로 호출이 가능하다.
fun main() { var a = Person("박보영", 1990) // 코틀린은 new 키워드 없이 인스턴스를 생성한다. var b = Person("전영경",1997) var c = Person("차은우") var d = Person("홍길동")
//println("안녕하세요, ${a.birthYear}년생 ${a.name} 입니다.") }
class Person (var name:String, val birthYear:Int) { // var name:String, val birthYear:Int // 프로퍼티 선언 및 초기화는 기본 생성자에서 간결한 구분으로 사용 가능
// 초기화 init { // init 안에서는 자바처럼 [this.클래스변수= 매개변수]를 얼마든지 할 수 있다.
println("안녕하세요, ${this.birthYear}년생 ${this.name}입니다.") }
// 보조 생성자 : constructor 키워드로 선언하고 클래스 body에 구현한다. // 클래스 별로 여러 개를 가질 수 있다. constructor(name: String) : this(name,1997) } |
기본 생성자
- 기본 생성자에 어노테이션 접근지정자 등이 있을 경우 constructor 키워드가 필요하다.
class Person public @Inject constructor(name: String) { .... }
클래스 상속
- 코틀린의 최상위 클래스는 Any 이다.
Any는 java.lang.Object 와는 다른 클래스이며, equals(), hasCode(), toString()만 있다.
- 상속 키워드는 콜론(:)이다. Java 의 상속 키워드는 extends
- 코틀린의 클래스와 메소드는 기본적으로 final이다. 즉 기본적으로 상속을 못하게끔 되어 있다.
Java에서는 클래스나 메서드에 final 키워드를 붙여 클래스를 더 이상 상속받지 못하게 하거나,
메서드를 재정의하지 못하게 할 수 있다.
- 클래스의 상속을 허용하려면 클래스 앞에 open 변경자를 붙여야 한다.
open 변경자가 없으면 final 로 자식 클래스에서 override가 불가능하다.
오버라이드를 허용하고 싶은 메소드나 프로퍼티 앞에도 open 변경자를 붙여야 한다.
- 부모 클래스의 메소드를 자식 클래스에서 오버라이드 한 경우, 해당 메소드는 기본적으로 열려있다.
fun main() { var a = Animal("불독", 3,"개") var b = Dog("불독", 5)
a.introduce() b.introduce() b.bark()
var c = Cat("나갈래", 4) c.introduce() c.meow() }
open class Animal(var name:String, var age:Int, var type:String){ open fun introduce(){ // open 이므로 override 가능하다. println("저는 ${type} : ${name}, ${age} 살 입니다.") } }
class Dog(name:String, age:Int) : Animal (name,age,"개"){ // 상위 클래스 함수에 open 키워드를 명시하고, 서브 클래스 함수에 override 를 붙인다. override fun introduce(){ println("타입 : 개, ${name}, ${age} 살 입니다.") }
fun bark(){ println("멍멍멍") } }
class Cat(name: String, age: Int) : Animal(name, age, "고양이"){ fun meow() { println("야옹야옹") } } |