본문 바로가기
IT 개인 공부/Java

[Java] final 키워드

by Libi 2021. 7. 7.
반응형

Java에서는 상수(변경할 수 없는 값)를 표현하기 위해서 final 키워드를 사용한다. final 키워드는 변수, 메서드, 클래스에 사용할 수 있는데 각각 조금씩 의미가 다르다.

이들의 차이에 대해서 한 번 알아보도록 하자.

final 변수

흔히 MOD, INF, MAXSIZE 등 변하지 않고 정해진 값(상수)을 표현하기 위해 사용하는 방식으로 변수 앞에 final 키워드를 붙여서 사용한다.

상수를 표현할 때는 자바 명명 관습(Java Naming Conventions)에 따라서 대문자를 사용하고 두 단어 이상 사용될 시 단어 사이에 언더바(_)를 사용하여 표현해 준다.

public class Main {

	final int MOD = 10009;

	public static void main(String[] args) {
		final int MAX_SIZE = 100;
	}
}

 

만약 final로 선언한 상수를 변경하려고 하면 에러가 발생하게 된다.

public class Main {

	final int MOD = 10009;

	public static void main(String[] args) {
		final int MAX_SIZE = 100;
        //MAX_SIZE = 10; error
	}
}

또한, 메서드 내에 선언한 final 변수는 사용하기 전에만 초기화를 해주면 돼지만, 클래스 멤버 변수로 선언한다면 반드시 선언과 동시에 초기화를 해줘야 한다.

public class Main {

	//final int MOD; error
	final int MOD = 10009;

	public static void main(String[] args) {

		final int MAX_SIZE;
		MAX_SIZE = 100;
		//do Something with MAX_SIZE
	}
}

 

초기화해주는 방법은 선언과 동시에 초기화, 초기화 블록, 생성자 등을 이용해서 초기화할 수 있다.

public class Main {

	final int MOD = 10009; //1. 선언과 동시에 초기화
	
	{
		MOD = 10009; //2. 초기화 블록
	}
	
	public Main() {
		MOD = 10009; //3. 생성자
	}

	public static void main(String[] args) {
         //do Something	
	}
}

 

static 멤버 변수도 final을 사용하여 프로그램 전체에서 사용할 수 있는 상수로 선언할 수 있다. 이 또한 마찬가지로 멤버 변수로 선언되기 때문에 반드시 초기화를 해줘야 한다.

public class Main {

	final static int MOD = 10009; //1. 선언과 동시에 초기화

	static {
		MOD = 10009; //2. 초기화 블록
	}

	public static void main(String[] args) {
		//do Something
	}
}

 

final 메서드

final 메서드는 해당 클래스를 상속받는 자식 클래스에서 이 메서드를 오버라이드(Override)할 수 없도록 해주는 기능이다.

다음과 같이 A를 상속받는 B 클래스에서 print() 메서드를 오버라이딩하려고 하지만 A의 print() 메서드가 final로 선언되어 있기 때문에 오버라이딩할 수 없다.

class A {
	
	public final void print() {
		System.out.println(getClass());
	}
}

class B extends A {
	
    //error : final 키워드로 인해서 오버라이딩으로 재정의할 수 없음
	@Override
	public void print() {
		System.out.println(getClass());
	}
}

 

final 클래스

final 클래스는 어떤 클래스도 final로 선언한 클래스를 상속할 수 없도록 해주는 기능이다.

final class A {
	
	public void print() {
		System.out.println(getClass());
	}
}

//error : 상속받을 A 클래스가 final 클래스이기 때문에 상속받을 수 없음
class B extends A {}

 

즉, final 키워드의 기능을 정리하면 다음과 같다.

  • fianl 변수 : 해당 변수의 값을 변경할 수 없도록 해줌
  • final 메서드 : 해당 메서드를 오버라이딩할 수 없도록 해줌
  • final 클래스 : 해당 클래스를 상속할 수 없도록 해줌
반응형

댓글