인프런 커뮤니티 질문&답변

cpu님의 프로필 이미지
cpu

작성한 질문수

김영한의 실전 자바 - 기본편

static 메서드1

인스턴스 메서드와 클래스 메서드

작성

·

170

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
클래스 메서드와 인스턴스 메서드 모두 메서드 영역에 존재한다고 하셨는데, 클래스 메서드는 인스턴스 생성 없이도 사용 가능하지만 인스턴스 메서드는 인스턴스 생성 없이는 사용이 불가능한 걸로 이해했습니다. 그럼 Java 내부적으로 같은 메서드 영역에 속한 클래스 메서드와 인스턴스 메서드를 어떻게 구분하여 클래스 메서드는 사용 가능하도록, 인스턴스 메서드는 사용 불가능하도록 처리하는 것인가요?

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. cpu님

Java에서 클래스 메서드(정적 메서드)와 인스턴스 메서드가 같은 메서드 영역(Method Area)에 속하면서도 서로 다르게 동작하는 이유는 다음과 같은 메커니즘에 의해서입니다.

 

메서드 영역

메서드 영역(Method Area)은 JVM이 로드한 클래스의 구조 정보를 저장하는 영역입니다. 이 영역에는 클래스 메서드(정적 메서드)와 인스턴스 메서드 모두가 포함됩니다. 그러나 이 둘은 다음과 같은 차이점이 있습니다.

 

클래스 메서드 (정적 메서드)

  • 정적 메서드static 키워드로 선언됩니다.

  • 클래스 수준에서 호출되며, 인스턴스 생성 없이도 사용 가능합니다.

  • 클래스 로딩 시점에 메서드 영역에 로드됩니다.

  • 메서드 호출 시, 인스턴스의 참조가 필요하지 않기 때문에 this 키워드를 사용할 수 없습니다.

인스턴스 메서드

  • 인스턴스 메서드static 키워드 없이 선언됩니다.

  • 인스턴스 수준에서 호출되며, 반드시 인스턴스를 생성한 후에만 사용할 수 있습니다.

  • 인스턴스 생성 시점에 인스턴스와 함께 메서드 영역에 로드됩니다.

  • 메서드 호출 시, 해당 인스턴스의 참조가 필요하며, this 키워드를 통해 인스턴스의 필드와 다른 메서드에 접근할 수 있습니다.

내부 동작 메커니즘

  1. 클래스 로딩: JVM이 클래스를 로딩할 때, 클래스의 모든 메서드(정적 메서드와 인스턴스 메서드 포함)가 메서드 영역에 로드됩니다.

  2. 정적 메서드 호출: 정적 메서드는 클래스 이름을 통해 호출됩니다. 호출 시에는 인스턴스 참조가 필요 없으므로, JVM은 단순히 메서드 영역에서 해당 메서드를 찾아 실행합니다.

    MyClass.myStaticMethod();
  3. 인스턴스 메서드 호출: 인스턴스 메서드는 인스턴스를 통해 호출됩니다. 호출 시 JVM은 해당 인스턴스의 참조를 전달받아 메서드 영역에서 메서드를 찾고, 인스턴스 참조(this)와 함께 메서드를 실행합니다.

    MyClass myObject = new MyClass();
    myObject.myInstanceMethod();

메서드 호출 시 JVM의 처리 과정

  • 정적 메서드 호출 시: JVM은 메서드 영역에서 해당 메서드를 바로 찾아 실행합니다. 인스턴스 참조가 없기 때문에 this 키워드를 사용할 수 없습니다.

  • 인스턴스 메서드 호출 시: JVM은 해당 인스턴스의 참조를 기반으로 메서드 영역에서 메서드를 찾아 실행합니다. 이 때, 인스턴스 참조는 this 키워드로 전달됩니다.

이러한 메커니즘을 통해 JVM은 클래스 메서드와 인스턴스 메서드를 구분하여 처리합니다. 클래스 메서드는 인스턴스 생성 없이도 호출 가능하며, 인스턴스 메서드는 반드시 인스턴스를 통해서만 호출될 수 있도록 설계되어 있습니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

cpu님의 질문과 관련된 내용이 제공된 정보에는 없습니다. 학습에 관련된 다른 질문이 있으시면 언제든지 도움을 드릴 수 있도록 노력하겠습니다. 인프런의 강의 관련 질문이나 특정 프로그래밍 개념에 대한 궁금증이 있으시면, 자세한 내용과 함께 질문해 주세요.

cpu님의 프로필 이미지
cpu

작성한 질문수

질문하기