티스토리 뷰
본 포스팅의 내용은 [깡샘의 코틀린 프로그래밍]을 공부하고 작성자가 생각을 정리하기 위해서 작성한 글이므로 더욱 자세한 내용을 알고 싶으신 분은 [깡샘의 코틀린 프로그래밍]을 강력 추천합니다!!
1. 클래스 선언 및 생성
1. 1. 클래스 선언
class MyClass { }
class MyClass // 중괄호 생략 가능
- 클래스를 선언할 때 클래스 몸체가 없다면 중괄호는 생략.
- 일반적으로 파일 안에 파일명과 같은 클래스를 정의해 사용하지만 강제 규칙이 아니며 코틀린 파일에 파일명과 같은 이름의 클래스가 없어도 상관 없다.
1. 2. 객체 생성
- 객체 생성은 클래스를 이용하기 위해 메모리를 할당하는 작업이며, 할당된 메모리를 객체명으로 참조해서 이용하는 개념이다.
2. 생성자
코틀린에서는 생성자를 주 생성자와 보조 생성자로 구분한다.
2. 1. 주 생성자
- 주 생성자는 하나의 클래스에 하나만 정의할 수 있다.
- 클래스 선언 부분에 작성
- 하나의 클래스에 하나의 주 생성자만 정의 가능
- 꼭 작성해야 하는 건 아니며 보조 생성자가 있다면 작성하지 않을 수 있음
- 개발자가 별도로 선언한 생성자가 없다면 컴파일러가 자동으로 매개변수가 없는 주 생성자를 추가한다.
- 만약 주 생성자에 별도의 수식 구문(어노테이션, 접근 제한자)이 없다면 constructor 예약어 생략 가능하다.
매개변수가 있는 주 생성자
class User1 constructor(name: String, age: Int){ }
class User2(name: String, age: Int = 0){ }
// ...
val user1 = User1() // 에러
val user2 = User1("weekyear", 29)
val user2 = User1("yumyum", 30)
- 생성자의 매개변수에도 기본값을 명시할 수 있다.
생성자 초기화 블록 init
- 주 생성자는 클래스 헤더에 명시하다 보니 실행문을 포함할 수 없다는 문제가 있다. 즉, 주 생성자는 { }를 가질 수 없다. 그래서 주 생성자의 실행 영역을 클래스 몸체에 init 예약어로 따로 명시하는 기법을 사용한다.
class User3(name: String, age: Int) {
init {
println("i am init..")
}
}
생성자 매개변수 값 이용
- 생성자의 매개변수를 이용할 때 제약이 있다. 클래스의 초기화 블록이나 프로퍼티에서는 접근할 수 있지만, 클래스에 정의된 멤버 함수에서는 사용할 수 없다.
생성자의 매개변수를 함수에서 사용하는 법
- 생성자의 매개변수를 클래스 프로퍼티에 대입하고 함수에서는 프로퍼티로 이용
class User4(name: String, age: Int) {
val name = name
fun sayHello() {
println("hello $name")
}
}
- 생성자 내에서 val, var을 이용해 매개변수를 선언하는 방법
class User5(val name: String, var age: Int) {
fun sayHello() {
println("hello $name")
}
}
- 생성자의 매개변수명과 프로퍼티명을 같게 선언할 수는 있지만 매개변수는 init 초기화 블록에서 이용하고 프로퍼티는 클래스 내의 함수에서 사용 가능하다.
2.2. 보조 생성자
- 보조 생성자는 클래스 몸체에 constructor 예약어로 선언한다.
- 말그대로 보조이기 때문에 주 생성자가 있다면 따로 선언하지 않아도 된다.
주 생성자 vs. 보조 생성자
- 생성자를 하나만 선언해서 이용해도 된다면 주 생성자만 정의해서 이용하는 것이 좋다.
- 코드 가독성 등의 이유로 굳이 클래스 몸체에 별도의 보조 생성자를 선언할 필요는 없다.
- 가능하다면 생성자를 클래스 몸체와 분리하여 클래스 헤더에 선언하는 것이 더 읽기가 좋기 때문이다.
생성자 오버로딩
- 자바와 거의 동일
보조 생성자와 초기화 블록
- init으로 정의한 초기화 블록은 주 생성자든 보조 생성자든 객체 생성 때 가장 먼저 실행된다.
보조 생성자의 매개변수 사용
- 보조 생성자 내의 매개변수에는 아예 val, var로 선언할 수 없게 금지되어 있다.
2. 3. this()에 의한 생성자 연결
- 만약 주 생성자를 선언했다면 보조 생성자는 무조건 주 생성자를 함께 호출해줘야 한다. 즉, 보조 생성자에 주 생성자 호출 구문이 있어야 한다.
- 같은 클래스 내에 선언된 다른 생성자를 호출할 때도 this() 구문을 이용한다.
- 주 생성자를 선언했다면 객체 생성 시 어떠한 경우라도 반드시 주 생성자는 실행되어야 한다.
- this() 구문은 생성자의 실행 영역인 { }에 작성하지 않고 생성자 선언 영역에 작성한다.
class User1(name: String) {
init {
println("init block... $name")
}
constructor(name: String, age: Int): this(name) {
println("constructor ... $name .. $age")
}
}
자바 vs 코틀린
- 코틀린에서는 파일 내에 파일명과 같은 public 클래스를 강제하지 않는다.
- 파일은 코드를 관리하기 위한 수단일 뿐이고 프로그램의 구성요소인 클래스와는 관련이 없다.
- 코틀린에는 new 연산자가 없다.
- 코틀린의 생성자는 자바와 작성 방법 및 동작 원리가 많이 다르다
- constructor 예약어를 이용해 생성자 선언
- 주 생성자와 보조 생성자로 구분
- 생성자의 초기화 로직을 위해 init { } 구문을 사용
- 주 생성자의 매개변수에 val, var를 추가하면 클래스의 프로퍼티가 되어 함수에서도 사용 가능
반응형
'Programming > 코틀린(Kotlin)' 카테고리의 다른 글
[코틀린] 09. 상속 (feat. 깡샘) (0) | 2021.04.12 |
---|---|
[코틀린] 08. 프로퍼티 (feat. 깡샘) (0) | 2021.04.11 |
[코틀린] 06. 흐름 제어 구문과 연산자 (feat. 깡샘) (0) | 2021.04.05 |
[코틀린] 05. 데이터 타입 (feat. 깡샘) (2) | 2021.04.04 |
[코틀린] 04. 변수와 함수 (feat. 깡샘) (0) | 2021.03.31 |
댓글