Java

final vs finally vs finalize

Tommy__Kim 2023. 4. 18. 11:18

위 세가지 단어들은 서로 다르게 사용되는 단어이지만 복습 차원에서 한번 짚고 넘어가려고 합니다.

 

Final 

final은 '마지막', '변경 될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 적용 될 수 있습니다. 

변수에 사용하면 값을 변경 할 수 없는 상수가 되고, 메서드에 사용하면 오버라이딩을 할 수 없고,

클래스에 사용하면 자손 클래스를 정의 할 수 없습니다.

final class Unique{						// 조상이 될 수 없는 클래스
	final int countRatio = 0.25;		// 변경 불가능한 멤버 변수
    
    final int getDiscount(int price){	// 오버라이딩 할 수 없는 메서드
    	int defaultRatio = 0.1;			// 변경 불가능한 지역 변수
    	...
    }
}

 

보통 Java를 사용해 개발을 하다보면 생성자에서 많이 사용하는 것을 확인 할 수 있습니다.

 

class StudentController{
	private final StudentService studentService;
    
	public StudentController(StudentServiceImpl studentServiceImpl){
	    this.studentService = studentServiceImpl
    }
}

클래스 내에서 매개 변수를 갖는 생성자을 선언 해 인스턴스를 생성할 때

final이 붙은 멤버 변수를 초기화하는데 필요한 값을 생성자의 매개변수로부터 제공받는 방식입니다.

이러한 방식을 사용하면 클래스에 선언된 final 이 붙은 멤버 변수가 다른 값을 갖도록 하는 것이 가능합니다.

 

Finally

finally의 경우 예외 발생 여부와 상관없이 실행되어야 하는 코드를 포함시킬 목적으로 사용됩니다. 

try-catch문에서 사용됩니다.

예외가 발생하지 않는 경우는 try - finally 구문이 실행되며, 

예외가 발생하는 경우에는 try - catch - finally 구문이 실행됩니다. 

 

@Slf4j
class DoLog{
	private final StudentService studentService;
    
    try{
    	studentService.join();
    } catch (Exception e){
    	log.info("예외 발생!!", e)
    } finally{
		... /* 마지막으로 실행 시킬 로직들 추가 */
        log.info("로직 종료")
    }

}

Finalize

Object에 있는 메서드로써, 가비지 콜렉터(GC)가 객체에 대한 참조가 더이상 없다고 판단 될 때 GC에 의해 호출되는 메서드입니다.

하지만 finallization 메커니즘은 성능 문제, 교착 상태 및 정지로 이어질 수 있는 본질적인 문제가 있습니다.

이 외에도 리소스 누수 가능성, 순서 지정 불가 등등 많은 문제가 존재합니다. 

이에 따라서 Java9 부터는  Deperecated 되었습니다.

finalize

'Java' 카테고리의 다른 글

Javadoc 이란?  (0) 2023.04.22
Java EE 와 Java SE 뭐가 다른가요?  (0) 2023.04.21
==와 equals()는 어떠한 차이점을 가질까?  (0) 2023.04.21
좋은 객체 지향 설계의 5가지 원칙  (0) 2023.04.05
다형성 (Polymorphism)  (0) 2023.04.05