일급 객체
일급 객체(First-class citizen)는 다른 요소들과 동등한 자격을 가지는 요소를 말합니다.
일급 객체의 조건
- 변수에 할당할 수 있다
- 함수의 인자로 전달할 수 있다
- 함수의 반환값으로 사용할 수 있다
예시: JavaScript의 함수
JavaScript에서 함수는 일급 객체입니다.
// 1. 변수에 할당
const greet = function(name) {
return `Hello, ${name}`;
};
// 2. 함수의 인자로 전달
function execute(fn, value) {
return fn(value);
}
execute(greet, "Alice"); // "Hello, Alice"
// 3. 함수의 반환값으로 사용
function createMultiplier(n) {
return function(x) {
return x * n;
};
}
const double = createMultiplier(2);
double(5); // 10
Java에서의 비교
// Java에서 메서드는 일급 객체가 아님
public int add(int a, int b) {
return a + b;
}
// X 메서드를 변수에 직접 할당 불가
var fn = add;
// Java 8부터 람다로 유사하게 가능
Function<Integer, Integer> fn = x -> x * 2;
일급 컬렉션
일급 객체 개념을 컬렉션에 적용한 것입니다.
// 일급 컬렉션 아님
public class Order {
private List<OrderItem> items; // 컬렉션이 그냥 필드로 존재
private String orderId;
// ...
}
// 일급 컬렉션
public class OrderItems { // 컬렉션을 감싼 별도 클래스
private final List<OrderItem> items;
public int getTotalPrice() {
return items.stream()
.mapToInt(OrderItem::getPrice)
.sum();
}
public int count() {
return items.size();
}
}
일급 컬렉션의 장점
| 장점 | 설명 |
|---|---|
| 비즈니스 로직 응집 | 컬렉션 관련 로직이 한 곳에 모임 |
| 불변성 보장 | 외부에서 컬렉션 직접 수정 방지 |
| 상태와 행위 결합 | 데이터와 관련 메서드가 함께 존재 |
| 의미 부여 | List<OrderItem> → OrderItems로 명확한 이름 |
요약
일급 객체는 변수 할당, 인자 전달, 반환값 사용이 가능한 요소이며, 이 개념을 활용하면 더 유연하고 응집도 높은 코드를 작성할 수 있습니다.