프로그래밍 언어/Java

java 2강 - 1 Cannot make a static reference to the non-static method 에러 (class와 instance의 관계)

happy_life 2021. 10. 15. 11:56

클래스메소드와 인스턴스 메소드의 관계

 

1.인스턴스 메소드는 클래스 맴버(변수,메소드)에 접근 할 수 있다.

2.클래스 메소드는 인스턴스 맴버(변수,메소드)에 접근 할 수 없다.

 

▼아래의 예제를 하나하나 실행해보면서 적용해보면 이해가 갑니다.

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 exercise{
	public static void main(String[] args) {
		C1 c = new C1();
		
		//인스턴스를 이용해 정적 메소드에 접근 -> 성공
		//인스턴스 메소드가 정적 변수에 접근 -> 성공
		c.static_static();
		
		//인스턴스를 이용해 정적 메소드에 접근 -> 성공
		//정적 메소드가 인스턴스 변수에 접근 -> 실패
		c.static_instance();
		
		//인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
		//인스턴스 메소드가 클래스 변수에 접근 -> 성공
		c.instance_static();
		
		//클래스를 이용해서 클래스 메소드에 접근 -> 성공
		//클래스 메소드가 클래스 변수에 접근 -> 성공
		C1.static_static();
		
		//클래스를 이용해서 클래스 메소드에 접근 -> 성공
		//클래스 메소드를 이용해서 인스턴스 변수에 접근 -> 실패
		C1.static_instance();
		
		//클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
		C1.instance_instance();
	}
}

한편,

static void static_instance() {
		//클래스 메소드에서는 인스턴스 변수에 접근할 수 없다.
		System.out.println(instance_variable);
	}

▲이부분을 활성화시키고 코드를 돌리면

 

이런 오류가 뜹니다. 이는 말그대로 static(class)에서 non-static 을 참조할 수 없다는 뜻입니다.

 

용어정리

 

인스턴스 변수 -> Non-Static Field

클래스 변수 -> Static Field

 

 

C1.instance_instance();

 

▲이부분의 코드를 실행시키면 

이러한 에러가 발생합니다. 이는 위와 같은 이유로 오류가 발생하는 것입니다.

 

즉 결론적으로 

클래스 메소드는 인스턴스 맴버(변수,메소드)에 접근 할 수 없기 때문에 오류가 발생하는 것입니다.