자료제공 : 류카토 (http://ryukato.egloos.com/)
빈번한예제참고 : 난정말자바를공부한적이없다구요 (저자:윤성우)
- 개요
Instance Member, Class Member
- 요점
1. 인스턴스 메소드는 클래스 멤버에 접근 할 수 있다.
2. 클래스 메소드는 인스턴스 멤버에 접근 할 수 없다.
인스턴스 변수는 인스턴스가 만들어지면서 생성되는데, 클래스 메소드는 인스턴스가 생성되기 전에 만들어지기 때문에 클래스 메소드가 인스턴스 맴버에 접근하는 것은 존재하지 않는 인스턴스 변수에 접근하는 것과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | public class Calculator { 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 CalculatorDemo1 { public static void main(String[] args) { Calculator c = new Calculator(); // 인스턴스에서 정적 메소드에 접근 -> 성공 // 인스턴스 메소드에서 정적 변수에 접근 -> 성공 c.static_static(); System.out.println("---------------------------------------------001"); // 인스턴스에서 정적 메소드에 접근 -> 성공 // 정적 메소드에서 인스턴스 변수에 접근 -> 실패 c.static_instance(); System.out.println("---------------------------------------------002"); // 인스턴스에서 인스턴스 메소드에 접근 -> 성공 // 인스턴스 메소드에서 클래스 변수에 접근 -> 성공 c.instance_static(); System.out.println("---------------------------------------------003"); // 인스턴스에서 인스턴스 메소드에 접근 -> 성공 // 인스턴스 메소드에서 인스턴스 변수에 접근 -> 성공 c.instance_instance(); System.out.println("---------------------------------------------004"); // 클래스에서 클래스 메소드에 접근 -> 성공 // 클래스 메소드에서 클래스 변수에 접근 -> 성공 Calculator.static_static(); System.out.println("---------------------------------------------005"); // 클래스에서 클래스 메소드에 접근 -> 성공 // 클래스 메소드에서 인스턴스 변수에 접근 -> 실패 Calculator.static_instance(); System.out.println("---------------------------------------------006"); // 클래스에서 인스턴스 메소드에 접근 -> 실패 // C1.instance_static(); // 클래스에서 인스턴스 메소드에 접근 -> 실패 // C1.instance_instance(); } } | cs |
1 2 3 4 5 6 7 8 9 10 | class AAA { int num1; static int num2; static void changeNum() { num1++; //문제 됨 num2++; //문제 안됨 } ... } | cs |
단순히 위의 changeNum() 메소드 호출을 생각하면 크게 문제가 되지 않을 것이라고 생각할 수 있다.
하지만 변수 num1은 인스턴스 변수이고, num2는 static 으로 선언된 클래스 변수이다.
changeNum() 메소드 역시 클래스 메소드이므로 클래스 멤버에서 인스턴스 멤버의 접근이 불가능하다.
예제3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class AAA { static int cnt = 0; public static void makeAAA(int n) { cnt++; if (n == 0) { System.out.println("println cnt ... " + cnt); } else { System.out.println("println other cnt ... " + cnt); } } public static void main(String[] args) { AAA a1 = new AAA(); //AAA class 의 instance 생성 a1.makeAAA(1); //instance method 호출 (이지만 class method) AAA.makeAAA(1); //class method 호출 Error } } | cs |
반응형