전반적인 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 |