Backend/Java
final
메각이
2025. 6. 5. 14:57
728x90
# 개념
private final JwtUtil jwtUtil;
public MyService(JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
}
- 단 한 번만 할당 가능
- 생성자에서 반드시 초기화해야 함
- setter가 없어도 되고, 불변 객체로 설계 가능
한 번 정해진 값은 절때 바뀌지 않아야, 프로그램이 예측 가능하고 안전하게 돌아감
# 불변하지 않을 때 생기는 문제
1. 값이 어디에서 바뀌었는지 모른다
public class UserService {
private User user;
public void updateName() {
user.setName("철수");
}
public void resetName() {
user.setName("영희");
}
}
위와 같이 user 객체를 여러 곳에서 수정 가능하면?
- 언제, 어떤 이유로 바뀐지 알기어려움
- 버그 발생시에 디버깅이 힘들어짐
2. 멀티스레드 환경에서 충돌 위험
public class SharedData {
public String value;
}
SharedData data = new SharedData();
// 두 스레드가 동시에 value를 수정
Thread t1 = new Thread(() -> data.value = "A");
Thread t2 = new Thread(() -> data.value = "B");
t1.start();
t2.start();
두 스레드가 동시에 value를 바꾸면?
- 어떤 값이 최종으로 남을지 예측 불가함 ( 스레드 종료되는 시점 문제 )
- 실제 서비스에서 이런 상황에 데이터가 꼬여 버그로 이어질 수 있음
# 불변했을 때 장점
이점 | 설명 |
예측 가능 | 값이 바뀌지 않아서 신뢰하고 사용할 수 있음 |
버그 감소 | 실수로 덮어쓰는 일 없음 |
멀티스레드 안전 | 동시에 접근해도 값이 안 바뀌니 문제 없음 |
테스트 쉬움 | 항상 같은 값을 기대할 수 있으니 테스트가 간단함 |
# 사용예시
@RequiredArgsConstructor
public class MyController {
private final MyService myService;
}
- "이 컨트롤러는 무조건 MyService 하나만 주입받고, 절대 중간에 바꾸지 않겠다."
- 여기서 불변이라는 건 MyService객체 자체가 아니라 "주소값"이 불변이라는 의미
728x90