자바 정적 메소드에서 비정적 메소드 호출 관련 질문
조회수 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 가 없기 때문에 정적메소드에서 인스턴스 메소드를 바로 호출할 수 없습니다.
댓글 입력