(모각소2024) 자바 메모리 구조와 static

LEEHYUNJE·2024년 7월 27일
0

아주대학교_모각소!

목록 보기
12/23

자바 메모리 구조

  • 메서드 영역: 메서드 영역은 프로그램을 실행한은데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.

    • 클래스 정보 : 클래스의 실행코드(바이트 코드), 필드, 메서드와 생성자 코드 등 모든 실행코드가 존재한다.
    • static 영역 : static 변수들을 보관한다.
    • 런타임 상수 풀: 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다. 예를 들어 "hello"와 같은 리터럴 문자를 메모리 효율을 위해 공간에 저장해놓고 이를 참조하는 형식으로 사용하는 방법이다.
  • 스택 영역(Stack Area) : 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.

    • 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다.
  • 힙 영역(Heap Area) : 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영
    역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.

    참고: 스택 영역은 더 정확히는 각 쓰레드별로 하나의 실행 스택이 생성된다. 따라서 쓰레드 수 만큼 스택 영역이
    생성된다. 지금은 쓰레드를 1개만 사용하므로 스택 영역도 하나이다. 쓰레드에 대한 부분은 멀티 쓰레드를 학습해
    야 이해할 수 있다.

인스턴스와 메서드의 관계


자바에서 특정 클래스로 100개의 인스턴스를 생성하면, 힙 메모리에 100개의 인스턴스가 생긴다. 각각의 인스턴스는 내부에 변수와 메서드를 가진다.
같은 클래스로 부터 생성된 객체라도, 인스턴스 내부의 변수 값은 서로 다를 수 있지만,
메서드는 공통된 코드를 공유한다. 따라서 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없다.
메서드는 메서드 영역에서 공통으로 관리되고 실행된다.
정리하면 인스턴스의 메서드를 호출하면 실제로는 메서드 영역에 있는 코드를 불러서 수행한다.

static

  • static 이 붙은 멤버 변수는 메서드 영역에서 관리된다
    • static이 붙은 멤버 변수 count는 인스턴스 영역에 생성되지 않는다. 대신에 메서드 영역에서 변수를 관리한다.

static의 특징

정적 메서드는 객체 생성없이 클래스에 있는 메서드를 바로 호출할 수 있다는 장점이 있다.

package static2;
public class DecoMain2 {
 public static void main(String[] args) {
 String s = "hello java";
 String deco = DecoUtil2.deco(s);
 System.out.println("before: " + s);
 System.out.println("after: " + deco);
 }
}

위 코드에서 확인할 수 있듯. DecoUtil2 클래스에서 바로 deco 정적메서드를 호출한 모습.

하지만 모든 정적메서드를 언제나 사용할 수 있을까?

정적 메서드 사용법

  • static 메서드는 static만 사용할 수 있다.

    • 클래스 내부의 기능을 사용할 때, 정적 메서드는 static이 붙은 정적 메서드나 정적 변수만 사용할 수 있다.
    • 클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다.
  • 반대로 모든 곳에서 static을 호출할 수 있다.

    • 정적 메서드는 공용 기능이다. 따라서 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static을 호출할 수 있다.

      package static2;
      public class DecoDataMain {
      public static void main(String[] args) {
      System.out.println("1.정적 호출");
      DecoData.staticCall();
      System.out.println("2.인스턴스 호출1");
      DecoData data1 = new DecoData();
      data1.instanceCall();
      
      System.out.println("3.인스턴스 호출2");
      DecoData data2 = new DecoData();
      data2.instanceCall();
      }
      }

정적 메서드가 인스턴스의 기능을 사용할 수 없는 이유
정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그래서 인스턴스처럼 참조값의 개념이 없다. 특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출한다. 따라서 정적 메서드 내부에서 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다.

멤버 변수의 종류

  • 인스턴스 변수: static이 붙지 않은 멤버 변수
    • static이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다. 따라서 인스턴스 변수라 한다.
    • 인스턴스 변수는 인스턴스를 만들 때 마다 새로 만들어진다.
  • 클래스 변수: static이 붙은 멤버 변수
    • 클래스 변수, 정적 변수, static 변수등으로 불린다. 모두 사용될 수 있으니 주의
    • static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고, 클래스 자체에 소속되어 있다. 따라서 클래스 변수라 한다.
    • 클래스 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어진다. 인스턴스와는 다르게 보통 여러곳에서 공유하는 목적으로 사용된다.

모각소 소감

오랜만에 java의 메모리할당에 대해서 복습했다. 왜 7월 초에 시작한 모각소를, 늦게 진행한 이유는 7월 5일부터 시작한 sw융합창업캠프에 참여했기 때문이다. 정말 팀원들과 열심히했고, 최종발표날에 발표도 정말 완벽했다고 생각했지만, 수상을 하지 못해 아쉬움이 정말 많이 남는다. 오늘 모각소도 운동을 3시간을 했는데도 화가 풀리지 않아 진행하게 되었다. 다음 대회는 진짜 안봐주니까 일단 모각소를 통해서 다음을 위해 역량을 쌓아야겠다.

profile
현재진행중

0개의 댓글