반응형

1. 클래스

코틀린에서 클래스를 작성하는 방법

class Person(val name: String, val age: Int) {
	fun hello() {
		println("hello I am ${name} and I am ${age} years old")
	}
}

코틀린의 클래스를 작성하는 방법은 자바와 유사하지만 생성자 부분에 있어서 조금 차이가 있다

자바에서 생성자는 클래스 명으로된 생성자를 클래스 내부에 작성하는 반면, 코틀린의 경우 클래스를 선언하는 부분에서 생성자의 파라미터를 지정하는 식으로 작성한다

1) 생성자

코틀린의 생성자는 주생성자와 부생성자로 나뉜다

  • 주생성자 : 클래스를 선언하는 부분에 작성된 것
  • 부생성자 : construct 키워드를 통해 작성된 것, 여러개 가질 수 있음
(1)
class Person(val name: String, val age: Int) {} // 주생성자

(2)
class Person {
    var name: String
    var age: Int

    constructor(name: String, age: Int) { // 부생성자 1
        this.name = name
        this.age = age
    }
    
    constructor(name: String) { // 부생성자 2
	    this.name = name
	    this.age = 10
}

(2)의 경우는 문제가 생길 수 있다 따라서 위처럼하기 보다는 프로퍼티에 기본 값을 할당하는 것이 더 낫다

주생성자를 통해 객체가 생성될 때 자바의 경우 생성자에 로직을 넣어서 처리할 수 있다

코틀린에서는 주생성자에 로직을 넣을 수 없는데, 이를 위해 init이라는 초기화 블록이 존재한다

 

이를 통해 객체 생성 시점에 초기화 로직을 작성 할 수 있다

class Person(val name: String, var age: Int) {

    init { // 초기화 블록
        println("Person is created: $name")
    }
}

 

2) getter, setter

코틀린에서는 기본적으로 프로퍼티에 대해 자동으로 getter, setter 가 생성 된다

(val의 경우 getter만 생성)

 

이렇게 생성된 getter와 setter를 아래와 같이 커스터마이징할 수 있다

var name: String
    get() {
        println("called get")
        return field
    }
    set(value) {
        println("called set")
        field = value
    }

 

field라고하는 식별자를 통해 프로퍼티의 값을 할당하거나 읽는 것을 볼 수 있다

field는 백킹 필드를 참조하기 위한 식별자로 프로퍼티의 실제 저장 공간을 의미한다

 

그렇다면 주생성자를 통해 만들어진 필드에 대해서는 어떻게 getter와 setter를 커스터마이징 할 수 있을까

class Person(private var _name: String) {
		var name: String
				get() {
					println("called get")
					return _name
				}
				set(value) {
					println("called set")
					_name = value
				}
}

 

이처럼 계산 프로퍼티를 이용하여 원래 백킹 프로퍼티를 숨기고, get, set을 커스텀하여 사용할 수 있다

 

백킹 프로퍼티:

  • 실제 데이터를 저장하는 공간이 존재
  • 값 변경 가능(var의 경우)
  • 데이터를 필드에서 직접 읽음

계산 프로퍼티:

  • 데이터를 저장하는 공간 없음
  • 데이터 접근 시 계산 프로퍼티의 getter를 거쳐서 접근

백킹 프로퍼티와 계산 프로퍼티의 차이는 크게 보면 데이터를 실제로 저장하는지 안하는지로 구분할 수 있다

반응형

'공부' 카테고리의 다른 글

Kotlin 기본 문법 정리 - object  (2) 2025.07.23
Kotlin 기본 문법 정리 - 상속  (0) 2025.07.21
Kotlin 기본 문법 정리 - 함수  (0) 2025.07.18
Kotlin 기본 문법 정리 - 타입과 변수  (0) 2025.07.17
Gradle 개념과 역할  (0) 2025.07.15

+ Recent posts