6. 클래스 - Class
목차
1. 클래스 - Class
- 클래스는 class 키워드로 선언
- 클래스 이름, 해더(매개변수, 기본 생성자 등), 바디(중괄호) 로 구성됨
//키워드 //이름 //헤더
class TestClass(data: Int) {
//바디
}
- 해더와 바디는 옵션이고, 바디가 없으면 중괄호 { } 생략 가능
class TestClass
2. 기본생성자 (Primary Constructor)
- 클래스별로 1개만 가질 수 있음.
- 클래스 해더의 일부
- 클래스 이름 뒤에 작성
- constructor 키워드를 사용
class TestClass constructor(name: String) {
}
- 어노테이션이나 접근지정자가 없을 때는, constructor 키워드 생략 가능
class TestClass(name: String) {
}
- 어노테이션이나 접근지정자가 있는경우 constructor 가 필요함
class TestClass public @inject constructor(name: String) { ... }
2-1. 기본생성자 - init
- 기본생성자는 코드를 가질 수 없음
- 초기화는 초기화블록 안에서 작성해야 함
- 초기화 블록은 init 키워드로 작성
- 기본 생성자의 파라미터는 init블록 안에서 사용이 가능함
class TestClass(name: String) {
init {
println("name is $name")
}
}
2-2. 기본생성자 - 프로퍼티
- 기본생성자의 파라미터는 프로퍼티 초기화 선언도 가능
- 프로피티 선언 및 초기화는 기본생성자에서 간결한 구문으로 사용 가능
fun main(args: Array<String>){
val obj = TestClass()
obj.name = "Test"
println("obj : ${obj.name}")
println("obj : ${obj.fullName}")
val obj2 = TestClass2("test2")
println("obj2 : ${obj2.fullName}")
}
class TestClass() {
var name: String = ""
val fullName: String
get() {return this.name.uppercase()}
}
class TestClass2(name: String) { // name이라는 것을 파라미터에 넣어 프로퍼티화 시켰다. 간결한구문
val fullName = name.uppercase()
}
/*
obj : Test
obj : TEST
obj2 : TEST2
*/
class TestClass3(name: String, age: Int) { // 여러개가능
}
3. 보조생성자 (Secondary Constructor)
- 클래스 별로 여러 개를 가질 수 있음
- constructor 키워드로 선언
class TestClass {
constructor(member: Member) {
member.add(this)
}
}
- 클래스가 기본생성자를 가지고 있다면, 각각의 보조생성자들은 기본생성자를 직접 or 간접 적으로 위임해주여야 한다.
- this 키워드를 이용한다.
class Member(val name: String) { // 기본생성자
//직접적 : 기본생성자에 위임해준다.
constructor(name:String, person:Person) : this(name) {
// ...
}
// 간접적 : 다른 보조생성자에 위임해준다.
constructor() : this("배재현",Person()) {
// ...
}
}
4. 생성된(generated) 기본생성자
- 자바의 기본생성자라고 생각하면된다.
- 클래스에 기본생성자나 보조생성자를 선언하지 않으면, 생성된 기본생성자가 만들어진다.
- 매개변수가 없다
- public이다
- public이 아니여야한다면 다른 접근제안자를 붙인 기본생성자를 선언해주어야 한다.
class TestClass private constructor() { // TestClass가 기본생성자가 public인걸 막기위해.
}
5. 인스턴스 생성!
- 자바에선 new 키워드를 사용하였지만 코틀린에선 없다.
- 객체를 생성할때 생성자를 일반 함수처럼 호출하면 된다.
val testObj = testClass()
val member = Member("배재현")
6. 기타 - 클래스안에 포함될 수 있는것들..
클래스 맴버로는 아래와같은것들이 포함될 수 있다.
- 생성자
- init블럭
- function
- properties
- 중첩클래스 (이너클래스)
- 오브젝트 선언