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

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

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

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.