본문 바로가기
JAVA

Java final 정리해보기

by 얍얍1234 2024. 6. 30.

이번 포스팅에서는 자바에서 자주 사용되는 `final` 키워드에 대해 이야기해보겠습니다. 자바를 공부하다 보면 `final` 키워드를 자주 마주치게 되는데, 이 키워드는 변수, 메서드, 클래스에 적용될 수 있습니다. 각각의 경우에 `final`이 어떤 의미를 가지며, 어떻게 사용하는지 정리해보겠습니다.

 

final 변수

상수 만들기

`final` 키워드를 변수에 적용하면, 그 변수는 한 번 초기화된 이후에 값을 변경할 수 없습니다. 이를 통해 상수를 만들 수 있습니다.

public class Constants {
    public static final int MAX_USERS = 100;
    public static final String APP_NAME = "MyApplication";
}


위의 예제에서 `MAX_USERS`와 `APP_NAME`은 상수로 선언되었으며, 이 값은 변경할 수 없습니다. 이러한 상수는 보통 대문자로 표기하며, 단어 사이에는 밑줄을 사용합니다.

 


인스턴스 변수와 final

클래스의 인스턴스 변수에 `final`을 사용하면, 객체가 생성될 때 반드시 초기화되어야 하며, 이후에는 변경할 수 없습니다.

public class User {
    private final String username;

    public User(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }
}


위 코드에서 `username` 필드는 `final`로 선언되었기 때문에, 생성자에서 반드시 초기화해야 합니다. 그리고 한 번 초기화된 이후에는 변경할 수 없습니다.

 


지역 변수와 final

지역 변수에도 `final`을 사용할 수 있습니다. 이 경우, 해당 변수는 한 번만 값을 할당받을 수 있습니다.

public void printMessage() {
    final String message = "Hello, World!";
    System.out.println(message);
}


위의 예제에서 `message` 변수는 `final`로 선언되었기 때문에, 값이 한 번 할당된 이후에는 변경할 수 없습니다.


final 메서드

메서드에 `final`을 사용하면, 그 메서드는 하위 클래스에서 오버라이드할 수 없습니다. 이는 메서드의 동작을 변경하지 않도록 보장하고 싶을 때 유용합니다.

public class BaseClass {
    public final void display() {
        System.out.println("This is a final method.");
    }
}

public class SubClass extends BaseClass {
    // 컴파일 오류 발생 - final 메서드는 오버라이드 할 수 없습니다.
    // public void display() {
    //     System.out.println("Trying to override.");
    // }
}


위의 예제에서 `display` 메서드는 `final`로 선언되었기 때문에, `SubClass`에서 이 메서드를 오버라이드하려고 하면 컴파일 오류가 발생합니다.


final 클래스

클래스에 `final`을 사용하면, 그 클래스는 상속될 수 없습니다. 이는 클래스 자체를 변경할 수 없도록 하여 보안 및 설계 안정성을 높이는 데 유용합니다.

public final class FinalClass {
    // 클래스 내용
}

// 컴파일 오류 발생 - final 클래스는 상속할 수 없습니다.
// public class SubClass extends FinalClass {
//     // 클래스 내용
// }


위의 예제에서 `FinalClass`는 `final`로 선언되었기 때문에, 다른 클래스에서 이를 상속하려고 하면 컴파일 오류가 발생합니다.


final과 불변 객체

`final` 키워드를 사용하여 불변(immutable) 객체를 만들 수 있습니다. 불변 객체는 객체의 상태가 한 번 설정된 이후에는 변경되지 않는 객체를 말합니다. 이는 멀티스레드 환경에서 안전하게 사용할 수 있습니다.

public final class ImmutableUser {
    private final String username;
    private final int age;

    public ImmutableUser(String username, int age) {
        this.username = username;
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

    public int getAge() {
        return age;
    }
}


위의 예제에서 `ImmutableUser` 클래스는 `final`로 선언되었으며, 모든 필드도 `final`로 선언되었습니다. 생성자를 통해 필드를 초기화한 후에는 이 값을 변경할 수 없으므로, 이 클래스는 불변 객체입니다.


final과 성능

많은 사람들이 `final` 키워드가 성능에 긍정적인 영향을 미칠 수 있다고 생각합니다. 이는 컴파일러가 `final` 키워드를 사용하여 최적화를 수행할 수 있기 때문입니다. 예를 들어, `final` 변수는 변하지 않기 때문에, 컴파일러는 이 변수를 사용한 코드를 더 효율적으로 최적화할 수 있습니다.


결론

자바의 `final` 키워드에 대해 알아보았습니다. `final` 키워드는 변수, 메서드, 클래스에 적용될 수 있으며, 각각의 경우에 특정한 의미와 용도를 가집니다. 변수를 상수로 만들고, 메서드를 오버라이드하지 못하게 하며, 클래스를 상속하지 못하게 하는 등 다양한 목적으로 사용됩니다. 또한, 불변 객체를 만들고 성능 최적화에 기여할 수도 있습니다. 자바에서 `final` 키워드를 적절하게 사용하여 코드의 안정성과 가독성을 높여보세요.

'JAVA' 카테고리의 다른 글

Java 와 Kotlin  (0) 2024.07.01
자바 배열에 대해 알아보자  (0) 2024.06.30
알고리즘 공부를 해보자  (0) 2024.06.29
자바 예외 처리  (0) 2024.06.26
JAVA 참조 자료형  (0) 2024.06.25