이번 글에서는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 요소 중 하나인 '변수를 상수로 만드는 키워드 final'에 대해 자세하게 알아보겠습니다. 이전 글에서는 클래스의 정적 필드와 메서드에 대해 배웠으니, 이제 final 키워드에 대해 더 깊게 살펴보겠습니다.
1. final 변수란 무엇인가?
객체 지향 프로그래밍에서 'final'은 한 번 할당되면 그 값이 변경되지 않는 변수를 의미합니다. 즉, 이 키워드가 붙은 변수는 초기화된 후부터 프로그램 종료 시까지 그 값을 변경할 수 없습니다. 따라서 이런 성질을 가진 변수들은 상수로 간주되며, 일반적으로 모든 대문자와 밑줄을 사용하여 이름을 지정합니다.
2. 왜 final을 사용하는가?
final 변수는 여러 가지 용도로 사용됩니다:
- 상수 선언:
프로그램 내에서 변하지 않고 공유되어야 하는 값을 저장하기 위해 사용됩니다. 예를 들어 수학상의 파이(π) 값, 물리학상의 질량 등 변하지 않아야 하는 값들을 표현할 때 유용하게 사용됩니다.
- 불변성 유지:
객체의 상태를 변경할 수 없게 하여 데이터의 안정성을 보장하며 코드의 예측 가능성을 높입니다. 예를 들어 객체가 생성된 후에 그 속성이 바뀌면 안 되는 경우(예: 학생 ID), 해당 속성 필드를 final로 선언하여 초기화 후 변경이 불가능하도록 할 수 있습니다.
3. final 구현하기
Java 언어 기준으로 Dog 클래스 내부에 breed라는 이름의 private final String 변수를 가지고 있다고 가정합니다. 이 변수는 Dog 객체가 생성될 때 결정되며, 그 후로 변경할 수 없습니다.
예시 코드:
public class Dog {
private final String breed; // Final Field
public Dog(String breed) {
this.breed = breed;
}
public String getBreed() {
return this.breed;
}
}
이 코드에서 breed 필드에 'final' 키워드가 붙었습니다. 즉, Dog 객체가 생성될 때 결정된 품종(breed)은 그 후로 변경할 수 없습니다. 이를 통해 Dog 객체의 불변성을 보장하게 됩니다.
4. final을 통한 데이터 접근
final 멤버에 접근하는 방법은 일반 멤버와 동일합니다. 하지만 값을 수정하려고 시도하면 컴파일 오류가 발생합니다.
예시 코드:
Dog myDog = new Dog("Bulldog");
System.out.println(myDog.getBreed()); // "Bulldog" 출력
myDog.breed = "Poodle"; // 컴파일 오류!
위 예제에서 `getBreed()` 메서드를 호출하여 Bulldog 값을 얻었습니다. 그러나 마지막 줄에서 Bulldog을 Poodle로 변경하려고 시도하면 컴파일 오류가 발생합니다. 이는 final 필드의 값은 변경할 수 없기 때문입니다.
5. 주의사항
final 변수를 사용할 때 주의해야 할 몇 가지 사항이 있습니다:
- final 변수는 반드시 선언 시 또는 생성자 내에서 초기화해야 합니다.
- final 필드에 대한 참조를 변경할 수 없지만, 참조된 객체 내부의 상태는 변경될 수 있습니다.
- 이러한 경우에는 복잡성과 버그 가능성이 증가하기 때문에, 보통은 불변 객체(내부 상태가 변하지 않는 객체)와 함께 사용하는 것이 좋습니다.
6. 결론
객체 지향 프로그래밍에서 'final'은 한 번 할당되면 그 값을 변경할 수 없는 변수를 선언하는 데 사용되는 중요한 키워드입니다. 이를 통해 상수를 선언하거나 객체의 상태 변화를 제한하여 데이터의 안정성을 보장하고 코드의 예측 가능성을 높일 수 있습니다.
하지만, final 변수를 사용할 때에는 주의사항도 존재합니다. final 변수는 반드시 초기화해야 하며, 참조된 객체 내부의 상태 변화에 대해서 제어하지 못한다는 점을 유념해야 합니다.
정리하면, 'final' 키워드 활용 방법과 그로 인해 발생하는 동작 및 제약 사항을 이해하는 것은 객체 지향 프로그래밍에 있어 중요한 요소 중 하나입니다. 이러한 개념들은 데이터 안정성 보장 및 코드 예측 가능성 증진 등 다양한 혜택을 제공하지만 동시에 주의가 필요합니다.
'Programming > 객체 지향 프로그래밍(OOP)' 카테고리의 다른 글
OOP 개념: static과 final 배열 (0) | 2023.09.24 |
---|---|
OOP 개념: 클래스 변수와 초기화와 초기화 블럭 (0) | 2023.09.23 |
OOP 개념: 정적필드와 메소드를 위한 키워드 static (0) | 2023.09.21 |
OOP 개념: 생성자(Constructor) (0) | 2023.09.20 |
OOP 개념: 필드 참조 메소드 getter, setter 구현 (0) | 2023.09.19 |