Spring을 공부하며 정리했던 https://ghcode.tistory.com/168
[Spring] DI(의존성 주입) 3가지 방법
DI(의존성 주입, 종속객체 주입)은 IoC(제어의 역행)의 테크닉 중 하나로 하나의 객체가 다른 객체한테 의존성을 주입하는 테크닉으로, 의존성이란 곧 서비스로 사용가능한 객체를 뜻한다. 테스트
ghcode.tistory.com
이 글에서 의존성 주입방식 중 생성자 주입을 권장하는 이유 중 하나가 final keyword를 사용가능하게 해준다는 점이다.
이 이점에 대해서 더욱 자세하게 알아보기 위해서 Final Keyword에 대해서 더 알아보며 의존성 주입의 다른 방법(필드 주입, 수정자 주입에서는 왜 객체에 Final Keyword를 붙일 수 없는지 알아볼 것이다.
- Final이란?
일단 final이라는 말을 들으면 최종, 마지막의 느낌이 든다. 그 느낌대로 final 키워드는 변수, 클래스, 메소드에 붙어 한번 초기화되면 다시는 변경할 수 없게 만드는 키워드이다.
그렇다면 한 번 초기화된 변수/클래스/메소드는 누군가의 실수로 인해 변경될 일이 없을 것이다.
public class TestMain {
public static void main(String[] args) {
final int a = 1;
a = 2;
}
}
final 키워드와 함께 초기화된 변수 a는 다른 값으로 초기화 될 수 없다. 따라서 위 코드를 실행하면
이러한 에러가 뜨게 된다.
클래스의 경우에도 final 키워드를 붙인 클래스는 더 이상 상속할 수 없다. 위와 같이 상속을 시도하면 final class는 상속할 수 없다는 에러가 발생한다.
마찬가지로 메소드의 경우도 overriding을 시도하면 final method는 override할 수 없다는 에러가 발생하는 것을 확인할 수 있다.
그렇다면 이제 생성자 주입에서 final 키워드가 가능한 이유와 필드 주입과 수정자 주입에서 final 키워드가 불가능한 이유를 알아보자.
- 생성자 주입
생성자 주입의 코드를 보면 final 변수를 선언하고, @Autowired annotation을 붙인 생성자 안에서 최초로 초기화가 이루어지고 있다. 문제없이 초기화가 이루어진다는 것을 알 수 있고, 한번 초기화된 변수는 더 이상 변경이 불가능해서 안정적이다.
- 필드 주입
필드 주입의 코드를 보면 초기화되지 않은 final 변수로 인해서 에러가 발생하는 것을 알 수 있다.
- 수정자 주입
수정자 주입의 경우도 마찬가지로 초기화되지 않아서 오류가 발생하고, Setter 내에서도 할당할 수 없다는 에러가 뜨는 것을 알 수 있다.
'공부 > Java' 카테고리의 다른 글
[JAVA] Java의 컴파일 과정 및 메모리 구조 (0) | 2022.02.19 |
---|---|
[Eclipse] JDK 버전 변경 후 기존 프로젝트 오류 발생 시 해결 방법 (1) | 2021.12.07 |
[Java] Throws 구문 (0) | 2021.12.06 |