(1) 기본/보조 생성자 (constructor)
- 기본적인 접근 제어자는 public이다. public으로 사용 할 땐 constructor 키워드 생략 가능하다.
- 멤버 변수로 사용하고자 할 때에는 기본 생성자에서 val 또는 var 키워드를 붙인다.
class MyClass(name: String) // name은 기본적으로 public 형태를 가진다.
class YourClass(val name: String) // name은 YourClass의 멤버 변수
- 보조 생성자를 통해 다양한 형태의 생성자를 만들 수 있다.
- 보조 생성자를 통해 멤버 변수에 값을 할당하기 위해서는 위 기본 생성자와 같이 val, var를 붙일 수 없다.
- 보조 생성자의 매개변수를 직접 클래스의 멤버 변수에 할당해주어야 한다.
class MyClass {
private var age: Int = 0
private var name: String = ""
constructor(age: Int) {
this.age = age
}
constructor(age: Int, name: String) {
this.age = age
this.name = name
}
}
val myClass1 = MyClass(24) // age=24 , name=""
val myClass2 = MyClass(24,"H") // age=24, name="H"
(2) 초기화 블록 (initializer block)
- 기본 생성자는 클래스의 헤드에 들어가므로, 블록 형태로 코드를 포함 할 수 없다.
- 클래스 초기화 시 블록 형태로 초기화 할 수 있는 init {} 을 사용 할 수 있다.
class MyClass(private val name: String) {
init {
println(name)
}
}
val myClass = MyClass("Hun") // Log : Hun
(3) 상속 (Inheritance)
- 상속을 통해 코드의 중복을 제거할 수 있다.
- 부모의 var 타입 멤버변수는 val 타입으로 오버라이딩 가능. 반대는 성립하지 않음.(var = getter, setter 모두 가짐 / val = getter만 가짐)
- 코틀린의 모든 클래스는 특정 클래스를 상속 받지 않으면 암묵적으로 Any를 상속 받는다.
- Any에는 equals() , hashCode(), toString() 3개의 메소드만을 정의하고 있다.
- equals() : 객체 간 동등성을 비교할 때 사용. (같은 객체임을 비교하는 것이 아니라 동일한 값을 가지는 지 비교)
- hashCode() : 객체의 값에 대한 hash code 값을 반환. 같은 값에 대해서는 같은 hash code를 가진다.
- toString() : 객체에 대한 표현을 String으로 변환.
(4) 정적 클래스 (static class)
- 정적 클래스 내 멤버변수, 메소드는 객체를 생성하지 않고 사용 할 수 있다.
- 일반적으로 클래스의 각 객체마다 가지고 있을 필요가 없는 공통된 데이터를 보관한다.
- 코틀린에서는 companion object 키워드를 이용한다.
- 기본 접근 제어자는 public.
- const 키워드를 더해 컴파일 타임에 초기화 되는 상수를 만들 수 있다.
class MyClass() {
companion object {
const val TAG = "myClass" //컴파일 타임에 초기화 되는 상수
fun newInstance(): MyClass = MyClass()
}
}
(5) 인터페이스 (Interface)
- 클래스와 인터페이스의 차이는 인터페이스는 상태를 저장할 수 없다는 점이다.
- 따라서, 인터페이스에서 멤버변수에 값을 할당 할 수 없다. 추상화 되어 있다.
- 상태로써 사용하고자 하면 implementation 받아서 오버라이딩 하여 사용하여야 한다.
- 함수에 대해서는 구현, 추상화 모두 가능하다.
interface MyInterface {
val name: String
val age: Int
// val newAge: Int = 24 (Error)
fun printInfoAbstract()
fun printInfo() {
println("$name / $age")
}
}
참고 : https://sabarada.tistory.com/169?category=941106
https://kotlinlang.org/docs/classes.html
https://kotlinlang.org/docs/inheritance.html
https://kotlinlang.org/docs/interfaces.html
'Kotlin' 카테고리의 다른 글
[Android, Kotlin] 제네릭의 in, out 키워드는 무엇일까? (9) | 2021.11.28 |
---|---|
[Kotlin] object / companion object를 통한 Java의 static 키워드 대체 (0) | 2021.11.20 |
[Kotlin] Type, String, Array 새로 배운 학습 정리 (0) | 2021.11.12 |
[Android, Kotlin] apply, also, let, with, run의 사용 - 범위 지정 함수 (0) | 2021.11.11 |
[Kotlin] 상속 변경자 open, abstract 차이 (0) | 2021.11.11 |