예시)
Num 클래스에 static 변수 stNum을 선언해주고, Main 클래스에서 해당 정적 변수 값을 변경한다음
Sub 클래스의 정적 메서드를 호출하여 변경된 값이 나오는 것을 확인함으로써 정적 멤버의 값이 공유되는것을 알 수 있다.
(들어가기 앞서)
처음에 Main 클래스에서 main 함수를 호출하여 정적 필드값을 변경한 후, 다시 Sub 클래스에서 다시 main 함수를 호출하여 해당 정적 필드값을 출력해보니 변경되지 않아 이상함을 느꼈다.
알고보니 main 함수가 각각 호출되어 서로 다른 프로세스가 동작하여 Sub에서 main 함수를 호출했을때 이전 프로세서(Main 클래스에서의 main 함수 호출)의 결과가 반영되지 않기 때문에 처음 값이 나왔던 것이다. 별개의 프로세스라 메모리도 다르다. 애초에 말이 안되는 것이었다.
이후 Sub 클래스에서 해당 정적 필드값을 출력하는 정적 메서드를 선언하고 Main 클래스에서 해당 정적 메서드를 호출하니 정상적으로 변경된 정적 필드값이 나오는 것을 확인할 수 있었다.
src/Num
public class Num {
//인스턴스 멤버
int insNum;
//정적 멤버
static int stNum = 300;
//인스턴스 메서드
int insPlus(int x, int y){
return x + y;
}
//정적 메서드
static int stPlus(int x, int y){
return x + y;
}
}
src/Sub
public class Sub {
static void printStNum(){
System.out.println("현재 정적 필드 stNum 값: " + Num.stNum);
return;
}
}
src/Main
public class Main {
public static void main(String[] args) {
//객체 생성 없이 먼저 인스턴스 멤버 사용해보기 => 에러 발생
//System.out.println(Num.insNum);
//System.out.println(Num.insPlus);
//인스턴스 멤버 사용, 먼저 객체(인스턴스) 생성해야 함
Num numClass = new Num();
System.out.println("인스턴스 필드 insNum: " + numClass.insNum);//인스턴스 멤버 출력 => 기본값인 0 출력됨
numClass.insNum = 500;
System.out.println("인스턴스 필드 insNum: " + numClass.insNum);//500 출력됨
System.out.println("인스턴스 메서드 insPlus: " + numClass.insPlus(4,6));//인스턴스 메서드 호출
//정적 멤버 사용
System.out.println("정적 필드 stNum: " + Num.stNum);
System.out.println("정적 메서드 stPlus: " + Num.stPlus(4,6));
//정적 필드 값 변경
Num.stNum = 500;
System.out.println("정적 필드 stNum 값 변경: " + Num.stNum);
System.out.println("변경된 정적 필드 stNum: " + Num.stNum);//다른 클래스의 정적 메서드 호출
}
}
결과값 출력
이미지 출처
네이버 블로그 Morph's House