[Java] 객체 배열 관리

션션·2026년 1월 28일

Java

목록 보기
4/10
post-thumbnail

1. JVM 메모리 구조

자바 가상 머신(JVM)은 효율적인 자원 관리를 위해 메모리를 여러 영역으로 나눕니다. 각 영역의 특징을 이해하는 것이 성능 최적화와 디버깅의 첫걸음입니다.

💡 핵심 영역 3가지

  • 메서드 영역 (Method Area): 모든 스레드가 공유하며, 클래스 정보, static 변수, 상수(final) 등이 저장됩니다. 프로그램 시작 시 로드되는 '설계도' 보관소라고 생각하면 쉽습니다.
  • 힙 영역 (Heap Area): new 키워드로 생성된 실제 객체 인스턴스와 배열이 저장됩니다. 가비지 컬렉터(GC)가 주기적으로 방문하여 쓰이지 않는 객체를 치워주는 '실제 물건' 창고입니다.
  • 스택 영역 (Stack Area): 메서드 호출 시마다 '스택 프레임'이 생성됩니다. 지역 변수와 연산 결과가 잠시 머무는 '개별 작업대'이며, 메서드가 종료되면 즉시 사라집니다.

잠깐! PC 레지스터는 무엇인가요?
현재 실행 중인 명령어의 주소를 저장하여 프로그램 실행 흐름을 제어하는 역할을 합니다.


2. static 키워드

static이 붙은 멤버(필드, 메서드)는 객체 생성 없이도 클래스 이름으로 바로 접근할 수 있습니다.

특징 및 주의사항

  1. 메모리 고정: JVM 로딩 시 메서드 영역에 단 한 번 올라갑니다.
  2. 공유 변수: 모든 인스턴스가 하나의 값을 공유해야 할 때(예: 카운트) 사용합니다.
  3. 접근 제한: static 메서드 안에서는 non-static(인스턴스) 변수를 직접 참조할 수 없습니다. 이유: static은 프로그램 시작 시 이미 메모리에 있지만, 인스턴스 변수는 객체가 생성되어야 힙에 존재하기 때문입니다.

3. 접근 제한자와 캡슐화

데이터를 외부로부터 보호하는 캡슐화(Encapsulation)를 위해 접근 제한자를 적절히 사용해야 합니다.

제한자범위설명
public전체어디서든 접근 가능
protected패키지 + 상속동일 패키지 혹은 다른 패키지의 자식 클래스까지
default패키지동일 패키지 내에서만 가능 (생략 시 기본값)
private클래스동일 클래스 내부에서만 가능

팁: 최상위 외부 클래스에는 publicdefault만 사용할 수 있습니다.


4. 객체 배열 관리 (CRUD) 실습 핵심

객체 배열을 다룰 때 가장 많이 실수하는 부분이 바로 참조(Reference) 개념입니다.

tmp = p; vs arr[i] = p;
데이터를 수정할 때 왜 tmp를 쓰면 안 될까요?

  • 잘못된 예: Person tmp = arr[i]; tmp = newPerson;
  • 결과: tmp라는 이름표만 새로운 객체를 가리키게 되고, 배열 칸(arr[i])이 가리키는 실제 데이터는 변하지 않습니다.
  • 올바른 예: arr[i] = newPerson;
  • 결과: 배열의 해당 칸 자체가 새로운 주소값을 가리키게 되어 수정이 반영됩니다.

삭제(Delete) 로직의 핵심

배열 중간의 데이터를 삭제했다면, 빈 공간을 메우기 위해 데이터를 앞으로 당기는 과정이 필요합니다.

// 데이터를 삭제 후 뒤의 요소들을 한 칸씩 당김
for (int j = i; j < size - 1; j++) {
    arr[j] = arr[j + 1];
}
arr[size - 1] = null; // 마지막 칸 비우기
size--; // 관리하는 데이터 개수 감소

5. 싱글턴 패턴 (Singleton Pattern)

클래스의 인스턴스를 단 하나만 생성하도록 보장하는 디자인 패턴입니다. 매니저 객체처럼 프로그램 전체에서 공유되어야 하는 '중앙 관리자' 역할에 주로 쓰입니다.

구현 3법칙

  1. private 생성자: 외부에서 new를 못 하게 막습니다.
  2. static 변수: 자기 자신의 인스턴스를 담을 공간을 만듭니다.
  3. public static 메서드: getInstance()를 통해 유일한 객체를 반환합니다.

✅ 요약

  • JVM의 메서드 영역은 공유 데이터, 은 객체, 스택은 지역 변수를 저장한다.
  • static 멤버는 클래스 이름으로 접근하며 메모리에 미리 로드된다.
  • protected는 패키지가 달라도 상속 관계라면 접근을 허용한다.
  • 객체 배열 수정 시에는 배열의 인덱스(arr[i])에 직접 새 객체를 대입해야 한다.
  • 싱글턴은 생성자를 private으로 숨기는 것이 핵심이다.

0개의 댓글