본문 바로가기

develop/Java

final 키워드, 상수

- 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라면

상수를 통해서 값을 리턴해야함

'develop > Java' 카테고리의 다른 글

객체지향 다형성  (0) 2021.03.15
객체지향 추상화  (0) 2021.03.11
instanceof 연산자,동적바인딩  (0) 2021.03.08
레퍼런스 형변환  (0) 2021.03.08
생성자 super  (0) 2021.03.06