해결된 질문
작성
·
171
·
수정됨
2
안녕하세요. 강의 다시 보기 하다가 질문이 생겨서 글 남깁니다.
@Entity
class Book(
val name: String,
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
) {
}
@Entity
class Book(
name: String,
) {
var name: String = name
private set
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0L
}
코틀린에서 필드를 기본생성자로 하는 방식과 클래스 본문으로 하는 방식으로의 차이가 궁금해서 질문드립니다!
감사합니다
답변 1
1
안녕하세요, 재연님! 😊 질문 주셔서 감사합니다!
우선 결론부터 말씀드리면, "코틀린에서 필드를 기본생성자로 하는 방식과 클래스 본문으로 하는 방식으로의 차이"는 없다고 봐주시면 되겠습니다! 예를 들어
class Person(
val name: String
)
class Person(
name: String
) {
val name = name
}
위 두 코드는 완전히 동일해요!!
다만, 적어주신 예시처럼 추가적인 제어가 있다면 의미론적인 차이가 생길 수 있습니다.
class Person(
var name: String
)
class Person(
name: String
) {
var name = name
private set
}
class Person(
private var _name: String
) {
val name = _name
}
이 코드의 경우 첫 번째 Person
과 두 번째, 세 번째 Person
은 다릅니다! 단순히 name을 클래스 본문에 두었을 뿐 아니라, private set
을 이용한 가시성 변경을 하기도 하고, backing property
를 이용한 가시성 제어를 하기도 했죠!
또한 아래와 같은 경우도 있을 수 있습니다.
class Person(
var name: String
)
class Person() {
var name: String = ""
}
이 경우는 필드를 클래스 본문으로 완전히 내렸습니다. 필드에 기본값이 명확하게 존재하기 때문에 생성자에서 굳이 값을 초기화해줄 필요 없을 때 사용할 수 있어요!
저는 개인적으로 각 경우에 따라 다양한 방법을 사용했습니다!! 👍
가시성 제어를 해줘야 한다 (= setter를 확실하게 막고 싶다!)
private set or backing property 확인
초기값이 확실히 존재한다.
보통 어떠한 데이터의 status는 초기 값이 확실히 있더라고요!
생성자에서도 제거하고, 완전히 클래스 body 안에 넣는다
초기값을 처리해주어야 한다.
가장 단순하게 생성자에서 선언과 초기화를 한 번에 해준다
답변이 도움이 되었으면 좋겠습니다. 감사합니다~ 🙇