개발놀이터

final 키워드 본문

Java

final 키워드

마늘냄새폴폴 2022. 8. 4. 15:57

자바에서 final 키워드는 상수를 표현하기 위한 예약어이다. '마지막' 이라는 단어 뜻처럼 선언한 그대로 사용하라는 의미이다. 변수, 메서드, 클래스에서 모두 이용되고 있는데 지금부터 각각의 의미에 대해서 살펴보도록 하자.

 

 

final 변수

  • 상수라고도 불린다.
  • 변수를 선언과 동시에 초기화하며 이후에 값을 수정할 수 없다.
  • 오직 get만 가능하다.
public class Fruit {
	public static void main(String[] args) {
    	// 선언 및 초기화
        final int coiunt = 10;
        
        // 수정
        count = 15;	//컴파일 에러
    }
}

 

count 변수를 선언할 때 final 키워드를 추가해 줌으로써 상수임을 나타내고 있다. 그리고 선언과 동시에 초기화를 진행하여 10을 대입해 주었다. 이후에 값을 15로 수정하려고 하면 다음과 같은 에러가 발생한다. count 변수에 값을 넣을 수 없다는 듯이다.

 

 

일반적으로 final 변수는 프로글매 전체에 걸쳐 사용되는 경우가 많아서 위에서처럼 특정 메서드 내부에서 선언하기 보다는 클래스에 static 키워드와 함께 정의되어 사용된다.

 

public class Fruit {
	static final int COUNT = 10;
    static final double PI = 3.14;
    static final String FILE_NAME = "Config";
    
    public static void main(String[] args) {
    	//TODO
    }
}

 

모든 변수 타입에 적용할 수 있으며 폴더 / 파일 이름, DB 칼럼명, 사이즈 등의 정보를 표현하는데 유용하다.

 

소스 상에서 필요할 때마다 "Config"라는 값을 입력해야 한다면 오타가 발생할 확률이 높고, 개발중에 "Setting"이라는 이름으로 변경해야 할 상황이 발생한다면 일일히 수정해야 하는 불편함이 생겨날 것이다. 이러한 상황에서 static final 변수로 선언하여 사용하고 있다면 안전성과 편리함을 동시에 높여줄 수 있다.

 

 

final 메서드

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

 

public class Fruit {
	public String name;
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public final String getName() {
    	return name;
    }
}

public class Banana extends Fruit {
	
    @Override
    public void setname(String name) {
    	this.name = "Fruit Name : " + name;
    }
    
    public String getName() {
    	return name;
    }
    
    public static void main(String[] args) {
    	//TODO
    }
}

 

Fruit 클래스에는 name에 대한 setter / getter가 존재한다. 여기서 집중해야할 부분은 getName() 메서드 앞에 위치한 final키워드 이다. Banana 클래스는 Fruit 클래스를 상속받아 setName() 메서드를 원하는 형태로 오버라이딩 했다.

 

그런데 final 메서드인 getName()은 오버라이딩이 가능할까? 이 때 다음과 같은 에러가 발생한다. 즉, 오버라이딩이 불가능 하다는 뜻이다.

 

 

final 클래스

  • 상속이 불가능하다.
  • subclass를 만들 수 없다.
publc final class Fruit {
	public String name;
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public String getName() {
    	return name;
    }
}

public class Banana extends Fruit {	//컴파일 에러
	public static void main(String[] args) {
    	//TODO
    }
}

이번에는 Fruit 클래스 앞에 final 키워드가 위치해 있다. 앞에서와 같이 Banana 클래스에서 Fruit 클래스를 상속하려고 한다.

 

예상했다시피 Fruit 클래스는 final 클래스이기 때문에, 상속이 불가능하다는 에러가 나타난다.

 

final 메서드와 클래스는 주로 라이브러리 형태의 프로젝트를 작성할 때 사용된다. 라이브러리를 완전히 이해하지 못한 상태에서 재정의 한다면 에러가 발생할 확률이 높아지기 때문에 원천적을 ㅗ수정이 불가능하도록 막아놓은 것이다.

 

자신이 작성한 메서드와 클래스를 다른 사람이 상속 받아서 사용하지 못하게 금지하고 싶을 때 이용하면 좋을 듯 하다.

'Java' 카테고리의 다른 글

ConcurrentMap, ConcurrentHashMap  (0) 2023.02.18
상속과 super 그리고 super()  (0) 2022.09.15
try-with-resouce  (0) 2022.08.04
Optional  (0) 2022.08.04
람다식과 Stream API  (0) 2022.08.04