Java - 메모리구조와 static

JeongHoHyun·2024년 12월 9일

Java

목록 보기
3/23

✏️ 메모리구조

1. 메소드 영역 (Method Area)

  • 역할
    • 클래스와 관련된 정보가 저장되는 영역.
    • 클래스의 메타데이터, 메서드, 정적변수(static), 상수 풀 등이 저장됨.
  • 특징
    • 모든 스레드가 공유.
    • 클래스 로더에 의해 클래스를 처음 로드할 때 메모리에 할당.
  • 저장내용
    • 클래스명, 클래스 변수(static), 클래스 메서드, 인터페이스 정보 등.

2. 힙 영역 (Heap Area)

  • 역할
    • 객체와 배열이 동적으로 생성되어 저장되는 영역.
    • 대부분의 메모리가 사용되는 공간.
  • 특징
    • 모든 스레드가 굥유.
    • JVM의 GC(Garbage Collector)가 관리하며 더이상 참조되지 않는 객체는 자동으로 삭제
  • 저장내용
    • 객체(instance), 배열, 클래스 멤버 변수

3. 스택 영역 (Stack Area)

  • 역할

    • 메서드 호출 시 생성되는 지역변수와 메서드 실행순서(스택 프레임)가 저장되는 영역.
  • 특징

    • 각 스레드마다 독립적으로 할당됨.
    • 메서드의 호출이 끝나면 해당 스택 프레임이 제거됨 (후입선출, Last In First Out - LIFO)
  • 저장 내용

    • 지역 변수, 메서드 호출 정보, 참조 변수의 주소 값.

⚡️ static

static 변수의 특징 (장점)

  • 자바의 static 변수는 클래스 단위로 관리되는 변수이다.
  • 객체마다 별도로 생성되지 않고 클래스에 한 번만 메모리에 할당되어 모든 객체가 공유한다.
  1. 클래스 단위로 관리 (메모리 절약)
    • 클래스 로딩 시 메모리에 할당되며, 프로그램 종료 시까지 유지
    • 객체의 생성여부와 상관없이 사용 가능
  2. 공유 변수 (데이터 공유)
    • 클래스의 모든 객체가 동일한 값을 공유한다.
    • 한 객체에서 static 변수 값을 변경하면 다른 객체에서도 그 변경 사항을 반영한다.

static 변수의 주의점

  1. 전역 변수처럼 오용 가능성
    • 모든 객체가 값을 공유하기 때문에, 하나의 객체에서 값을 변경하면 다른 객체에도 영향을 미친다.
    • 값이 변경되면 어디서 변경되었는지 추적하기 어려울 수 있다.
  2. 초기화 주의
    • 클래스 로딩 시 초기화되므로 객체 생성과 무관하게 초기화 순서를 고려해야 한다.
  3. 쓰레드 안전성 문제
    • 멀티쓰레드 환경에서 동시에 static 변수에 접근하면 데이터 충돌이 발생할 수 있으므로 동기화가 필요 할 수 있다.

static 메서드

  • 정적메서드는 객체 생성 없이 클래스에 있는 메서드를 바로 호출할 수 있다는 장점이 있다.
  • 하지만 정적 메서드는 언제나 사용할 수 있는 것이 아니다.

static 메서드 사용법

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

    • 클래스 내부의 기능을 사용할 때, 정적 메서드는 static이 붙은 정적메서드나 정적 변수만 사용할 수 있다. (인스턴스 메서드, 인스턴스 변수는 호출 불가능 -> static은 클래스 레벨에서 관리되기 때문이다.)
    • 클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스변수나, 인스턴스 메서드를 사용할 수 없다.
  • 모든곳에서 static을 호출할 수 있다.

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

0개의 댓글