[JAVA] Java 메모리 구조 및 Static

SmileJun·2025년 8월 7일

Java

목록 보기
5/8

자바의 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 3개로 나눌 수 있다.

  • 메소드 영역 : 클래스 정보를 보관(클래스의 실행 코드 ,필드, 메소드와생성자 코드 등 모든 실행 코드), static 영역

  • 스택 영역 : 실제 프로그램이 실행되는 영역. 메서드를 실행할 때마다 하나씩 쌓인다.

  • 힙 영역 : 객체가 생성되는 영역. new 명령어를 사용하면 이 영역을 사용한다. 가비지 컬렉션이 이루어지는 주요 영역

  • 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수를 관리한다.

non-static 멤버(인스터스 멤버)

  • 멤버는 객체마다 별도로 존재한다.

  • 객체 생성 시에 멤버가 생성된다.

  • 객체가 생길 때 멤버가 생성되기 때문에 객체 생성 후 멤버 사용이 가능하다.

  • 객체가 사라지면 멤버도 사라진다.

  • 멤버는 객체 내에 각각의 공간을 유지하기 때문에 공유되지 않는다.


static 멤버 (클래스 멤버)

  • 멤버는 클래스 당 하나가 생성된다.

  • 멤버는 객체 내부가 아닌 별도의 공간에 생성된다.

  • 클래스 로딩 시에 멤버가 생성되기 때문에 객체가 생기기 전에 이미 생성된다.

  • 객체를 생성하지 않고도 사용할 수 있다.

  • 객체가 사라져도 멤버는 사라지지 않는다.

  • 멤버는 프로그램이 종류될 때 사라진다.

  • 동일한 클래스의 모든 객체들에 의해 공유된다.

  • 전역 변수나 전역함수는 static으로 클래스에 작성한다.

접근성

  • static 메서드는 non-static 멤버에 접근할 수 없다.

  • non-static 메서드는 static 멤버 사용가능하다.

  • static 메서드는 this 사용 불가하다.

main 메서드가 static인 이유

public static void main(String[] args){...}

Java 프로그램이 실행되면 JVM은 클래스를 로드하고, 아직 그 클래스의 인스턴스를 만들지 못한 상태이다. 하지만 main 메서드는 프로그램의 진입점이기 때문에 아무 준비없이 접근할 수 있어야 한다. 따라서 JVM은 인스턴스가 없는 클래스인 main()을 호출해야하기 때문에 static이어야 한다.

final

  • 변수나 메서드 또는 클래스가 '변경 불가능' 하도록 만든다.

  • 기본형 변수에 사용하면 값을 변경할 수 없다.

  • 참조형 변수에 사용하면 참조값을 변경할 수 없다(힙 내의 다른 객체를 가리키도록 변경x, 하지만 참조 대상의 객체 값은 변경할 수 있다.)

  • 메서드에 사용하면 해당 메서드를 override할 수 없다.

  • 클래스에 사용하면 해당 클래스의 하위 클래스를 정의할 수 없다.

profile
하루하루는 성실하게, 인생 전체는 되는대로

0개의 댓글