Kotlin에서 필드 정의할때 질문드립니다.
안녕하세요. 강의 다시 보기 하다가 질문이 생겨서 글 남깁니다.
@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 안에 넣는다
초기값을 처리해주어야 한다.
가장 단순하게 생성자에서 선언과 초기화를 한 번에 해준다
답변이 도움이 되었으면 좋겠습니다. 감사합니다~ 🙇
안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?
0
69
2
실행이 안되네요
0
67
2
프론트 영역 보는법
0
52
2
companion object
0
79
2
Custom 레프직토리 형식
0
60
2
Querydsl 도입
0
68
2
fetch join DISTINCT 중복제거
1
84
2
표준 예외와 커스텀 예외 사용 전략 질문
0
92
3
이 질문이 왜 없는지 이해가 안 되지만 문제 인식 및 해결 방법 남깁니다.
1
177
2
테스트를 위한 코드
1
105
2
프로젝트 실행 에러
0
152
2
PDF 문서에 오타가 있어서 알려드립니다.
1
102
1
enum질문
1
86
1
테스트 후 AfterEach 함수에서 나오는 쿼리
0
136
2
테스트 fixture
1
211
2
./gradlew test 실행시 인식할수 없다고 뜹니다.
0
141
1
test 코드 실행시 경고가 발생합니다.
0
141
1
13강 User Kotlin 변환중
2
170
3
'추가 - 코프링과 플러그인' 강의 7:46 allopen 관련 질문
2
174
1
-
0
141
2
4:28 build.gradle 수정 시 kotlin-reflect관련 implementation 추가 해야할까요?
0
313
3
junit import 불가
0
276
3
테스트 코드와 관련하여 질문이 있습니다.
1
219
1
hibernate가 select를 두번 하는 이유
0
240
1





