이번 포스팅에서는 자바에서 자주 사용되는 `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 |