[Java]자바 #23 final 키워드(클래스, 메소드)

Final

- 클래스, 변수, 메소드 선언시에 사용할 수 있다.

- final 키워드는 해당 선언이 최종상태이고 결코 수정할 수 없음을 의미한다.

- 클래스, 변수, 메소드에 따라 의미가 달라진다.

-> 클래스 : 상속할 수 없는 클래스, extends 키워드로 다른 클래스를 상속할 수 없다.

-> 메소드 : 오버라이딩을 할수 없다. 부모클래스에서 선언된 final 키워드가 붙은 메소드는 자식클래스에서 오버라이딩(재정의)을 할 수 없다.

-> 변수 : 초기값 초기화를 하면 더이상 값을 수정할 수 없다.


final 변수

- 값을 한번 할당하면 다시는 변경할 수 없음.

- 상수에 가까운 변수.


ex)

int a = 10;         // 일반변수

final int b = 20;  // 권장함

final int c;         // 비권장


System.out.println(a);

System.out.println(b);

System.out.println(b++);   //The final local variable b cannot be assigned. It must be blank and not using a compound assignment 라는 메시지가 나온다.

System.out.println(a+b);



final 클래스와 final메소드


final 클래스

- 더이상 상속할 수 없는 마지막세대 클래스

- 특정 클래스를 설계할 때는 미래에 생겨날 자식클래스를 예측하기가 괸장히 힘들다.

- 특정 크래스의 멈버들을 나중에 자식클래스가 물려받을 때 일어날 수 있는 경우의 수를 예측하기가 힘들다.


ex)

final class FinalParent{

public void aaa() {

System.out.println("aaa");

}

}


=> 이렇게 final로 선언된 클래스가 있다면!!


class Child extends FinalParent{

=> The type FinalChild cannot subclass the final class FinalParent

이런 메시지가 나타나면서 상속할 수 없다고 한다.

@Override

public void aaa() {

System.out.println("AAA");

}

}


final 메소드

- 자식 클래스들이 재정의를 못하도록 막는 역할

- 메소드 오버라이드 금지

- 이 메소드는 재정의하면 프로그램이 불완전해지기 때문에(안전성)


ex)

class Parent{

public final void aaa() {

System.out.println("aaa");

}

}

=> 그냥 평범한 부모클래스가 있을 때는!!


class Child extends Parent{


@Override

public void aaa() {

   => Cannot override the final method from FinalParent

  이번엔 해당 메소드를 오버라이딩할 수 없다는 메시지를 나타낸다!!

System.out.println("AAA");

}

}


final과 static의 조합


- final 과 static 키워드를 모두 사용한 변수를 상수로써 사용할 수 있다.

- 상수는 언제어디서나 같은위치에 있고(static) 값이 변하지 않는다(final)

- 상수를 선언할때 상수명은 모두 대문자로 표기한다.


ex)

class FinalTest2{

public final static int num =200;    //꼭 아래처럼 대문자로 표기하자

public final static double PI = 3.141592653589793;

}

댓글

Designed by JB FACTORY