[10분 테코톡] 🔪시카의 Java final과 불변 객체
https://www.youtube.com/watch?v=ej-bnXlHk-E
Final
· 한 번만 할당 가능하다는 선언(재할당 X)
· 재할당하려고 하면 컴파일 오류가 발생하여 바로 확인 가능
· 값에 대한 검증X → 로직 구현에 집중
final String name = "Old";
name = "New"; // 컴파일 에러
// final 적용 전
public int addFromTo(int a, int b) {
int sum = 0;
for (int i = a; i <= b; i++) {
sum += i;
}
return sum;
}
// final 적용 후
public int addFromTo(final int a, final int b) {
return addFromOneTo(b) - addFromOneTo(a-1);
}
private int addFromOneTo(final int n) {
return (n * (n + 1)) / 2;
}
사람은 누구나 실수할 수 있다. final을 사용할 경우 버그 발생 가능성이 줄어들고, 발생한다해도 찾는 시점이 빨라지고 코드 품질이 좋아진다.
불변 객체(Immutable Object)
· 불변 객체는 재할당은 가능하지만, 한 번 할당하면 내부 데이터를 변경X
· Ex) String, Integer, Boolean …
· 한 번 생성되면 상태를 수정할 수 없는 객체 → 신뢰할 수 있다.
public final class Money {
private final int money;
private Moneyy(final int money) {
if (money < 0) {
throw new IllegalArgumentException("대출은 받을 수 없습니다.");
}
this.money = money;
}
public static Money of(final int money) {
return new Money(money);
}
public Money plus(final int money) {
return new Money(this.money + money);
}
}
장점
· 객체에 대한 신뢰도가 높아진다.
· 생성자, 접근 메소드에 대한 방어 복사가 필요없다.
· 스레드 동기화 문제 방지
단점
· 객체가 가지는 값마다 새로운 객체가 필요
· 따라서 메모리 누수와 새로운 객체를 계속 생성해야하기 때문에 성능 저하가 발생할 수 있다.
final과 불변 객체를 사용해야 하는 이유
· Thread-Safe 하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 된다.
· 실패 원자적인(Failure Atomic) 메소드를 만들 수 있다.
· Cache나 Map 또는 Set 등의 요소를 활용하기에 더욱 적합하다.
· 부수 효과를 피해 오류 가능성을 최소화할 수 있다.
· 다른 사람이 작성한 함수를 예측가능하며 안전하게 사용할 수 있다.
· 가비지 컬렉션(GC)의 성능을 높일 수 있다.