class
키워드로 정의class Invoice {/*...*/}
class Empty
getter/setter
을 자동으로 만들어 줌get(){..}
, set(){..}
)class Person
을 정의할 때, Java와 Kotlin의 차이. 둘은 같은 클래스를 생성한 것이다.// JAVA
class Person {
private String name;
// 생성자
public Person(String name) {
this.name = name;
}
// getter
public String getName() {
return this.name
}
// setter
public void setName(String name) {
this.name = name;
}
}
// KOTLIN
class Person (var name: String)
보다시피, java는 이 간단한 클래스를 구현하는 데에 18줄이나 코드를 작성해야했지만 코틀린은 한줄로 가능하다. 클래스가 잘 생성되었는지 확인해보면?
val person = Person("홍길동")
println("이름: ${person.name}") // 이름: 홍길동
person.name = "김철수"
println("이름: ${person.name}") // 이름: 김철수
getter / setter 구현을 하지 않아도 내부적으로 자동 생성해주는것을 확인 할 수 있다.
생성자는 두가지 방법으로 가능한데,
class Person constructor(name: String) { /*...*/ }
class Person(name: String) { /*...*/ }
init
블럭 사용class Person (var name: String) {
init {
println("init과 함께 사용")
}
}
val person = Person("홍길동")
println("이름: ${person.name}")
// init과 함께 사용
// 이름: 홍길동
constructor
사용, 생략 불가 class Person {
var children: MutableList<Person> = mutableListOf<Person>();
constructor(parent: Person) {
parent.children.add(this)
}
}
this()
생성자를 이용해 직간접적으로 primary constructor에 위임class Person(val name: String) {
var age: Int = 26
constructor(name: String, age: Int) : this(name) {
this.age = age
}
}
🙋♀️primary constructor, secondary constructor, init블럭이 모두 있을때
- init 블럭은 primary constructor의 일부
- primary constructor는 secondary constructor의 첫 번째 실행문으로 실행
- 따라서 init블럭의 코드는 항상 secondary constructor의 body보다 먼저 실행
inner
키워드 사용// nested class 중첩 클래스
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
val demo = Outer.Nested().foo() // == 2
중첩 클래스에서는 외부 클래스를 참조하지 않기때문에 Outer.Nested().foo()
의 값이 2가 된다.
// inner class 내부 클래스
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1
내부클래스에서는 외부 클래스를 항상 참조하기 때문에 Outer().Inner().foo()
의 값이 1이된다.
sealed
키워드 사용sealed class Person {/*...*/}
open
키워드 사용open
을 붙여야 오버라이드 가능data class User(val name: String, val age: Int)
equals()
, hashCode()
toString()
, ""User(name = John, age = 42)
componentN()
copy()
override
를 반드시 써야 함override
를 씀(자바의 @override
)interface Named {
val name: String
}
interface Person : Named {
val firstName: String
val lastName: String
override val name: String get() = "$firstName $lastName"
}
data class Employee(
// implementing 'name' is not required
override val firstName: String,
override val lastName: String,
val position: Position
) : Person