final 키워드

de_sj_awa·2021년 5월 10일
0

1. final 변수

  • 상수라고도 불린다.
  • 변수를 선언과 동시에 초기화하여 이후에 값을 초기화할 수 없다.
  • 오직 get만 가능하다.

다음과 같이 변수를 선언할 때, 클래스 앞에 final 키워드를 입력할 수 있다.

final String hello = "Hello world";

final 키워드가 붙은 변수는 초기화 후 변경할 수 없다. 다음과 같이 변경하려고 하면 컴파일 에러가 발생한다.

final String hello = "Hello world";

hello = "See you around";	// compile error!

if 문에서 초기화

변수를 선언할 때 꼭 초기화가 필요한 것은 아니다. 다음과 같이 if문을 사용하여 조건별로 초기화를 다르게 할 수 있다. 물론, 한번 초기화되면 다른 값으로 설정할 수 없다.

final String hello;

boolean condition = true;
if(condition){
	hello = "Hello world";
}else {
	hello = "See you around";
}

클래스 생성자에서 초기화

클래스의 멤버 변수에 final을 사용할 때는 생성자의 생성자에서 초기화할 수 있다.

class AAA {
	final String hello;
    AAA() {
    	hello = "Hello world";
    }
}

static final 변수 초기화

static final 변수도 다음과 같이 final 변수로 만들고 초기화 할 수 있다. static final 변수도 일반적인 final 변수와 동일한 특징을 갖고 있다.

static final String hello = "hello world";

static final 변수를 선언할 때 초기화하고 싶지 않다면, 다음과 같이 static {} 안에서 초기화 할 수 있다.

static final String hello;

static {
	hello = "hello world";
}

2. final 매개 변수

  • final로 선언된 매개변수는 메소드 내에서 변경이 불가능하다.

매개 변수를 선언할 때 final을 사용할 수 있다. final로 선언된 인자는 메소드 내에서 변경이 불가능하다.

따라서 다음과 같이 final int로 선언한 number는 읽을 수 있지만 number = 10 처럼 값을 변경하려고 하면 컴파일 에러가 발생한다.

public void func(final int number) {
    System.out.println(number);
    
    // number = 10;	compile error!
}

3. final 메소드

  • 오버라이딩(Overriding)이 불가능하다.
  • 상속받은 그대로 사용해야 한다.

클래스의 메소드에도 final 키워드를 붙일 수 있다.

class AAA {
    final String hello = "hello world";
    
    final String getHello(){
    	return hello;
    }
}

final 메소드는 오버라이드 할 수 없다.

예를 들면, 다음과 같이 AAA 클래스를 상속받는 BBB 클래스에서는 getHello()를 재정의할 수 없다. Override하려고 하면 컴파일 에러가 발생한다.

Class BBB extends AAA {
	
    @Override
    String getHello() {	// compile error !
    	return "See you around";
    }
}

4. final 클래스

  • 상속(Inheritance)이 불가능하다.
  • subclass를 만들 수 없다.

클래스를 정의할 때 다음과 같이 final 키워드를 사용할 수 있다.

final class AAA {
	final String hello;
    AAA() {
    	hello = "hello world";
    }
}

class BBB extends AAA() {	// compile error !

변수가 아닌 클래스에 final을 붙이는 것은 어떤 의미일까?

클래스에 final을 붙이면 다른 클래스가 상속할 수 없는 클래스가 된다.
만약 다음과 같이 final 클래스를 상속하려고 하면 컴파일 에러가 발생한다.

5. 주의할 점

final 변수는 초기화 이후 값 변경이 발생하지 않도록 만든다.

다음 코드를 보면 List에 final을 선언하여 list 변수의 변경은 불가능하다. 하지만 list 내부의 변수들은 변경이 가능하여 문자열을 계속 추가할 수 있다.

final List<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");

또한 final 키워드는 해당 키워드를 붙이면 변수의 값을 수정할 수 없다. 변수의 값은 reference type의 경우에는 객체의 주소값이 되고, primitive type의 경우에는 실제 값이 된다.

참고

profile
이것저것 관심많은 개발자.

0개의 댓글