개발/자바
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을 언제 사용하면 좋을까?
- 변경되면 안 되는 값을 만들 때 → final 변수 사용 (예: 상수, 불변 데이터).
- 객체의 참조 자체를 변경하고 싶지 않을 때 → final 객체 사용.
- 메소드에서 전달된 값이 변경되지 않도록 보호하고 싶을 때 → final 전달인자 사용.
🎯 정리
- final 변수 → 값을 한 번만 할당 가능, 이후 변경 불가!
- final 전달인자 → 메소드 내에서 매개변수 값 변경 불가!
- final 객체 → 참조 변경 불가, 내부 값 변경 가능!
✔ final을 적절히 사용하면 코드를 안전하게 보호하고, 불필요한 변경을 방지할 수 있습니다.
728x90