목차
<final 예약어>
템플릿 메서드를 만들면서 'final 예약어'를 사용했다. 'final'은 '마지막'이라는 의미로 마지막으로 정했으니 더 이상 수정은 불가능하다는 뜻으로 사용된다.
자바에서 'final예약어'는 변수, 메서드, 클래스에서 사용할 수 있다.
<상수, final 변수>
상수는 '변하지 않는 수'이다.
package finalex;
public class Constant {
int num = 10;
final int NUM = 100; //상수 선언
public static void main(String[] args) {
Constant cons = new Constant();
cons.num = 50;
cons.NUM = 200; //상수에 값을 대입해 오류 발생
System.out.println(cons.num);
System.out.println(cons.NUM);
}
}
- 변수 두 개(int num, final int NUM)를 선언했다. 상수를 선언할 때는 일반 변수와 구별하기 위해 대문자로 쓰는 경우가 많다.
- num변수에는 다른 값을 대입할 수 있지만, flinal로 선언한 NUM변수에는 다른 값을 대입할 수 없다.
여러 자바 파일에서 공유하는 상수 값 정의
하나의 자바 파일에서만 사용하는 상수값은 해당 파일 안에서 정의해서 사용할 수 있다. 그런데 우리가 프로젝트를 하다 보면 여러 파일에서 똑같이 공유해야 하는 상수 값도 있다.
예를 들어 최솟값(MIN), 최댓값(MAX), 전체에서 공통으로 적용하는 과목 코드 값 등이 있겠다.
이런 값을 파일마다 선언한다면 코드가 중복될 뿐만 아니라 값이 변하거나 추가될 때 그 값을 사용하는 파일을 모두 수정해야 한다.
따라서 자바로 프로젝트를 진행할 때 여러 파일에서 공유해야 하는 상수 값은 한 파일에 모아 public static final로 선언하여 사용하면 좋다.
package finalex;
public class Define {
public static final int MIN = 1;
public static final int MAX = 99999;
public static final int ENG = 1001;
public static final int MATH = 2001;
public static final double PI = 3.14;
public static final String GOOD_MORNING = "Good Morning!";
}
Define.java파일을 하나 만들고 프로그램에서 사용할 상수 값들을 선언했다. 최솟값, 최댓값, 과목 코드들과 원주율, 문자열 등을 상수로 선언했다. 상수를 모두 public예약어로 선언했으므로 이 값들은 외부에서도 사용할 수 있다.
그리고 모든 상수를 static으로 선언해서 인스턴스를 생성하는 것과 관계없이 클래스 이름으로 참조할 수 있다.
그럼 상수를 사용하는 예제 코드를 보자.
package finalex;
public class UsingDefine {
public static void main(String[] args) {
System.out.println(Define.GOOD_MORNING);
System.out.println("최솟값은 " + Define.MIN);
System.out.println("최댓값은 " + Define.MAX);
System.out.println("수학 과목 코드는 " + Define.MATH);
System.out.println("영어 과목 코드는 " + Define.ENG);
}// static으로 선언되어 인스턴스를 생성하지 않고 클래스 이름으로 참조 가능
}
<상속X, final 클래스>
클래스를 final로 선언하면 상속할 수 없다.
상속을 하면 변수나 메서드를 재정의할 수 있는데, 그러면 원래 클래스가 가지고 있는 기능에 오류가 생길 수 있다.
따라서 보안과 관련되어 있거나, 기반 클래스가 변하면 안되는 경우에 클래스를 final로 선언한다.
JDK에서 제공하는 클래스 중에서도 final로 선언한 클래스가 있다. 대표적으로 문자열을 나타내는 String이나 정수 값을 나타내는 Intager클래스를 예로 들 수 있다. 이러한 클래스가 상속되면 클래스를 만들 때 의도한 바와 ㄱ다ㅡㄹ게 사용될 수 있으므로 final로 선언한다.
<프로그램을 잘 구현하는 또 다른 방법>
지금까지 프로그램을 짤 때 클래스를 순서대로 구현해 나갔다.(Player클래스 -> PlayerLevel클래스 -> 각 레벨 클래스들 순으로) 그러면 이제는 거꾸로 진행해 보도록 해보자.
패키지나 프로젝트를 새로 만들고 맨 먼저 최종 실행파일 MainBoard.java부터 만드는 것이다.
package test;
public class MainBoard {
public static void main(String[] args) {
Player player = new Player(); //오류 발생
player.play(1);
AdvencedLevel aLevel = new AdvencedLevel(); //오류 발생
player.upgradeLevel(aLevel);
player.play(2);
SuperLevel sLevel = new SuperLevel(); //오류 발생
player.upgradeLevel(sLevel);
player.play(3);
}
}
여러 오류 메시지가 나오는데, 이제 오류 메시지를 없앨 수 있도록 코드를 수정하며 프로그램을 구현하는 것이다.
[Do it! 자바 프로그래밍 입문] 도서로 공부하며 정리한 글입니다.