Java의 final, finally, finalize는 전혀 다른 내용이지만, 이름이 비슷하여 헷갈릴 수도 있습니다.
이 글에서는 다음 내용들이 무엇인지, 어떻게 사용하는지 알아보겠습니다.
- final keyword
- finally keyword
- finalize method
1. final 키워드
final 키워드는 클래스, 메소드, 변수, 인자를 선언할 때 함께 사용할 수 있습니다. final를 사용하면, 공통적으로 각각의 상태를 유지하려는 특징을 갖고 있습니다.
final 변수
예를 들어, 다음과 같이 final을 사용하여 변수를 선언할 수 있습니다. final 키워드가 붙은 변수는 한번 초기화되면 그 이후에 변경할 수 없습니다. 만약 변경하려고 하면 컴파일 에러가 발생합니다.
final String hello = "Hello world";
hello = "See you around" // compile error!
final 메소드
다음과 같이 클래스의 메소드를 선언할 때 final을 사용할 수 있습니다.
class AAA {
final String hello = "hello world";
final String getHello() {
return hello;
}
}
final로 선언된 메소드는, 다른 클래스가 이 클래스를 상속할 때 메소드 오버라이딩을 금지합니다.
예를 들면, 다음과 같이 AAA
클래스를 상속하는 BBB
클래스에서는 getHello()
를 재정의할 수 없습니다. Override하려고 하면 컴파일 에러가 발생합니다.
class BBB extends AAA {
@Override
String getHello() { // compile error !
return "See you around";
}
}
final 클래스
다음과 같이 final 키워드를 사용하여 클래스를 정의할 수 있습니다.
final class AAA {
final String hello;
AAA() {
hello = "hello world";
}
}
final으로 클래스를 선언하면, 다른 클래스에서 이 클래스를 상속할 수 없습니다. 만약 다음과 같이 final 클래스를 상속하려고 하면 컴파일 에러가 발생합니다.
class BBB extends AAA() { // compile error!
}
final에 대해서 더 자세히 알고 싶다면 Java - Final 키워드에 대한 이해를 참고해주세요.
2. finally 키워드
finally 키워드는 try-catch
와 함께 사용됩니다.
try-catch
가 종료될 때 finally block이 항상 수행됩니다.
다음은 강제로 Exception을 발생시키는 코드입니다.
try {
System.out.println("try block");
throw new Exception();
} catch (Exception e) {
System.out.println("catch block");
} finally {
System.out.println("finally block");
}
결과는 다음과 같이 출력됩니다.
try block
catch block
finally block
catch
가 없더라도 finally block
은 항상 실행됩니다.
try {
System.out.println("try block");
} finally {
System.out.println("finally block");
}
Output:
try block
finally block
정리하면, finally block은 try block이 종료될 때 항상 실행됩니다. 그래서 사용이 모두 끝난 FileInputStream 등의 FileDescriptor를 닫을 때 사용되기도 합니다.
3. finalize 메소드
finalize()
는 Object 클래스에 선언된 protected 메소드입니다. Java에서 모든 클래스는 Object 클래스를 상속하는데요. 그렇기 때문에 모든 객체는 finalize()
메소드를 갖고 있습니다.
Garbage collector가 어떤 객체를 참조하는 객체가 없다고 생각되면, 이 객체를 소멸시킵니다. 객체를 소멸시킬 때 finalize()
메소드를 호출해 줍니다.
package java.lang;
public class Object {
...
protected void finalize() throws Throwable { }
}
클래스를 정의할 때 finalize()
를 오버라이드 할 수 있습니다.
finalize()
는 소멸될 때 호출되기 때문에 어떤 자원을 함께 소멸해주도록 구현할 수 있는데요.
메소드 호출 시점이 Garbage collector에 의존적이기 때문에, 생각했던 타이밍과 다를 수 있습니다.
이런 이유로 finalize를 재정의하지 않는 것이 좋습니다.
정리
final, finally, finalize에 대해서 알아보고, 어떻게 사용되는지에 대해서 간단히 알아보았습니다.
Related Posts
- Java - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedWriter로 파일 쓰기
- Java - BufferedReader로 파일 읽기
- Java charAt() 함수 알아보기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기