happyjeong97.log
로그인
happyjeong97.log
로그인
Java - 메모리구조와 static
JeongHoHyun
·
2024년 12월 9일
팔로우
0
Java
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 변수는 클래스 단위로 관리되는 변수이다.
객체마다 별도로 생성되지 않고 클래스에 한 번만 메모리에 할당되어 모든 객체가 공유한다.
클래스 단위로 관리 (메모리 절약)
클래스 로딩 시 메모리에 할당되며, 프로그램 종료 시까지 유지
객체의 생성여부와 상관없이 사용 가능
공유 변수 (데이터 공유)
클래스의 모든 객체가 동일한 값을 공유한다.
한 객체에서 static 변수 값을 변경하면 다른 객체에서도 그 변경 사항을 반영한다.
static 변수의 주의점
전역 변수처럼 오용 가능성
모든 객체가 값을 공유하기 때문에, 하나의 객체에서 값을 변경하면 다른 객체에도 영향을 미친다.
값이 변경되면 어디서 변경되었는지 추적하기 어려울 수 있다.
초기화 주의
클래스 로딩 시 초기화되므로 객체 생성과 무관하게 초기화 순서를 고려해야 한다.
쓰레드 안전성 문제
멀티쓰레드 환경에서 동시에 static 변수에 접근하면 데이터 충돌이 발생할 수 있으므로 동기화가 필요 할 수 있다.
static 메서드
정적메서드는 객체 생성 없이 클래스에 있는 메서드를 바로 호출할 수 있다는 장점이 있다.
하지만 정적 메서드는 언제나 사용할 수 있는 것이 아니다.
static 메서드 사용법
static 메서드는 static만 사용할 수 있다.
클래스 내부의 기능을 사용할 때, 정적 메서드는 static이 붙은 정적메서드나 정적 변수만 사용할 수 있다. (인스턴스 메서드, 인스턴스 변수는 호출 불가능 -> static은 클래스 레벨에서 관리되기 때문이다.)
클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스변수나, 인스턴스 메서드를 사용할 수 없다.
모든곳에서 static을 호출할 수 있다.
정적 메서드는 공용기능이다. 따라서 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static을 호출할 수 있다.
JeongHoHyun
Java Back-End 2022.11.01 💻~ing
팔로우
이전 포스트
Java - 접근제어자 (캡슐화)
다음 포스트
Java - final
0개의 댓글
댓글 작성