자바(Java) 클래스와 함수의 재정의를 방비하는 final 키워드에 대해 알아보자

 

환경: Eclipse Mars, JDK 1.7

 

final 키워드는 주로 클래스나 함수의 재정의를 막기 위해서 사용됩니다. 또는 로컬변수와 함수에 사용해서 값을 변경하지 못하도록 합니다. final 이 의미하는 단어의 뜻처럼 더 이상 변경하면 안 된다는 것을 명시하는 것입니다. 그래서 상수로 사용할 변수 앞에 final 을 붙이는 것입니다. 프로그래머의 실수를 줄이기 위해 프로그램하는 과정에서 값을 변경하지 못하도록 방지하는 것이죠.

 

¤ final 클래스에 사용

 

먼저 final 을 사용하는 3가지 경우 중 클래스 앞에 붙일 경우 하위 클래스에서 상속을 받지 못합니다. extends 를 이용해서 상속을 하게 되면 아래 그림처럼 Derived cannot 라고 에러가 납니다.

final class Base {
    public  void m1() {}
}

public class Derived extends Base {
    public void m1() {} 
}

 

자바(Java) 클래스와 함수의 재정의를 방비하는 final 키워드에 대해 알아보자

 

¤ final 함수에 사용

 

다음은 함수에 사용하는 경우입니다. 클래스에 final 을 사용하지 않았기 때문에 상속은 가능하지만 함수를 재정의 할 수 없습니다. 상위 클래스에 있는 m2 함수와 m4 함수를 재정의(Overriding) 못하는 것이죠. 재정의를 하게 되면 Cannot override 라고 에러가 납니다.  

class Base {
    public       void m1() {}
    public final void m2() {}

    public static       void m3() {}
    public static final void m4() {}
}

public class Derived extends Base {
    public void m1() {} 
    public void m2() {} 

    public static void m3() {}
    public static void m4() {}
}

자바(Java) 클래스와 함수의 재정의를 방비하는 final 키워드에 대해 알아보자

 

¤ 변수(variable)에 사용 final 사용

 

마지막으로 변수에 사용하는 경우입니다. 위에서도 이야기 했듯이 주로 상수 정의할 때 많이 이용합니다. 초기에 세팅 한 값이 로직이 진행되는 동안 실수로라도 변경되면 안 되는 경우에 적용합니다. 만약 재정의 하려고 하면 cannot be assigned 라고 에러가 나게 됩니다.

class Position {
	
	public final int x = 1;
	public int y = 2;
	public int z = 3;
}

public class Derived {
	Position p = new Position();
	
	public void change(){
		p.x = 10;
		p.y = 10;
		p.z = 10;
	}
}

자바(Java) 클래스와 함수의 재정의를 방비하는 final 키워드에 대해 알아보자

 

¤ final 변수를 사용할 수 있는 경우

 

이번에는 final 을 사용할 수 있는 경우 입니다. 이것은 특별한 경우인데 클래스 객체를 생성할 때 값을 동적으로 세팅하는 것은 가능합니다. final 변수에 값이 비어 있어야겠죠. 이것은 변경되지 말아야 할 회원정보 같은 데이터를 다룰 때 많이 이용합니다. 생성자에서 값을 세팅해 두면 다음 부터 변경할 수 없는 것이죠.

class Position {
	
	public final int x;
	public final int y;
	public final int z;
	
	Position(int x1, int y1, int z1){
		x = x1;
		y = y1;
		z = z1;
	}
}

public class Derived {
	public static void main(String[] args) {
		Position p = new Position(1, 2, 3);
		System.out.println(p.x);
	}
	
}
신고
Posted by 녹두장군