자바 final 키워드

Choizz·2023년 3월 6일
0

final

이번 포스팅은 자바에서 final 키워드에 대해 포스팅하려고 합니다.
스프링 프로젝트를 하면 DI를 할 때나 static 키워드를 선언할 때, 변하지 않는다는 개념으로 사용하는데, 사용하면서도 계속 무슨 의미인지 헷갈리는 느낌이 있어 공부할 겸 포스팅해보려고 합니다.


클래스에서 final 선언

  • 클래스에 final을 선언하면 상속을 해 줄 수 없습니다..
  • String, StringBuilder, StringBuffer 등에서 사용되는데 이 클래스를 상속받아 클래스의 기본 속성을 변경하는 것을 막기 위해 사용됩니다.

메서드에서 final 선언

  • 메서드에서 final을 선언하면 오버라이딩을 할 수 없게 됩니다.
  • 이것 역시, 메서드를 변경하는 것을 막기 위함입니다.

변수에서 final 선언

  • 변수에서 final을 선언하는 경우 더 이상 변수를 바꿀 수 없다는 것을 의미합니다.
  • 또한, 변수에 final이 선언되면, 변수 선언과 함께 값을 지정해야 합니다. 그렇지 않으면 컴파일 에러가 납니다.

클래스에서 인스턴스 변수에 final 선언

  • 클래스 인스턴스에 final을 넣으면 그 변수는 값이 정의가 되거나, 생성자를 이용해 초기화되어야 합니다.
  • DI를 할 때, final 키워드를 넣으면 오류를 컴파일 시점에 미리 방지할 수도 있어 권장됩니다.
public class Final {
	
    private static final String FINAL = "final";
	private final int age;

	public Final(int age) {
		this.age = age;
	}
}

클래스 변수를 선언시 final 선언

  • 클래스 변수는 보통 전역적으로 사용되기 때문에 final로 선언하여 바꿀수 없게 합니다.
public class Final {
	
    private static final String FINAL = "final";
    
    public void test() {
		FINAL = "바꿀 수 있나요?";
	}

}
  • 바꾸려고 시도시 컴파일 오류가 나게 됩니다.

매개 변수나 지역 변수에를 final 선언

  • 매개 변수나 지역 변수를 final로 선언하는 경우 반드시 선언할 때, 초기화할 필요가 없습니다.
  • 왜냐하면, 매개 변수는 이미 초기화된 변수가 넘어오는 것이고,
  • 지역 변수는 {}내에서만 사용하므로 다른 곳에서 변경할 일이 없기 때문입니다.
  • 그렇다면 아래 코드처럼 변경이 가능할까요??
public class Final {

	public void test(final int parameter) {
		final String a;
		a = "안 바뀜";
		a = "바뀌나요?";

		parameter = 2;
	}
}
  • 바뀌지 않습니다. final 키워드를 사용했기 때문이죠!(주황색 물결 표시는 무시하셔도 됩니다.)

참조 변수를 final 선언

  • 바로 코드를 확인해 봅시다.
  • 먼저 인스턴스 변수인 person에 final을 선언했고, 초기화도 진행했습니다. 즉, 참조 변수에 final 선언을 한 것입니다.
  • 그렇다면, 1), 2), 3) 중 컴파일 오류가 나는 것은 무엇일까요??
public class Final {
	private final Person person = new Person();

	public void test() {
		// 1) 
        person = new Person();
		// 2)
        person.age = 1;
		// 3)
        person.name = "이름";
	}

	static class Person {
		String name;
		int age;
	}
}

class Person {
	String name;
	int age;
}
  • 1)은 final이 붙은 person 인스턴스는 변하지 않기 때문에 컴파일 오류가 날 것입니다.
  • 2)는 person 객체의 인스턴스 변수들입니다. 이 변수들은 final 선언이 되지 않았기 때문에 새로운 값을 할당 가능합니다.
  • 3) 역시 마찬가지 입니다.

즉, person 자체에는 fianl이 붙어 새로운 참조 값을 선언할 수 없지만, person에 속해 있는 인스턴스들은 final이 선언되지 않았기 때문에 변경이 가능합니다.


Reference

profile
집중

0개의 댓글