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