[JAVA] 배열 개념 확장 정리

2025. 9. 25. 19:43·JAVA

전반적인 Java 실습을 진행하면서 배열의 개념에 대해 확장해서 넘어갈 필요가 생겼다.

 

내가 구현하고자 했던 방향은 카테고리를 하나의 배열로 관리하고, 카테고리 내 요소 하나하나 당 상품 리스트의 배열이 연결되어 있는 구조로 코드 구성을 해보려 했었다.

 

병렬-단일? 계층-평면? 배열의 구조적 특징과 개념에서의 혼선이 생겼고 이 부분에 대해서 먼저 정리하고, 실제 사용되는 예시와 함께 알아보겠다. 

 

1. 병렬 Vs 단일  (엔티티 표현 축)

  • 병렬 배열(Parallel Arrays) : 속성을 따로따로 배열에 저장 → 인덱스로 맞춤.
    예: names[i], prices[i], stocks[i] → i번째 상품.
    • 장점 : 단순한 구조, 원시타입 배열로서 메모리와 성능 이점이 있을 수 있음
    • 단점 : 인덱스 동기화를 항상 보장해야 해서 실수에 취약, 필드가 늘어날 때 마다 배열을 더 늘려줘야 함
  • 단일 배열 (객체 배열/리스트) : 객체로 묶어서 배열/리스트에 저장.
    예: Product[] products 안에 이름·가격·재고가 다 들어있음.
    • 장점 : 응집도 ↑, 가독성 ↑, 유지보수 ↑, 정렬•검색•필드 확장 쉬움, 버그 발생 여지 ↓
    • 단점 : 원시타입 대비 약간의 메모리 오버헤드와 객체 생성 비용 발생
병렬 배열
names[0] → "콜라"
prices[0] → 1500
stocks[0] → 10

단일 배열
products[0] → Product{name="콜라", price=1500, stock=10}

 

2. 계층 Vs 평면 (엔티티 관계 축)

계층 구조
categories[0] → "음료"
   └ products → ["콜라", "사이다"]

평면 구조
products = [
  {name="콜라", categoryId="음료"},
  {name="사이다", categoryId="음료"}
]
  • 계층(Hierarchical)
    • 상위–하위(트리) 관계를 컬렉션 안에 컬렉션으로 표현.
    • 예: Category → List<Product>
  • 평면(Flat)
    • 관계를 구조로 표현하지 않고 ID/필드값으로만 표현.
    • 예: Product {id, name, categoryId}; List 하나만 관리.

👉 대비 관계: “관계를 구조로 직접 드러낼까? (계층) vs 속성값으로만 들고 있을까? (평면)”

 

3. 정적 Vs 동적 (크기 관계 축)

정적 배열
Product[] products = new Product[10]; // 고정 크기

동적 배열
List<Product> products = new ArrayList<>(); // 자동 확장
  • 정적( T[] )
    • 길이가 고정
    • 빠르지만 길이 변경 불가, 복사 필요
  • 동적 ( ArrayList 등)
    • ArrayList를 기본값으로 둠, 삽입/삭제는 쉬우나 중간 삽입 성능은 떨어짐

 

4. 원시 Vs 참조(저장 대상 축)

원시 배열
int[] stocks = {10, 5, 8}; // 값 자체 저장

참조 배열
Product[] products = {p1, p2, p3}; // 객체 참조 저장
  • 원시 배열(int[], double[] ... )
    • 값 자체를 저장
    • 성능,메모리 효율적이나 객체는 담을 수 없음
  • 참조 (String[], Product[])
    • 객체 참조를 저장
    • 복합 객체를 다룰 수 있으나 힙 객체에 접근하는 비용이 존재

> 단순 수치연산은 원시배열, 복합 데이터는 참조배열이 적합함

 

 

5. 일반 Vs 특수 (용도 축)

일반 배열
boolean[] flags = new boolean[100];

특수 배열
BitSet flags = new BitSet(100); // 같은 목적, 메모리 절약
  • 일반 배열
    • 모든 타입 저장 가능
    • 범용 데이터를 저장하는 용도로 사용
  • 특수 배열
    • BitSet → boolean 대량 플래그
    • AtomicIntegerArray : 원소 단위 원자적 갱신
    • ByteBuffer:파일 네트워크 IO 버퍼

 

배열 관련 내용을 표로 정리하면 아래와 같다 

목적 A B 기본 개념 특징 및 장단점
엔티티 표현 병렬 배열 단일 배열(객체) 속성을 나눠서 담음 vs 객체로 묶음 병렬은 성능 특수, 단일이 실무 기본
관계 표현 계층 구조 평면 구조 상위-하위 트리 vs 한 배열 + ID 평면 원본 + 계층 뷰 조립이 실무 정석
크기 관리 정적 배열 동적 배열(ArrayList) 길이 고정 vs 자동 확장 중간 삽입 성능 차이 주의
저장 대상 원시 배열 참조 배열 값 자체 vs 객체 참조 박싱 비용/메모리 차이
용도 특화 일반 배열 특수 배열(BitSet, AtomicArray 등) 범용 vs 특수 목적 IO, 동시성, 비트 연산 등 최적화

 

목적과 상황에 맞게 적절한 배열을 사용하여 코드 구성을 하면 보다 깔끔하고 개념과 장단점을 잘 살린 배열들로 유지보수할 수 있을 것 같다. 

 

진행하며 배열과 관련된 내용을 추가해 나아가겠다.

'JAVA' 카테고리의 다른 글

[JAVA] 완전탐색 Vs 그리디 알고리즘 이해하기  (0) 2025.09.30
[JAVA] 알고리즘 기본 정리  (0) 2025.09.29
[JAVA] String.format에 대해 알아보기  (0) 2025.09.23
[JAVA] JAVA의 For문에 대해  (0) 2025.09.23
[JAVA] 객체 지향 프로그래밍 개념 정리 (OOP)  (0) 2025.09.19
'JAVA' 카테고리의 다른 글
  • [JAVA] 완전탐색 Vs 그리디 알고리즘 이해하기
  • [JAVA] 알고리즘 기본 정리
  • [JAVA] String.format에 대해 알아보기
  • [JAVA] JAVA의 For문에 대해
stark77
stark77
하마의 IT 자기개발 이모저모, 백엔드 개발자로 거듭나기
  • stark77
    하마의 개발자 성장일기
    stark77
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 컴퓨터구조와 운영체제
        • 컴퓨터구조
        • 운영체제
      • SQL 기초
      • Spring
        • 백엔드 기초
        • Spring 실습
      • JAVA
        • Java 실습
      • HTML&CSS
        • HTML&CSS 실습
      • Git&GitHub
        • Git&GitHub 실습
      • 내배캠 끄적끄적
        • Today I Learned
      • 유용한 툴 및 사이트 정리
      • 취미
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    웹소켓
    Github
    객체지향프로그래밍
    JPA
    RestTemplate
    Spring
    Java 문법기초
    jsp
    HTML&CSS
    MVC
    WebSocket
    경합조건과 교착상태
    for문
    Stomp
    algorithm
    네트워크 기초
    실시간 데이터 처리
    다형성
    java
    백엔드 기초다지기
    Til
    SpringSecurity
    객체지향
    프로세스와 쓰레드
    백엔드 기초
    BEAN
    Spriingboot
    thymleaf
    git
    String.format
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
stark77
[JAVA] 배열 개념 확장 정리
상단으로

티스토리툴바