이번 글에서는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 요소 중 하나인 '클래스 변수와 초기화 및 초기화 블록'에 대해 깊게 알아보겠습니다. 이전 글에서는 final 키워드에 대해 배웠으니, 이제 클래스 변수와 초기화에 대해 더 자세하게 살펴보겠습니다.
1. 클래스 변수란 무엇인가?
클래스 변수란 해당 클래스의 모든 인스턴스가 공유하는 변수를 말합니다. 이를 선언하기 위해서는 'static' 키워드를 사용합니다. 일반적으로 클래스 수준에서 공유되어야 하는 값들을 저장하는 데 사용됩니다. 예를 들어, 한 게임 내에서 모든 플레이어가 공유해야 하는 최고 점수라던지, 데이터베이스 연결과 같은 자원을 관리할 때 주로 사용됩니다.
2. 왜 클래스 변수를 사용하는가?
클래스 변수는 여러 가지 용도로 사용됩니다:
- 상태 공유: 같은 클래스의 모든 객체들이 같은 값을 공유해야 할 때 유용합니다. 예를 들어 게임 내에서 모든 플레이어들이 최고 점수를 조회할 수 있도록 하기 위해서는 최고 점수 정보를 클래스 변수로 관리하면 좋습니다.
- 메모리 효율성: 동일한 데이터를 모든 인스턴스마다 별도로 저장하지 않고 한 번만 저장하여 메모리를 절약할 수 있습니다.
3. 초기화란 무엇인가?
초기화란 어떤 작업을 시작하기 전에 기본값을 설정하는 것입니다. Java에서 필드(변수)는 기본적으로 자동으로 초기화되지만, 명시적으로 값을 할당하여 초기화할 수도 있습니다.
4. 초기화 블럭이란 무엇인가?
초기화 블럭은 코드 내에서 별도로 위치한 '{ }' 안의 코드 부분을 의미하며, 객체 생성 시점에 실행됩니다. static 키워드와 함께 사용되면 static initializer라고 하며, 이 경우 해당 부분은 클래스 로딩 시점에 한 번만 실행됩니다.
5. 클래스 변수와 초기화 구현하기
Java 언어 기준으로 Dog 클래스 내부에 breedCount라는 이름의 private static int 변수를 가지고 있다고 가정합니다. 이 변수는 모든 Dog 객체들이 공유하며, 새로운 Dog 객체가 생성될 때마다 증가하는 값을 나타냅니다.
예시 코드:
public class Dog {
private static int breedCount; // Class Variable
// Static Initializer
static {
breedCount = 0;
}
public Dog() {
breedCount++;
}
public static int getBreedCount() {
return breedCount;
}
}
위 예제에서 `breedCount` 필드는 클래스 변수로, 모든 Dog 객체들이 이 값을 공유합니다. 또한, static initializer를 통해 breedCount를 0으로 초기화하였습니다.
6. 클래스 변수와 초기화 블록을 통한 데이터 접근
클래스 변수에 접근하는 방법은 인스턴스 생성 없이도 클래스 이름을 통해 접근할 수 있습니다. 그러나 값을 수정하려고 시도하면, 해당 클래스의 모든 인스턴스에 대한 값이 변경됩니다.
예시 코드:
Dog myDog = new Dog();
Dog yourDog = new Dog();
System.out.println(Dog.getBreedCount()); // "2" 출력
위 예제에서 `getBreedCount()` 메서드를 호출하여 2 값을 얻었습니다. 이는 두 개의 Dog 객체가 생성되면서 breedCount가 증가했기 때문입니다.
7. 주의사항
클래스 변수와 초기화 블럭을 사용할 때 주의해야 할 몇 가지 사항이 있습니다:
- 클래스 변수는 모든 인스턴스에서 공유되므로, 한 인스턴스에서 값이 변경되면 다른 모든 인스턴스에서도 그 변경 사항이 반영됩니다.
- 초기화 블럭은 생성자보다 먼저 실행되므로, 생성자 내부에서 초기화 블록에 의존하는 로직을 작성할 경우 문제가 발생할 수 있습니다.
- 정적 초기화자(static initializer)는 해당 클래스가 JVM에 로딩될 때 단 한 번만 실행되므로, 복잡한 초기 설정 작업 등에 유용하지만 너무 복잡한 작업을 포함시키거나 오류 처리 등을 제대로 하지 않으면 문제를 일으킬 수 있습니다.
8. 결론
객체 지향 프로그래밍에서 '클래스 변수'와 '초기화 및 초기화 블럭'은 중요한 개념입니다. 이를 통해 상태를 공유하거나 필요한 설정 작업을 할 수 있어 매우 유용합니다.
하지만, 이러한 기능들을 사용할 때에는 주의사항도 존재합니다. 클래스 변수는 모든 인스턴트 간에 공유되므로 값 변경 시 영향 범위를 잘 이해하고 사용해야 하며, 초기화 블럭은 생성자보다 우선 실행된다는 것 등을 명심해야 합니다.
또한, 정적 초기화자(static initializer)는 해당 클래스가 JVM에 로딩될 때 단 한 번만 실행되므로, 복잡한 초기 설정 작업 등에 유용하지만 너무 복잡한 작업을 포함시키거나 오류 처리 등을 제대로 하지 않으면 문제를 일으킬 수 있습니다.
이처럼 객체 지향 프로그래밍의 여러 요소들은 각각의 장단점과 특성이 있으므로 상황에 따라 적절하게 활용하는 것이 중요합니다. '클래스 변수'와 '초기화 및 초기화 블록'역시 그러한 요소 중 하나이며, 이러한 개념들을 잘 이해하고 활용한다면 보다 효과적인 프로그래밍이 가능할 것입니다.
'Programming > 객체 지향 프로그래밍(OOP)' 카테고리의 다른 글
OOP 개념: static과 final의 다차원배열 (0) | 2023.09.25 |
---|---|
OOP 개념: static과 final 배열 (0) | 2023.09.24 |
OOP 개념: 변수를 상수로 만드는 final (0) | 2023.09.22 |
OOP 개념: 정적필드와 메소드를 위한 키워드 static (0) | 2023.09.21 |
OOP 개념: 생성자(Constructor) (0) | 2023.09.20 |