Cannot make a static reference to the non-static method
조회수 7396회
자바에서 다국어 프로그램을 만들고 있습니다. XML 파일의 R.string
데이터를 문자열 값으로 삽입할 때 에러가 발생합니다.
public static final String TTT = (String) getText(R.string.TTT);
에러 메시지는 다음과 같습니다:
Cannot make a static reference to the non-static method
왜 에러가 발생하고 어떻게 이 문제를 해결할 수 있을지 궁금합니다.
1 답변
-
getText() 메소드는 non-static 이기 때문에 static 메소드에서는 호출할 수 없습니다.
그 이유를 이해하기 위해서는 두 개의 차이를 이해하셔야 합니다.
인스턴스 메소드 (non-static 메소드)는 다음과 같이 특정 타입 (클래스)의 객체가 생성될 때 만들어지고, 해당 객체 내에서 사용될 수 있습니다.
SomeClass myObject = new SomeClass();
인스턴스 메소드를 호출하기 위해서는 객체 변수 (myObject)를 가지고 호출합니다:
yObject.getText(...)
이와 동일하게
myObject.staticMethod()
처럼 객체 변수를 가지고 static 메소드도 호출할 수 있습니다. 그러나 이 방법은 static 메소드를 명확하게 표현하는 방법이 아니기 때문에 권장하는 방법은 아닙니다.그리고 static 메소드와 non-static 메소드는 다른 메모리 영역에 생성되어 동작합니다. static 메소드는 정적 데이터 영역에, non-static 메소드는 스택에 생성됩니다. 그래서 static 메소드는 프로그램 시작시 만들어지고 프로그램이 종료할 때까지 사용할 수 있고, non-static 메소드는 객체가 생성될 때 생성되어 객체가 소멸되면 같이 사라지지요.
가상코드 (psuedocode)로 작성한 다음의 클래스를 가지고 설명해보겠습니다:
class Test { string somedata = "99"; string getText() { return somedata; } static string TTT = "0"; }
다음과 같이 클래스의 객체를 생성하고 사용할 수 있습니다:
Test item1 = new Test(); item1.somedata = "200"; Test item2 = new Test(); Test.TTT = "1";
각 필드들은 무슨 값을 가질까요?
in item1 TTT = 1 and somedata = 200 in item2 TTT = 1 and somedata = 99
TTT는 static 필드로 해당 클래스의 모든 객체들이 공유하는 데이터입니다. 이런 의미에서 다음의 예는 문제가 되겠지요?
class Test { string somedata = "99"; string getText() { return somedata; } static string TTT = getText(); // error there is is no somedata at this point }
여기서 TTT는 왜 static 필드일따요? 왜 getText()는 static 메소드가 아닐까요?
위의 문제를 해결하기 위해서 static이라는 키워드만 제거할 수도 있겠지요. 그러나 각 타입이 어떻게 동작하는지에 대한 이해 없이는 다음 에러가 발생할 때까지의 임시방편일 수 밖에 없는 것이지요.
댓글 입력