- final 마지막(최종)이라는 의미를 부여하는 키워드이며, 변수와 메서드, 클래스에 사용 가능하다.
사용처에 따른 설명
1. final 변수
- final이 변수에 붙게되면 변수 값 변경 금지 => 저장되어 있는 값만 사용 가능 = 상수
- 자신의 클래스 내에서도 값 변경 불가
- final이 붙은 변수 선언 시 일반 변수와 구분하기 위해 대문자로 이름 작성(관례)
1-1) 변수에 final 키워드를 사용할 경우
class FinalVariable{
final int NUM1 = 10; //final 상수
int num2 = 20;
public void setNum(){
NUM1 = 99; (x)
num2 = 100; (o)
}
}
1-2) final 상수 초기화 방법에 따른 차이점
class FinalVariable2{
//1) 상수 선언 시 직접 값을 초기화할 경우
final int NUM1 = 10;
//2) 상수 선언 시 값을 초기화하지 않을 경우
final int NUM2; //컴파일 에러 발생
=> 값을 초기화하지 않은 상수를 blank final 상수라고 하며 생성자에서 초기화를 할 수 있다.
public FinalVariable2(int NUM2){
this.NUM2 = NUM2;
}
}
2. final 메서드
- final이 메서드에 붙게되면 변경이 불가능해지므로 메서드에서는 재정의가 불가한, 오버라이딩이 금지된다.
단, 상속받은 메서드를 그대로 사용하는 것은 가능함!
class FinalMethod{
public void normalMethod(){}
public final void finalMethod(){}
}
class SubFinalMethod extends FinalMethod{
@Override
public void normalMethod(){ //가능
finalMethod(); //호출은 가능
}
public void finalMethod(){} //불가능
}
3. final 클래스
- 클래스 변경 금지 = 상속 금지
단, 인스턴스 생성을 통해 클래스를 사용하는 것은 가능
대표적인 final 클래스는 String 형
final class FinalClass{
int num = 10;
public void method(){
System.out.println("FinalClass에서 정의한 메서드!");
}
}
//final 클래스를 상속받아 정의할 경우 오류 발생!
//상속은 불가능하나 클래스 내부에서 포함 관계(has-a)로 사용 가능하다!
class SubFinalClass{
FinalClass fc = new FinalClass();
public void method(){
fc.method();
fc.num=99;
}
}
상수
원주율의 값이나 지구의 둘레와 같이 항상 같은 값을 갖는 불변의 값, 주로 변수 앞에 static final 키워드를 붙여서 표현한다.
=> static 특징 : 클래스가 로딩되는 시점에 메모리에 로딩되는 놈, 모든 인스턴스가 하나의 값을 공유
=> final 특징 : 변수값 변경 안되고, 오버라이딩 안되고, 상속 안됨
이 둘의 특징을 합친게 static final
final과 마찬가지로 주로 대문자로 정의하며 단어의 구분은 _로 하는게 관례임
//static final로 클래스
class Car2{
private String company;
private String modelName;
private int colorCode;
private String gearType;
//이 클래스에서 잘못된 값이 입력될 확률을 줄이기 위해
//사용되는 값을 클래스 내부에서 만들고 외부에서 가져다 사용할 수 있음
//=>외부에서 객체 생성 없이도 접근 가능하도록 static 붙히고 값을 함부로 변경할 수 없게 final
public static final String COMPANY_HYUNDAI = "HYUNDAI";
public static final String COMPANY_KIA = "KIA";
public static final String MODEL_NAME_SONATA = "쏘나타";
public static final int COLOR_CODE_CREAM_WHITE = 0xFFFF99;
public static final int COLOR_CODE_PERFECT_BLACK = 0x000000;
public static final String GEAR_TYPE_MANUAL = "수동";
public static final String GEAR_TYPE_AUTO = "자동";
//private 했으니 getter/setter로 접근
}
이제 인스턴스 생성해서 관리
Car2 car2 = new Car2();
//변수에 값 저장하는 등의 사용 시 클래스명.상수명으로 접근한다.
car2.setCompany(Car2.COMPANY_HYUNDAI);
//car2 인스턴스에 저장된 제조사가 현대자동차인지 판별
if(car.getCompany().equals(Car2.COMPANY_HYUNDAI){
syso...현대자동차네요
}
상수에 접근할 때는 클래스명. 으로 시작
int형으로 값을 리턴해야 하는데 수치가 아닌 다른 조건 아래의 int라면
상수를 통해서 값을 리턴해야함