본문 바로가기
공부/Java

[Java] Final Keyword

by 맴썰 2022. 2. 22.

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 내에서도 할당할 수 없다는 에러가 뜨는 것을 알 수 있다.