[JAVA] 프로그래밍 언어 (23.01 01)
class Static {
public int a = 20;
static int b = 0;
}
public class Test {
public static void main(String[] args) {
int a = 10;
Static.b = a;
Static st = new Static();
System.out.println(Static.b++); // 출력값: 10
System.out.println(st.b); // 출력값: 11
System.out.println(a); // 출력값: 10
System.out.print(st.a); // 출력값: 20
}
}
설명:
- Static.b = a;에서 b에 10을 대입합니다.
- Static.b++는 출력 후 b 값을 11로 증가시킵니다.
- st.b는 static 변수 b를 참조하므로 값은 11입니다.
- a는 main 함수의 지역 변수로 값이 10입니다.
- st.a는 인스턴스 변수로 초기값이 20입니다.
출력 결과:
10
11
10
20
class Static {
public int a = 20; // 인스턴스 변수
static int b = 0; // 클래스 변수 (static 변수)
}
public class Test {
public static void main(String[] args) {
int a = 10; // 지역 변수 a 선언 및 초기화
Static.b = a; // 클래스 변수 b에 지역 변수 a의 값(10) 대입
Static st = new Static(); // Static 클래스의 인스턴스 생성
System.out.println(Static.b++); // 10 출력 후 b 값을 1 증가 (후위 연산)
System.out.println(st.b); // 11 출력 (b 값은 증가된 11)
System.out.println(a); // 10 출력 (지역 변수 a의 값은 변하지 않음)
System.out.print(st.a); // 20 출력 (인스턴스 변수 a의 값)
}
}
위 코드는 static 변수와 인스턴스 변수의 차이를 보여주는 예제입니다. 각 출력값을 하나씩 설명하면 다음과 같습니다:
출력값 설명
1. System.out.println(Static.b++);
• Static.b는 static 변수이므로 클래스 이름으로 직접 접근합니다.
• Static.b = 10으로 설정된 상태이기 때문에 Static.b++에서 b의 현재 값인 10이 출력됩니다.
• 후위 증가 연산자 ++는 현재 값을 출력한 후 b를 1 증가시키므로, Static.b는 이제 11이 됩니다.
• 출력값: 10
2. System.out.println(st.b);
• st는 Static 클래스의 인스턴스이지만, b는 static 변수이기 때문에 모든 Static 객체가 동일한 값을 참조합니다.
• st.b는 Static.b와 같은 메모리 위치를 참조하므로 b의 현재 값인 11을 출력합니다.
• 출력값: 11
3. System.out.println(a);
• a는 main 메서드 내부의 지역 변수로, Static.b와 별개의 변수입니다.
• 이 변수는 위에서 Static.b에 할당된 이후 변경되지 않았으므로 여전히 10을 출력합니다.
• 출력값: 10
4. System.out.print(st.a);
• st 객체의 인스턴스 변수 a에 접근합니다.
• a는 Static 클래스의 인스턴스 변수로, static 변수와 달리 객체마다 고유한 값을 가집니다.
• 생성 시 public int a = 20;으로 초기화되었으므로 20이 출력됩니다.
• 출력값: 20
3. 요약
• static 변수 b는 클래스 단위로 관리되므로 클래스명이나 인스턴스명을 통해 접근해도 동일한 값을 참조합니다.
• st.a는 인스턴스 변수이므로 객체별로 고유한 값을 가지며, 클래스 변수와는 다른 메모리 공간에 저장됩니다.
• static 변수는 모든 인스턴스에서 공유되므로 클래스 전체의 공통 상태를 관리할 때 유용합니다.
따라서, 전체 출력 결과는 다음과 같습니다:
10
11
10
20