정리하지 않고 들은 강의 내용을 듣고 바로 적은 것입니다.
글이 난잡해도 이해 부탁드립니다.
코틀린에서 클래스를 다루는 방법
오른쪽은 Java의 코드이며 왼쪽은 완전히 동일한 Kotlin의 코드입니다.
코틀린에서는 필드만 만들면 getter와 setter를 자동으로 만들어줍니다.
해당 기능이 매우 편리하다 생각될 수도 있으나, 이후 Spring JPA과 사용할 때 많은 불편함을 주는데,
대부분의 경우 Setter는 사용하지 못하게 막아두거나, 애당초 만들지 않습니다.
그러나 코틀린의 경우 자동으로 setter를 만들어주기 때문에 이를 하나하나 private setter로 바꾸어 주어야 합니다.
그리고 코틀린에서 constructor라는 지시어는 생략 가능합니다.
즉 다음과 같이 작성 가능합니다.
constructor 생략
또한 생성자를 만들어 줄 때 필드(프로퍼티)를 선언할 수 있습니다.
다음과 같습니다.
생성자 내부에서 프로퍼티 선언
다음과 같이 사용합니다.
코틀린에서 자바 코드를 가져다 쓰는 경우
해당 경우에도 .을 통해 getter와 setter를 가져다 쓸 수 있습니다.
record 클래스인 경우에도 가능합니다.
그러나 record 클래스가 아닌 일반 클래스에서 getAge를 age처럼 사용한다면, 코틀린에서 .을 통해 접근할 수 없습니다.
생성자에 검증 로직 추가
코틀린에서 생성자에서의 검증 로직을 추가하고 싶다면 init 블럭을 사용할 수 있습니다.
여러개의 생성자
클래스에 선언되는 생성자를 주생성자라 하고, 이외 선언되는 생성자를 부생성자라 합니다.
위 사진과 같이 constructor()를 사용하여 여러개의 생성자를 지정해 줄 수 있습니다.
부생성자의 특징
부 생성자들은 호출의 마지막에 반드시 this를 통해 주 생성자를 호출해야 합니다.
또한 부생성자는 Body를 가질 수 있습니다.
생성자의 호출은 주 생성자로부터 호출한 부 생성자까지 역순으로 호출됩니다.
즉 다음과 같은 코드에서
class Person(
val name: String,
var age: Int)
{
init {
println("주 생성자")
if (age <= 0) {
throw IllegalArgumentException("나이는 ${age}일 수 없습니다")
}
}
constructor(name: String) : this(name, 1){
println("부 생성자 1")
}
constructor(age: Int) : this("홍길동", age){
println("부 생성자 2")
}
constructor() : this("홍길동") {
println("부 생성자 3")
}
}
fun main() {
Person();
}
실행 결과는 다음과 같습니다.
부 생성자보다는 Default Parameter
그러나 어쩔 수 없이 부 생성자를 써야 하는 경우라면, 부 생성자 대신 정적 팩터리 메서드를 사용하는 것이 좋습니다.
정적 팩터리 메서드가 무엇인지 모른다면 다음 글을 참고해주세요
https://ttl-blog.tistory.com/358?category=916864
[Effective Java] 아이템 1 - 생성자 대신 정적 팩터리 메서드를 고려하라
클래스의 인스턴스를 얻는(생성하는) 전통적인 수단은 public 생성자이다. 그러나 클래스는 생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있다. 정적 팩터리 메서드는 객체
ttl-blog.tistory.com
정적 팩터리 메서드 사용 예시
함수로 작성하기 Vs 프로퍼티처럼 작성하기
위와 같은 두 가지 경우, 강의에서는 객체의 속성이라면 custom getter를 통한 프로퍼티 형식을, 그렇지 않다면 함수를 사용하는 것이 좋아 보인다는 말씀을 하셨는데, 이는 강사님의 개인적인 의견이며, 앞으로 계속 써보면서 저에게 괜찮을 방법을 찾아야 할 것 같습니다.
Custom Getter, Setter 사용하기
Getter와 Setter를 정의하는 경우에는 get, set 키워드를 사용합니다.
프로퍼티의 한 칸 아래 들여쓰기를 사용하여 정의하는 것이 일반적입니다.
Custom Setter의 사용
접근 제어자를 private로 하는 Setter를 만들어 보겠습니다.
위와 같이 Setter를 사용 불가능하게 막는 방법은 간단하지만, 실제로 값을 변경하거나, 혹은 값을 가져오는 경우 조금 복잡합니다.
Custom Getter/Setter의 잘못된 사용
Getter를 예시로 보겠습니다.
위와 같은 코드를 작성하면 무한루프가 발생합니다.
이는 코틀린에 getter를 호출하는 방식 때문에 발생하는 현상입니다.
코틀린에서는 person.age를 하면 getter가 호출됩니다.
이때 getter의 구현을 보면 age를 사용하는데, 이때도 age에서 getter를 호출하기에 무한 루프가 발생합니다.
이때 Backing Field를 사용합니다.
Backing Field
코틀린과 JPA
'모각코 > 2022 하계 모각코 : 꿀단지' 카테고리의 다른 글
[모각코] 2022 하계 모각코 2회차 결과 (0) | 2022.07.10 |
---|---|
[모각코] 2022 하계 모각코 2회차 목표 (0) | 2022.07.10 |
[모각코] 2022 하계 모각코 1회차 결과 (0) | 2022.07.04 |
[모각코] 2022 하계 모각코 1회차 목표 (0) | 2022.07.03 |
[모각코] 2022 하계 모각코 활동계획 (0) | 2022.06.23 |