🚀 final
이란?
final
은 변경할 수 없도록 제한하는 키워드입니다.
Java에서 final
은 변수, 메서드, 클래스에 적용될 수 있으며, 각각의 의미가 다릅니다.
✅ 1️⃣ final
변수 (변경 불가능한 값)
✔ final
이 붙은 변수는 한 번만 값을 설정할 수 있고, 이후 변경할 수 없음.
✔ 선언과 동시에 초기화하거나, 생성자에서 한 번만 초기화 가능.
📌 예제 (선언과 동시에 초기화)
public class Example {
private final int number = 10; // ✅ 한 번 초기화, 변경 불가
public void changeValue() {
// number = 20; // ❌ 오류 발생 (final 변수는 변경 불가능)
}
}
📌 예제 (생성자에서 초기화)
public class Example {
private final int number;
public Example(int num) {
this.number = num; // ✅ 생성자에서 초기화 가능
}
public void changeValue() {
// number = 30; // ❌ 오류 발생 (한 번 초기화 후 변경 불가)
}
}
✔ 생성자를 이용하면 객체마다 다른 값을 설정할 수 있음.
✔ 하지만 객체가 생성된 후에는 값을 변경할 수 없음.
✅ 2️⃣ final
메서드 (오버라이딩 불가)
✔ final
이 붙은 메서드는 하위 클래스에서 재정의(오버라이딩)할 수 없음.
✔ 부모 클래스의 동작을 변경하지 않도록 보호할 때 사용.
📌 예제
class Parent {
public final void show() {
System.out.println("Parent class method");
}
}
class Child extends Parent {
// ❌ 오류 발생! (오버라이딩 불가능)
// public void show() {
// System.out.println("Child class method");
// }
}
✔ final
메서드는 자식 클래스에서 수정할 수 없음.
✔ 보안이 중요한 로직이나 변경하면 안 되는 동작을 보호할 때 사용.
✅ 3️⃣ final
클래스 (상속 불가)
✔ final
이 붙은 클래스는 상속할 수 없음.
✔ 다른 클래스가 이 클래스를 확장(extends)하지 못하도록 제한.
📌 예제
final class FinalClass {
public void display() {
System.out.println("This is a final class");
}
}
// ❌ 오류 발생! (상속 불가능)
// class SubClass extends FinalClass { }
✔ FinalClass
는 상속이 금지됨 → 보안이 필요한 클래스에서 사용됨.
✔ 대표적인 예: java.lang.String
, java.lang.Math
는 final
클래스이므로 상속할 수 없음.
✅ 4️⃣ final
+ static
(상수 만들기)
✔ final
과 static
을 함께 사용하면 클래스 단위의 상수를 만들 수 있음.
✔ static final
변수는 변경할 수 없고, 모든 객체가 공유함.
📌 예제
public class Constants {
public static final double PI = 3.141592;
}
✔ PI
는 한 번 초기화된 후 변경할 수 없음.
✔ 모든 곳에서 Constants.PI
로 사용 가능 → 전역 상수 역할.
🚀 final
요약 정리
사용 대상 | 의미 | 특징 |
---|---|---|
변수 | 값 변경 불가능 | 한 번만 초기화 가능 |
메서드 | 오버라이딩 불가능 | 자식 클래스에서 재정의할 수 없음 |
클래스 | 상속 불가능 | 다른 클래스가 확장할 수 없음 |
static final |
상수 | 변경할 수 없는 공통 값 |
🎯 결론
✔ final
은 변경할 수 없도록 제한하는 키워드.
✔ 변수 → 값 변경 불가능, 한 번만 초기화 가능.
✔ 메서드 → 오버라이딩 불가능.
✔ 클래스 → 상속 불가능.
✔ static final
→ 상수 역할.
📌 final
을 활용하면 코드의 안정성을 높이고, 불필요한 변경을 방지할 수 있음! 🚀
final
필드는 객체가 생성될 때 한 번만 초기화할 수 있으며, 이후에는 변경할 수 없습니다.
즉, 객체가 생성될 때(new
로 생성될 때) final
필드는 반드시 한 번 초기화되어야 합니다.
✅ 1️⃣ final
필드의 초기화 방법
Java에서 final
필드는 한 번만 값을 설정할 수 있으며, 이후 변경이 불가능합니다.
초기화 방법은 다음 3가지가 있습니다.
📌 (1) 선언과 동시에 초기화
public class Example {
private final int number = 10; // ✅ 선언과 동시에 초기화
public Example() {
// number = 20; // ❌ 오류! 이미 초기화되었으므로 변경 불가
}
public int getNumber() {
return number;
}
}
✔ final
필드는 선언과 동시에 값을 설정할 수 있음.
✔ 생성자에서 다시 값을 할당하는 것은 불가능! (number = 20;
→ 오류 발생)
📌 (2) 생성자를 통해 초기화 (객체마다 다른 값 설정 가능)
public class Example {
private final int number; // ✅ 선언만 하고 생성자에서 초기화
public Example(int number) {
this.number = number; // ✅ 생성자에서 초기화 (객체마다 다른 값 가능)
}
public int getNumber() {
return number;
}
public static void main(String[] args) {
Example ex1 = new Example(10);
Example ex2 = new Example(20);
System.out.println(ex1.getNumber()); // 10
System.out.println(ex2.getNumber()); // 20
}
}
✔ 생성자를 통해 객체마다 다른 값을 설정 가능.
✔ 단, 생성자에서 final
필드를 한 번도 초기화하지 않으면 오류 발생!
🚨 오류 예제 (초기화하지 않음)
public class Example {
private final int number; // ❌ 오류 발생 (생성자에서 초기화하지 않음)
public Example() {
// number = 10; // 초기화해야 오류가 없음!
}
}
✔ final
필드는 반드시 한 번 초기화해야 하므로, 생성자에서 값을 설정하지 않으면 컴파일 오류 발생.
📌 (3) 정적 final
필드 (클래스 단위 상수)
public class Example {
public static final double PI = 3.141592; // ✅ static final로 선언
public static void main(String[] args) {
System.out.println(Example.PI); // 3.141592
}
}
✔ static final
필드는 클래스 로딩 시 한 번만 초기화됨.
✔ 객체마다 다른 값이 아니라, 모든 객체가 동일한 값을 공유.
✔ 한 번 설정된 값은 변경할 수 없음.
✔ 보통 상수(const
) 역할을 할 때 사용됨. (public static final
)
✅ 2️⃣ final
필드의 특징 정리
초기화 방법 | 가능 여부 | 설명 |
---|---|---|
선언과 동시에 초기화 | ✅ 가능 | final int a = 10; |
생성자에서 초기화 | ✅ 가능 | this.a = 값; (객체마다 다른 값 가능) |
static 블록에서 초기화 | ✅ 가능 | static final 필드일 경우 |
객체 생성 후 값 변경 | ❌ 불가능 | a = 20; → 오류 발생! |
🚀 결론
✔ final
필드는 객체가 생성될 때 반드시 초기화되어야 하며, 이후 변경할 수 없음.
✔ 선언과 동시에 초기화하거나, 생성자를 통해 초기화해야 함.
✔ 생성자를 통한 초기화는 객체마다 다른 값을 설정할 수 있음.
✔ static final
필드는 클래스 로딩 시 한 번만 초기화됨 (상수 역할).
📌 즉, final
필드는 한 번만 설정 가능하지만, 객체가 생성될 때 초기화하는 방법은 유연하게 선택할 수 있음! 🚀
'자바' 카테고리의 다른 글
super() 정리2 (0) | 2025.02.09 |
---|---|
매개변수가 없는 메서드와 매개변수가 없는 생성자 비교를 통한 생성자 이해 (0) | 2025.02.08 |
null이란? (0) | 2025.02.08 |
잘못된 메서드 사용 예시 (0) | 2025.02.08 |
가변인자와 배열인자 (0) | 2025.02.08 |