본문 바로가기

Java/Java

(JAVA) The final keyword in Java

상속은 개발자에게 코드를 재사용할 수 있는 환경을 제공하지만 개발자는 특정한 상황에서 상속의 범위를 제한할 필요가 있다.

 

final 키워드는 바로 이러한 기능을 제공한다.


final Class

final을 선언한 클래스는 상속될 수 없다.

(자바의 core library에는 final 클래스로 선언돼 있는 것들이 많다. - ex String)

 

만약 String 클래스를 상속할 수 있다고 가정한다면 스트링 내부의 메서드들을 재정의 할 수 있고 String 클래스의 하위 클래스로 String의 인스턴스를 변경할 수 있다.

String str = new StringChild("test");

 

이러한 결과 String 객체에 대한 연산 결과를 예측할 수 없게 됩니다.

 

만약 final 클래스 인 Parent를 Child 클래스가 상속받는다고 하면

public class Child extends Parent{
	
	public static void main(String[] args) {
		System.out.println("test!");
	}

}

컴파일 오류가 발생한다.

 

 

final 클래스의 객체는 immutable 하지 않다

public class mainTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Parent p = new Parent();
		p.setWeight(30);
		
		System.out.println(p.getWeight());
	}

}

실행 결과

위와 같이 final 클래스로 선언했을지라도 내부 속성(상태)을 변경시킬 수 있다. - 단지 상속만 할 수 없을 뿐

 

 

final 클래스는 다른 어떠한 개발자도 수정할 수 없다.

 

만약 어떠한 클래스를 사용하고 있고 해당 클래스에 대한 정보를 알지 못한다. 하지만 그 클래스 내부의 메서드에는 특정 문제가 존재한다고 가정하자

 

만일 그 클래스가 final 클래스로 선언되어 있다면 우리는 문제가 있는 메서드를 재정의할 수 없으므로 해당 문제를 fix 시킬 수 있다.

한편으로는 우리는 객체지향의 원칙 중 하나인 확장성을 잃어버린다고 말할 수 있다.


final Method

final 메서드- 재정의 될 수 없는 final 메서드

 

우리는 클래스를 생성한 이후에 특정 메서드가 재정의 되면 안 된다고 생각될 때 final 키워드를 사용한다.

 

위의 final class의 경우에는 상속을 금지한다고 하였다. 하지만 특정 경우에 우리는 상속을 허용하지만 특정 메서드에 한해서 재정의를 금하고 싶을 때가 있다.

 

가장 좋은 예시 Thread 클래스

 

Thread 클래스는 상속은 가능하만 Alive 메서드는 final로 선언되어있다.

이 메서드는 Thread 가 Alive 상태인지를 체크하는 메서드이다. 

Alive 메서드가 재정의가 불가능하게 설계된 여러 사지 이유가 있지만 그중 한 가지는 해당 메서드가 native 이기 때문이다.

 

native 코드는 또 다른 언어로 작성되어있고 실행 중인 운영체제와 하드웨어에 따라 다르기 때문입니다.

 

 

만일 몇몇 메서드가 다른 메서드에 의해 호출되는 경우가 있다면, 우리는 해당 메서드를 final로 만드는 것을 고려해야 한다.

 

그렇지 않다면 해당 메서드를 재정의하는 것이 호출한 메서드의 작업에 영향을 끼치고 놀라운 결과를 초래할 수 있다.

 


final Variables

final 변수는 값을 재할당 할 수 없음을 의미한다. 일단 변수가 초기화되면 해당 변수의 값은 바뀌지 않는다.

final 변수는 초기화할 수 없는 것을 볼 수 있다.

 

final 참조 변수 또한 마찬가지이다.

인스턴스를 재할당 할 순 없어도 인스턴스가 가지고 있는 프로퍼티는 변경 가능하다.

public void alterFinalVariable() {
    final int var = 3;
    //var = 5;
    final Foo foo = new Foo();

    //foo = new Foo();
    foo.setHeight(68);
    foo.setHeight(80);
}

References

https://www.baeldung.com/java-final

 

The "final" Keyword in Java | Baeldung

Learn what the final keyword in Java means when applied to classes, methods, and variables.

www.baeldung.com

https://jwdeveloper.tistory.com/157?category=823919

 

(JAVA) Immutable Class

불변 클래스란? 인스턴스의 내부 값을 수정할 수 없는 클래스를 의미한다. 불변 클래스가 가진 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다. ex) bInteger, String 왜 불변 클래스를 사용하..

jwdeveloper.tistory.com