[Day 4 | Java] final

y♡ding·2024년 10월 17일
0

데브코스 TIL

목록 보기
19/163

📌 final 키워드

final 키워드는 자바에서 변경 불가능성을 의미한다. 변수, 메서드, 클래스에 사용되어 그 요소가 변경될 수 없도록 제한한다. final은 코드의 안정성, 가독성, 성능 최적화에 기여할 수 있다.


1️⃣ final 변수

  • 지역 변수: final로 선언된 지역 변수한 번만 값을 할당할 수 있다. 한 번 값이 할당되면 값을 변경할 수 없게 된다.
  • 필드(멤버 변수): 클래스의 필드(멤버 변수)에 final을 사용하면, 객체 생성 시 초기화가 이루어져야 하며 그 이후에는 값을 변경할 수 없다. 하지만 참조형 변수의 경우, 객체 내부 상태는 변경 가능하나 참조 자체는 변경할 수 없다.
  • 파라미터: 메서드의 파라미터final로 선언하면, 메서드 내부에서 그 파라미터의 값을 변경할 수 없다. 이는 메서드 내에서 참조의 무결성을 유지할 때 유용하다.

🤞🏻 특징

  • 기본 자료형: 값 자체를 변경할 수 없음.
  • 참조 자료형: 객체 내부의 상태는 변경할 수 있지만, 참조 대상 자체는 변경 불가.
final List<String> list = new ArrayList<>();
list.add("Hello");  // 내부 상태 변경은 가능
// list = new ArrayList<>();  // 참조 변경 불가 (컴파일 에러)

2️⃣ final 메서드

final로 선언된 메서드는 하위 클래스에서 오버라이딩할 수 없다. 이는 상위 클래스의 메서드 동작을 하위 클래스가 변경하지 못하도록 고정하는 역할을 한다. 주로, 메서드의 동작을 반드시 유지해야 할 때 사용된다.

class Parent {
    final void display() {
        System.out.println("Parent display");
    }
}

class Child extends Parent {
    // void display() {  // 컴파일 에러 (오버라이딩 불가)
    //     System.out.println("Child display");
    // }
}

🤞🏻 특징

  • 메서드의 동작이 변경되지 않도록 보장하고 싶을 때 사용.
  • 상위 클래스의 기본 기능을 그대로 유지해야 할 때 유용.

3️⃣ final 클래스

final로 선언된 클래스는 상속될 수 없다. 즉, 다른 클래스가 해당 클래스를 확장할 수 없으며, 상속을 통해 동작을 변경하지 못하도록 만든다. 주로 보안이나 설계상 변경이 필요 없는 클래스에 사용된다.

final class Parent {
    void display() {
        System.out.println("Parent display");
    }
}

// class Child extends Parent {  // 컴파일 에러 (상속 불가)
// }

🤞🏻 특징

  • 상속을 통한 클래스 확장이 불가능하므로, 안정성보안성을 유지.
  • String, Integer와 같은 불변 객체 클래스들이 대표적인 final 클래스이다.

📣 static final: 상수 선언

static final상수를 정의할 때 사용된다. static클래스 단위로 공유된다는 의미이며, final변경할 수 없는 값을 의미힌다. 보통 상수는 대문자로 표기하며, 주로 공용으로 사용되는 상수를 선언할 때 사용한다.

class Constants {
    static final String COMPANY_NAME = "OpenAI"; // 상수 선언
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Constants.COMPANY_NAME);  // "OpenAI" 출력
    }
}

🤞🏻 특징

  • 클래스 상수로 사용되며, 프로그램 전반에서 공유하고 변경되지 않음.
  • 메모리 효율이 좋고, 재사용성이 높음.

👍🏻 final의 장점

  • 불변성: 한 번 값이 할당되면 변경할 수 없으므로 코드의 안정성이 높아진다.
  • 스레드 안전성: final로 선언된 변수는 멀티스레드 환경에서도 안전하게 사용할 수 있다.
  • 성능 최적화: 컴파일러와 JVM은 final로 선언된 변수를 최적화할 수 있어 성능이 향상될 수 있다.
  • 설계 의도 명확화: final을 사용하면 해당 요소가 변경되지 않음을 명확히 전달하여 가독성이 높아진다.

🥊 불변 객체와 final의 차이점

  • final 변수: 변수의 참조 재할당을 막는다. 하지만 참조하는 객체의 내부 상태는 변경 가능하다.
  • 불변 객체(Immutable Object): 객체가 생성된 후에는 객체의 상태 자체가 변경되지 않음을 보장한다. 예를 들어, String, Integer 같은 불변 클래스들은 객체의 내부 상태를 변경할 수 없다.
final List<String> list = new ArrayList<>();
list.add("Hello");  // 내부 상태 변경 가능

final String str = "Hello";
// str = "World";  // 재할당 불가 (컴파일 에러)
  • final 변수는 변수의 재할당만 막을 뿐 내부 상태 변화는 허용한다.
  • 불변 객체는 상태 변화 자체를 막아 안정성을 보장한다.

📌

  • 변수: final로 선언된 변수는 재할당 불가. 참조형 변수는 참조 대상 변경 불가, 그러나 내부 상태 변경 가능.

  • 메서드: final 메서드는 오버라이딩 불가, 기본 동작 유지.

  • 클래스: final 클래스는 상속 불가, 클래스 확장 불가.

  • 상수: static final로 상수를 정의하여 공유변경 불가한 값으로 사용.

0개의 댓글

관련 채용 정보