C++과 Java에는 모두 static(정적) 키워드가 존재하며, 두 언어에서의 역할은 상당히 유사하지만 몇 가지 근본적인 차이점이 있습니다. 이 글에서는 C++의 static과 Java의 static이 어떻게 다른지 코드 예제를 통해 자세히 살펴보겠습니다.
1. 정적 데이터 멤버 (Static Data Member)
정적 데이터 멤버는 Java와 C++에서 기본적으로 동일하게 동작합니다. 정적 데이터 멤버는 클래스에 속한 속성이며, 해당 클래스로 생성된 모든 객체가 하나의 값을 공유한다는 점이 특징입니다.
Java 예제
public class Test {
static int ob_count = 0;
Test() {
ob_count++;
}
public static void main(String[] args) {
Test object1 = new Test();
Test object2 = new Test();
System.out.println("생성된 객체 수: " + ob_count);
}
}
출력 결과
생성된 객체 수: 2
C++ 예제
#include<iostream>
using namespace std;
class Test {
public:
static int ob_count;
Test() {
ob_count++;
}
};
int Test::ob_count = 0;
int main() {
Test object1, object2;
cout << "생성된 객체 수: " << Test::ob_count;
}
출력 결과
생성된 객체 수: 2
두 예제 모두 객체가 생성될 때마다 정적 변수 ob_count 값이 증가하며, 모든 객체가 동일한 변수를 공유하기 때문에 최종적으로 2가 출력됩니다.
2. 정적 멤버 함수 (Static Member Function)
C++과 Java 모두 정적 멤버 함수를 만들 수 있으며, 이 함수들 역시 클래스의 멤버입니다. 다만 사용 시 몇 가지 제약 사항이 있습니다.
- 정적 메서드는 다른 정적 메서드만 호출할 수 있습니다.
- 정적 멤버 변수에만 접근할 수 있습니다.
this또는super(Java 전용) 키워드에는 접근할 수 없습니다.
또한 C++과 Java 모두 객체를 생성하지 않고도 클래스 이름을 통해 정적 멤버에 직접 접근할 수 있다는 공통점이 있습니다.
Java 예제
// MyClass.java 파일에 작성
public class MyClass {
static int x = 10;
public static void myFunction() {
System.out.println("정적 멤버의 정적 데이터: " + x);
}
}
// Test.java 파일에 작성
public class Test {
public static void main(String[] args) {
MyClass.myFunction(); // 객체 생성 없이 직접 호출
}
}
출력 결과
정적 멤버의 정적 데이터: 10
C++ 예제
#include<iostream>
using namespace std;
class MyClass {
public:
static int x;
static void myFunction(){
cout << "정적 멤버의 정적 데이터: " << x;
}
};
int MyClass::x = 10;
int main() {
MyClass::myFunction(); // 객체 생성 없이 직접 호출
}
출력 결과
정적 멤버의 정적 데이터: 10
3. 정적 블록 (Static Block) — Java에만 존재
정적 블록(static block)은 Java에만 있는 기능으로, '정적 절(static clause)'이라고도 불립니다. 정적 블록은 클래스의 정적 초기화를 위해 사용되며, 블록 내부에 작성된 코드는 클래스가 로드될 때 단 한 번만 실행됩니다. 이러한 정적 블록은 C++에는 존재하지 않습니다.
4. 지역 변수의 정적 선언 — C++에만 가능
반대로, C++에서는 함수 내부에 정적 지역 변수(static local variable)를 선언할 수 있지만, Java에서는 정적 지역 변수를 지원하지 않습니다. 즉, Java에서는 메서드 내부의 변수에 static 키워드를 붙일 수 없으며, 컴파일 오류가 발생합니다.
정리
- 공통점: 정적 데이터 멤버와 정적 멤버 함수는 두 언어 모두 지원하며, 클래스 단위로 관리되어 모든 객체가 공유하고 객체 생성 없이도 접근 가능합니다.
- 차이점: 정적 블록은 Java에만 존재하고, 정적 지역 변수는 C++에만 허용됩니다.