자바 정적 메소드에서 비정적 메소드 호출 관련 질문

조회수 741회

정적 메소드에서 비정적 메소드나 인스턴스 변수들을 호출하지 못하는 이유를 잘 모르겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 비정적 메소드는 해당 클래스를 가지고 인스턴스를 생성할 때 메모리에 올라갑니다.

    정적 메소드는 클래스 데이터가 메모리에 올라갈 때 같이 올라갑니다.

    정적 메소드는 이미 메모리 올라가있기 때문에 인스턴스 없이 호출 할 수 있지만, 그 순간, 비정적 메소드도 메모리에 올라가있는지 아닌지 알 수 없기 때문에 정적 메소드에서 비정적 메소드를 부르는걸 막아두었습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 바이트코드를 읽을 수 있다면 바이트코드를 보면 이해가 될겁니다.

    그런데 사실 바이트코드를 읽을 수 있었다면 애초에 질문을 안올렸겠죠.

    객체지향 언어에서는 this 라는 것이 있게 마련입니다.

    c++, java 는 this 로 python 은 첫 인수로 통상 self 를 사용합니다.

    큰 차이는 정적 메소드는 this를 사용하지 않는다는 겁니다.

    this(aload_0) 를 사용하지 않기 때문에 인스턴스 메소드를 정적 메소드에서 직접 호출 할 수 없습니다.

    자바개발자라면 필히 jvm 이 바이트코드 실행하는 것을 학습하시기 바랍니다.

    일단 질문에 대해 간단하게 답만 알려드리면 바이트코드에서 aload_0 값이 인스턴스 변수라는 것이고 인스턴스 메소드에서는 aload_0 값이 variable array 에 항상 존재한다는 가정하에 수행한다는 사실입니다.

    그 반면에 정적 메소드는 생성자를 호출하지 않기 때문에 aload_0 값은 첫번째 변수값이 들어갑니다. 즉 this가 없고 variable array 에 this 가 없기 때문에 정적메소드에서 인스턴스 메소드를 바로 호출할 수 없습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)