코틀린 생성자에 대한 기본적인 고민

이상빈·2022년 1월 21일
0

프로그래밍을 혼자서 공부하다 보니 개념에 빈 곳이 많다.

그러다 보니 간단한 개념을 공부할 때도 혼자서 고민을 하는 경우가 많은데,

그러한 고민 중 하나가 바로

클래스에서 생성자와 필드의 차이점은 무엇일까?

라는 점이다.

이에 대한 고민이 없었을 땐 아래와 같은 클래스를 종종 만들곤 했다.

1. 필드와 메소드를 이용하여 초기화하는 방식

class Person {
	var name: String = ""
	var age: Int = 0

	fun setName(newName: String) {
		this.name = newName
	}
    
	fun setAge(newAge: Int) {
		this.age = newAge
	}
}

위 1번 코드는 생성자를 이용하면 다음과 같이 간략화할 수 있다.

2. 생성자를 이용하여 초기화하는 방식

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

위와 같은 수준에선 필드와 메소드를 이용한 초기화/생성자를 이용한 초기화 보일러플레이트 코드를 제외하고는 별 차이가 없어보인다.

(물론 보일러플레이트를 줄였다는 점에서, 생성자를 이용하는 게 훨씬 좋겠다)

그러나 다음과 같은 클래스를 만들고 싶은 상황이라면 얘기가 달라진다.

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

name 생성자는 외부에서 접근이 불가능하며, 한 번 생성한 이상 바꿀 수 없다.
age 생성자는 외부에서 접근이 불가능하며, 내부 메소드로 접근하지 않는 이상 외부에서 변경할 수 없다.

이런 상황은 1번 방식으로는 구현이 더욱 귀찮아진다.
(가능은 한데, 보일러플레이트가 엄청나게 늘어날 것이다. 게다가 name값 초기화를 2번하는 경우에 이 오류를 컴파일러가 잡아주느냐, 런타임 시 발견하느냐의 차이도 있을 것이다.)

따라서, 필드와 메소드를 이용한 클래스 초기화와 생성자를 이용한 초기화는 사실상 다른 거라고 생각한다.

만약 이외에 제가 생각하지 못했던 부분이나 잘못 알고 있는 부분이 있으면 언제든지 알려주신다면 감사하겠습니다!

profile
발전을 좋아하는 사람

0개의 댓글