개발/자바

final 변수와 final 전달인자

피터JK 2025. 2. 18. 10:58
728x90

🔹 final 변수와 final 전달인자

final 키워드는 **변수와 전달인자(매개변수)**에도 사용할 수 있으며, 각각의 의미가 다릅니다.
이번에는 final 변수와 final 전달인자에 대해 설명하겠습니다.


1️⃣ final 변수

final 변수를 선언하면, 한 번만 값을 할당할 수 있으며 변경할 수 없습니다.
즉, 값을 한 번 지정하면 다시 변경할 수 없습니다.

✅ 사용 예시

class Example {
    final int number = 10;  // 값을 한 번 할당하면 변경 불가능
    
    void changeNumber() {
        // number = 20;  // ❌ 오류 발생! (final 변수는 값 변경 불가)
    }
}

✅ 특징

  • 선언과 동시에 값을 할당해야 함 (단, 생성자를 통해 할당 가능).
  • static final로 선언하면 상수(constant) 역할을 함.
  • 한 번 값이 지정되면 이후에는 변경할 수 없음.

✅ 생성자를 통한 final 변수 초기화

class Person {
    final String name;  // 생성자를 통해 초기화 가능
    
    Person(String name) {
        this.name = name;  // 생성자를 통해 한 번 할당 가능
    }

    void changeName() {
        // this.name = "New Name";  // ❌ 오류 발생! (final 변수는 변경 불가)
    }
}

✅ static final (상수)

class Constants {
    static final double PI = 3.14159;  // 상수
}
  • static final로 선언하면 공유되는 상수가 됨.
  • 보통 **대문자와 언더스코어(_)**를 사용하여 상수 이름을 작성함.

2️⃣ final 전달인자 (매개변수)

메소드의 매개변수(파라미터)에 final을 사용하면, 해당 매개변수의 값을 변경할 수 없습니다.
즉, 메소드 내부에서 매개변수 값을 수정할 수 없습니다.

✅ 사용 예시

class Example {
    void display(final int num) {
        // num = 20;  // ❌ 오류 발생! (final 전달인자는 값 변경 불가)
        System.out.println("Number: " + num);
    }
}
  • final 매개변수는 메소드 내부에서 값을 변경할 수 없음.
  • 하지만 메소드가 호출될 때 전달하는 값은 변경 가능.

✅ final 객체 전달인자

객체를 final로 전달하면, 참조 자체는 변경할 수 없지만, 객체의 내부 값은 변경할 수 있습니다.

class Person {
    String name;
    
    Person(String name) {
        this.name = name;
    }
}

class Example {
    void modifyPerson(final Person person) {
        // person = new Person("New Name");  // ❌ 오류 발생! (참조 변경 불가)
        person.name = "New Name";  // ✅ 가능 (객체의 속성은 변경 가능)
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John");
        Example ex = new Example();
        ex.modifyPerson(person);
        System.out.println(person.name);  // 출력: "New Name"
    }
}

✔ final 키워드를 사용하면 객체의 참조(주소)는 변경할 수 없지만, 내부 속성은 변경할 수 있습니다.
✔ 불변 객체(Immutable Object)를 만들려면 객체 속성도 final로 선언해야 합니다.


3️⃣ final 변수 vs final 전달인자 비교

구분 final 변수  final 전달인자
변경 여부 선언 후 변경 불가 메소드 내부에서 변경 불가
사용 목적 값이 변하지 않는 변수를 정의 (상수, 불변 데이터) 매개변수가 변경되지 않도록 보호
객체 참조 final 객체는 참조 변경 불가, 내부 값 변경 가능 final 매개변수는 참조 변경 불가, 내부 값 변경 가능

🔥 final을 언제 사용하면 좋을까?

  1. 변경되면 안 되는 값을 만들 때 → final 변수 사용 (예: 상수, 불변 데이터).
  2. 객체의 참조 자체를 변경하고 싶지 않을 때 → final 객체 사용.
  3. 메소드에서 전달된 값이 변경되지 않도록 보호하고 싶을 때 → final 전달인자 사용.

🎯 정리

  • final 변수 → 값을 한 번만 할당 가능, 이후 변경 불가!
  • final 전달인자 → 메소드 내에서 매개변수 값 변경 불가!
  • final 객체 → 참조 변경 불가, 내부 값 변경 가능!

✔ final을 적절히 사용하면 코드를 안전하게 보호하고, 불필요한 변경을 방지할 수 있습니다. 

728x90