728x90
Final
1-1. final 클래스
- 자바에서 final 클래스는 다른 클래스가 그것을 상속받을 수 없게 하는 특별한 종류의 클래스이다.
- final 키워드를 클래스 선언에 추가함으로써, 해당 클래스는 ‘최종적’이며 변경할 수 없다는 것을 의미한다.
final 클래스의 필요성
- 불변성 보장
- 클래스가 일단 생성되면 그 상태가 변경되지 않도록 함으로써, 안정성과 보안을 향상시킨다.
- 상속 방지
- 특정 클래스의 설계와 구현이 그대로 유지되어야 할 때 중요하다.
- 불변 클래스 생성
- final 클래스는 불변 객체를 만드는 데 유용한다.
- 불변 객체는 생성 후 그 상태가 변경되지 않으므로, 여러 면에서 프로그램의 신뢰성을 높일 수 있다.
- 성능 최적화
- 컴파일러와 JVM은 final 클래스에 대해 성능 최적화를 수행할 수 있다.
- final 클래스의 메소드는 오버라이딩되지 않기 때문에, 컴파일 타임에 메소드 호출이 결정될 수 있어, 실행 시간이 단축될 수 있다ㅏ.
final 클래스의 특성
- 확장 불가능
- 다른 클래스는 final 클래스를 상속받을 수 없다.
- → 이는 final 클래스의 모든 메소드가 상속되거나 오버라이딩될 수 없음을 의미한다.
- 메소드 오버라이딩 방지
- final 클래스 내의 모든 메소드는 자동으로 final 로 간주된다.
💡 final 클래스는 코드의 안정성과 유지 보수성을 높이는 데 기여할 수 있으며, 특정한 사용 사례에서 중요한 역할을 한다. 클래스의 설계 의도를 명확히 하고, 불필요한 상속과 변경을 방지하여 프로그램의 견고성을 높이고자 할 때 final 클래스를 사용하는 것이 좋다.
1-2. final 클래스 예제
final class SecurityConfig {
private static final String ENCRYPTION_KEY = "ComplexKey123!";
private SecurityConfig() {
// 생성자를 private으로 선언하여 외부에서 인스턴스화 방지
}
public static String getEncryptionKey() {
return ENCRYPTION_KEY;
}
}
public class FinalEx {
public static void main(String[] args) {
String encryptionKey = SecurityConfig.getEncryptionKey();
System.out.println("암호화 키: " + encryptionKey);
}
}
- SecurityConfig 클래스 : final 로 선언되어 있어 상속 불가능
- Private 생성자 : 클래스 외부에서 인스턴스를 생성할 수 없다.
- → 클래스가 유틸리티 목적으로만 사용되도록 의도된 것
- Main 클래스 : SecurityConfig 클래스의 정적 메소드를 호출하여 암호화 키를 가져옴
- 이 예제는 final 클래스를 사용하여 클래스의 불변성을 보장하고, 보안 관련 중요한 설정이 외부에서 변경되는 것을 방지하는 방법을 보여준다.
1-3. Java JDK의 final 클래스
- JDK 내에서 final 클래스의 사용은 주로 안정성과 불변성을 확보하기 위해 이루어진다.
- (변경되어서는 안되는 중요한 클래스들이 포함)
- java.lang.String , java.lang.Math , java.lang.System , java.util.Collections 등
- → 정적 메소드만 사용가능
2-1. final 필드
- 자바에서 final 필드는 한 번 초기화되면 그 값을 변경할 수 없는 필드를 의미한다.
- 상수를 정의하거나, 객체의 불변성을 보장하는 데 사용
final 필드의 필요성
- 상수 정의
- 수학적 상수, 설정 값 등 프로그램 전반에 걸쳐 일관되게 사용되어야 하는 값들을 final 필드로 정의
- 불변 객체 생성
- 객체의 불변성을 보장하려면, 객체가 생성된 후에는 그 상태가 변경되지 않도록 해야함
- → 객체의 예측 가능성과 신뢰성을 높인다.
- 스레드 안정성
- 멀티스레딩 환경에서 final 필드는 스레드 간의 안전한 읽기 작업을 보장한다.
- 한 번 초기화된 final 필드의 값은 변경되지 않으므로, 스레드 간에 동기화 없이 안전하게 읽을 수 있다.
- 메모리 가시성 보장
- 객체가 생성될 때 한 번만 쓰여지고, 이후에는 변경되지 않기 때문에, JVM은 메모리 가시성을 보장한다.
- 즉, final 필드의 값은 모든 스레드에게 일관되게 보여진다.
final 필드의 특성
- 초기화 제한
- final 필드는 선언 시 또는 생성자에서만 초기화할 수 있다.
- 객체의 핵심 속성 보호
- 객체가 특정한 상태를 유지해야 할 때, 예를 들어 설정 값이나 중요한 데이터를 final 필드로 선언함으로써, 해당 값의 무결성을 유지할 수 있다.
💡 final 필드는 프로그램의 안정성과 무결성을 높이는 중요한 방법이다. 이러한 필드는 프로그램이 더욱 견고하고 안정적으로 동작하도록 돕고, 예측 가능한 동작을 보장하는 데 기여한다.
2-2. final 필드 예제
class Person {
private final int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class FinalFieldEx {
public static void main(String[] args) {
Person person = new Person(1001, "John Doe");
System.out.println("사람의 ID: " + person.getId());
System.out.println("사람의 이름: " + person.getName());
person.setName("Jane Doe");
System.out.println("변경된 이름: " + person.getName());
}
}
- Person 클래스, 생성자
- Person 객체가 생성될 때, 식별 번호와 이름은 생성자를 통해 초기화된다. 식별 번호는 final 필드이므로, 이후에는 변경 불가
3-1. final 메소드
- 한 번 선언되면 하위 클래스에서 오버라이딩(재정의)할 수 없다.
- → 클래스의 핵심적인 기능을 안정적으로 유지하기 위해 사용된다.
final 메소드의 필요성
- 메소드의 무결성 보장
- final 메소드는 변경되거나 재정의될 수 없다.
- 오버라이딩 방지
- 보안 강화
- 예측 가능한 동작
- 개발자는 final 메소드가 항상 동일한 방식으로 동작한다는 것을 알고 있으므로, 의도치 않은 오류나 버그를 줄일 수 있다.
final 메소드의 특성
- 재정의 불가능
- 클래스의 동작 보호
💡 final 메소드는 객체 지향 프로그래밍에서 클래스의 기능을 보호하고, 안정적인 동작을 보장하는 중요한 도구이다. 이는 프로그램의 견고성을 높이고, 예상치 못한 동작으로부터 시스템을 보호하는 데 중요한 역할을 한다.
3-2. final 메소드 예제
class BankAccount {
private final int accountNumber;
private double balance;
public BankAccount(int accountNumber, double initialBalance) {
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
public final String getAccountInfo() {
return "계좌 번호: " + accountNumber + ", 잔액: " + balance;
}
public void deposit(double amount) {
balance += amount;
}
public void withdraw(double amount) {
balance -= amount;
}
}
public class FinalMethodEx {
public static void main(String[] args) {
BankAccount account = new BankAccount(12345, 1000.0);
System.out.println(account.getAccountInfo()); // 계좌 번호: 12345, 잔액: 1000.0
account.deposit(500);
System.out.println(account.getAccountInfo()); // 계좌 번호: 12345, 잔액: 1500.0
account.withdraw(200);
System.out.println(account.getAccountInfo()); // 계좌 번호: 12345, 잔액: 1300.0
}
}
- final 메소드는 클래스의 동작을 안정적으로 유지하고, 프로그램의 신뢰성을 향상시키는 데 기여한다.
728x90
'Spring > TIL - 멋쟁이사자처럼' 카테고리의 다른 글
TIL - 3월 27일 : HTML (1) | 2024.03.29 |
---|