- 클래스 변수는 static으로 선언되지만,
인스턴스 변수는 staitc으로 선언되지 않음 - 클래스 변수는 '클래스명.정적변수명' 또는 '인스턴스명.정적변수명'으로 표기해 사용할 수 있음
class Calculator {
int r;
// 인스턴스 변수
static double PI = 3.14;
// 클래스 변수
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
System.out.println(c1.PI);
// 인스턴스를 통해서 PI에 접근
System.out.println(Calculator.PI);
// 클래스를 통해서 PI에 접근
}
}
- <클래스 변수의 용도>
① 인스턴스에 따라서 변하지 않는 값이 필요한 경우
② 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
③ 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우
public class Calculator2 {
static double Pi = 3.14;
static int base = 0;
int left, right;
public void setOperation(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right + base);
}
public static void main(String[] args) {
Calculator2 c1 = new Calculator2();
c1.setOperation(10, 20);
c1.sum(); // 30
Calculator2 c2 = new Calculator2();
c2.setOperation(20, 40);
c2.sum(); // 60
Calculator2.base = 10;
c1.sum(); // 40
c2.sum(); // 70
// 클래스 변수 값의 변경 사항을 모든 인스턴스가 공유
}
}
- 클래스 메소드는 클래스에 직접 접근함으로써 사용됨
- 클래스 메소드는 인스턴스 멤버에 접근할 수 없지만,
인스턴스 메소드는 클래스 멤버에 접근할 수 있음
class C1 {
static int static_variable = 1;
int instance_variable = 2;
static void static_static() {
System.out.println(static_variable);
// 클래스 메소드에서는 클래스 변수에 접근할 수 있음
}
static void static_instance() {
System.out.println(instance_variable); // 에러
// 클래스 메소드에서는 인스턴스 변수에 접근할 수 없음
}
void instance_static() {
System.out.println(static_variable);
// 인스턴스 메소드에서는 클래스 변수에 접근할 수 있음
}
void instance_instance() {
System.out.println(instance_variable);
// 인스턴스 메소드에서는 인스턴스 변수에 접근할 수 있음
}
}
public class ClassMemberDemo {
public static void main(String[] args) {
C1 c = new C1();
c.static_static();
// 인스턴스를 이용해서 정적 메소드에 접근 ➝ 성공
// 정적 메소드가 정적 변수에 접근 ➝ 성공
c.static_instance();
// 인스턴스를 이용해서 정적 메소드에 접근 ➝ 성공
// 정적 메소드가 인스턴스 변수에 접근 ➝ 실패
c.instance_static();
// 인스턴스를 이용해서 인스턴스 메소드에 접근 ➝ 성공
// 인스턴스 메소드가 클래스 변수에 접근 ➝ 성공
c.instance_instance();
// 인스턴스를 이용해서 인스턴스 메소드에 접근 ➝ 성공
// 인스턴스 메소드가 인스턴스 변수에 접근 ➝ 성공
C1.static_static();
// 클래스를 이용해서 클래스 메소드에 접근 ➝ 성공
// 클래스 메소드가 클래스 변수에 접근 ➝ 성공
C1.static_instance();
// 클래스를 이용해서 클래스 메소드에 접근 ➝ 성공
// 클래스 메소드가 인스턴스 변수에 접근 ➝ 실패
C1.instance_static();
// 클래스를 이용해서 인스턴스 메소드 메소드에 접근 ➝ 실패
C1.instance_instance();
// 클래스를 이용해서 인스턴스 메소드 메소드에 접근 ➝ 실패
}
}