Cannot make a static reference to the non-static method


자바에서 다국어 프로그램을 만들고 있습니다. XML 파일의 R.string 데이터를 문자열 값으로 삽입할 때 에러가 발생합니다.

public static final String TTT =  (String) getText(R.string.TTT);

에러 메시지는 다음과 같습니다:

Cannot make a static reference to the non-static method

왜 에러가 발생하고 어떻게 이 문제를 해결할 수 있을지 궁금합니다.

  • 2016년 05월 20일에 작성됨

조회수 106


1 답변


좋아요
0
싫어요
채택취소하기

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이라는 키워드만 제거할 수도 있겠지요. 그러나 각 타입이 어떻게 동작하는지에 대한 이해 없이는 다음 에러가 발생할 때까지의 임시방편일 수 밖에 없는 것이지요.

  • 2016년 05월 21일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close