프로그래밍 언어/JAVA

JAVA 입문 - final 예약어

개발 초보 2022. 5. 25. 18:44

지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - 템플릿 메서드 응용하기

 

지난 글에서 템플릿 메서드를 만들면서 final 예약어를 사용했었다. 예전에 작성한 상수와 리터럴에서도 사용한 기억이 있다. 이는 마지막으로 정한 것이니 더 이상 수정할 수 없다는 뜻으로, JAVA 프로그램에서는 변수, 메서드, 클래스에 사용된다.

final 메서드는 지난 글인 템플릿 메서드에서 배웠으니 이번 글에서는 final 변수와 클래스에 대해 공부하자. 

 

상수를 의미하는 final 변수

상수는 위에 걸어둔 링크의 글에 나오는 설명처럼 변치 않는 수이다. 전에 배운 내용이니 간단한 예제로만 확인해보자.

위 사진은 두 변수 int num과 final int NUM을 선언했다. 변수 이름은 대소문자를 구변하기에 두 변수는 다른 변수다. 상수를 선언할 때는 일반 변수와 구별하기 위해 대문자로 쓰는 경우가 많다. 9행처럼 num으로 선언한 변수에는 다른 값을 대입할 수 있지만 10행처럼 상수로 선언한 NUM에는 다른 값을 대입할 수 없기에 오류가 난다.

 

여러 자바 파일에서 공유하는 상수 값 정의하기

하나의 자바 파일에서만 사용하는 상수 값은 해당 파일 안에서 정의해서 사용할 수 있다. 하지만 미래의 내가, 혹은 우리가 프로젝트를 하다보면 여러 파일에서 똑같이 공유해야 하는 상수 값도 있다고 한다. 예로 최솟값(MIN)이나 최댓값(MA X)이나, 전체에서 공통으로 적용하는 과목 코드 값 등이 있겠다. 이런 값을 파일마다 선언한다면 코드가 중복될 뿐 아니라 값이 변하거나 추가될 때 그 값을 사용하는 모든 파일을 수정해야 한다. 하여 자바로 프로젝트를 진행할 때 여러 파일에서 공유해야 하는 상수 값은 한 파일에 모아 public static final로 선언하여 사용하면 좋다고 한다. 잘 새겨두자.

Define.java 파일을 하나 만들고 프로그램에서 사용할 상수 값들을 선언했다. 상수를 모두 public 예약어로 선언했으니 이들 값은 외부에서도 사용 가능하고 모든 상수를 static으로 선언했으니 인스턴스를 생성하는 것과 관계 없이 클래스 이름으로 참조할 수 있다.

 

이제 상수를 사용하는 예제를 보자.

출력 결과

 

상속할 수 없는 final 클래스

클래스를 final로 선언하면 상속할 수 없다. 상속을 하면 변수나 메서드를 재정의할 수 있는데, 그러면 원래 클래스가 가지고 있는 기능에 오류가 생길 수 있다. 따라서 보안과 관련 있거나 기반 클래스가 변하면 안 되는 경우에 클래스를 final로 선언한다. JDK에서 제공하는 클래스 중에도 final로 선언한 클래스가 있다고 한다. 대표적으로 문자열을 나타내는 String이나 정수 값을 나타내는 Integer 클래스가 있다한다. 이러한 클래스가 상속되면 클래스를 만들 때 의도한 바와 다르게 사용될 수 있기에 final 클래스로 선언한다.

 

프로그램을 잘 구현하는 또 다른 방법

지난 글에서 게임 예제 Player 클래스를 시작으로 클래스를 순서대로 구현했었다. Player 클래스를 만들고 PlayerLevel 클래스를 만든 뒤 마지막에 각 레벨 클래스를 만들었다. 이번에는 거꾸로 진행해보자. 패키지나 프로젝트를 새로 만들고 가장 먼저 최종 실행 파일 MainBoard.java부터 만드는 것이다.

그러면 이처럼 많은 오류 메시지가 나올거다. 이제 오류 메시지를 없애도록 코드를 수정하며 MainBoard.java가 제대로 실행될 수 있도록 프로그램을 구현해보자. 이런 연습을 하다 보면 단순히 따라하는게 아니라 이미 학습한 코드를 이해하며 자기만의 코드를 만들 수 있다고 한다. 실제로 테스트 코드를 먼저 개발하는 개발 방법론을 테스트 주도 개발(Test Driven Development; TDD)이라고 한다. 

 

참고 서적: 자바 프로그래밍 입문 - 박은종