[Java] 필드와 메서드

박채은·2022년 11월 7일
0

Java

목록 보기
14/30

필드와 메서드

static 키워드가 붙은 멤버를 정적 멤버(static member)라고 부른다.

정적 멤버(static 변수/메서드)는 인스턴스를 따로 생성하지 않아도, 클래스명.멤버명으로 사용 가능하다.
(물론 정적 멤버도 객체를 생성한 이후 참조변수를 통해 사용이 가능하지만, 정적 멤버임을 표시하기 위해서 클래스명.멤버명 의 형태로 사용할 것을 권장하고 있다.)

필드(멤버 변수)

클래스에 포함된 변수

필드는 두 가지 변수로 나뉜다.

1) 클래스 변수

  • static 변수
  • 공통된 값을 공유

2) 인스턴스 변수

  • non-static 변수
  • heap 메모리에 생성되며, 인스턴스마다 독립적인 저장 공간을 가진다. (객체마다 고유한 값을 갖는다.)

메서드

1) 클래스 메서드(정적 메서드)
2) 인스턴스 메서드


static/instance

⭐ 정적 메서드 내부에서는 (자기 자신의) 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다.

정적 메서드는 인스턴스의 생성 없이 호출이 가능하다.
정적 메서드가 호출되었을 때, 인스턴스가 존재하지 않을 수 있기 때문에 정적 메서드 내부에서는 인스턴스 변수/메서드는 사용 불가능하다!

이를 좀 더 자세하게, 설명해보자면


프로그램 실행 과정

컴파일러가 바이트 코드(.class)를 만들 때까지가 컴파일 타임이고
컴파일을 마친 후, 바이트 코드(.class)를 JVM이 해석/실행하는 순간부터 런타임이다.

컴파일이 완료되고 클래스 로더가 바이트 코드(.class)를 가져와서 클래스 영역에 로드했을 때, 클래스와 static 메모리가 할당되어 static 멤버를 사용할 수 있게 된다.

인스턴스 변수는 런타임 중 new 연산자를 만났을 때, 힙 영역에 메모리를 할당받아 생성되고 이후에 사용할 수 있다.

즉, static 멤버는 런타임 내내 언제나 사용이 가능하지만, static 멤버를 사용하는 시점에 인스턴스 멤버가 존재한다는 것을 확신할 수가 없다.
이러한 이유로 static 멤버(메서드/내부 클래스)에선 인스턴스 멤버를 사용할 수 없다!
(컴파일 -> 런타임 때 언제 생성되고 로드 되는지에 따라서, 시점에 따라서 달라지는 문제에요)

0개의 댓글