이 글은 모든지 검색하면 나오는 도라에몽 향로님의 일급 컬렉션의 소개와 써야할 이유 글을 참조했습니다.
향로님의 글을 복붙한 글은 많았지만 왜 일급 컬렉션은 멤버변수가 1개만 존재해야 하는지, 일급이란 표현은 왜 썼는지에 대한 근원적인 궁금함이 해소하고자 써보는 글 입니다.
일단 그 시작은 왜 '일급'인지에 대한 궁금함에서 시작합니다.
일급(First-Class)이란?
일급이라는 표현은 '1등 시민, 2등 시민'이라는 용어에서 나온 표현입니다.
그걸 컴퓨터 용어에 최초로 접목시켜서 헷갈리게 만든 사람이 바로 아래 장발 신사분.
사회적으로 1등 시민은 언제 어디서든 차별을 받지 않는 시민을 말하고 2등 시민은 언제 어디서든 차별을 받는 시민을 말합니다.
그래서 컴퓨터 용어에서 '일급'이라는 표현은 위의 개념에 접목시켜 언제 어디서든 사용할 수 있다라는 개념에서 시작합니다.
일급 객체(First-Class Citizen)
일급 객체에서의 객체는 Java에서 말하는 클래스, 객체에서의 객체가 아니고 현실 세계 개념에서 비유될 수 있는 Citizen(시민)을 사용합니다.
Citizen이 될 수도 있고 Type, Object, Entity, Value 등 모두 가능하며 모두 비슷한 의미에서 쓰입니다.
그래서 이 아래 쓰일 객체들도 위와 같은 개념에서 설명하는 걸로 인지하고 봐주시면 됩니다.
일급 객체는 위에서 설명했듯 언제 어디서든 사용한 객체를 의미합니다.
언제 어디서든 사용한 객체를 충족하기 위해선 아래의 조건을 충족해야 합니다.
1. Parameter 전달이 가능하다.
2. Return 값으로 사용된다.
3. 변수에 할당할 수 있다.
물론 위의 조건 말고도 다른 조건도 있을 수도 있습니다. 다만, 통상적인 의미에서의 일급 객체의 조건은 위의 3개라고 보면 됩니다.
위의 조건에 어긋나는 예(3번 조건)는 아래와 같습니다.
String a = private void test(){
//이런건 안됩니다.
}
Java에서의 함수(메소드)는 변수에 할당할 수 없습니다.
하지만 람다식이 나오고 나서는 아래와 같이 람다 함수가 변수로 할당이 가능해졌습니다.
그 외의 조건인 Parameter 전달, Return 값 전달 등 람다식을 이용한다면 모두 충족이 가능한 조건 입니다.
a = () -> {
//이런건 돼요.
};
그래서 Java 8에서 처음 등장한 람다식은 일급 객체라고 불릴 수 있습니다.
Java 8 이전에는 클래스의 객체(Object), 변수는 항상 일급 객체에 속할 수 있었지만 함수만 그 조건에 충족하지 않았습니다.
그래서 Java 8 이전에는 Java는 전체적으로 봤을 때 일급 객체가 아니었고(메소드가 일급 객체가 아니었기 때문) Java 8 이후부터 람다식이 나오고 부터는 함수형 프로그래밍이 가능해지고 더불어 Java도 일급 객체로서의 역할이 가능해졌습니다.
일급 컬렉션(First-Class Collection)
일급 컬렉션이라는 표현은 The ThoughtWorks Anthology(소트웍스 엔솔로지)에서 처음 사용됐습니다.
일급 컬렉션은 아래와 같이 Collection 멤버 변수를 클래스로 Wrapping해서 사용하고 해당 클래스에는 Collection외의 멤버 변수가 없는 것을 말합니다.
public class WrapperMap {
private Map<String, String> map;
}
여기서 표현된 '일급'의 의미는 위에서 설명한 '일급 객체'와 아예 다른 의미라고 봐야합니다.
왜냐면 위의 3가지 조건을 충족한다는 의미가 아니기 때문입니다.
여기서 표현된 일급은 말 그대로 언제 어디서든 재사용이 가능한 객체를 말합니다.
예를 들어 우리가 int를 사용할 때는 int에 할당된 변수만 사용하는 것이 아니라 변수에 관련된 검증 기능을 구현해서 사용하는데, 그 기능을 여러군데 구현해놓지 말고 재사용이 가능하도록 만든 것이 Wrapper Class인 Integer입니다.
그래서 Integer의 메소드는 언제 어디서든 재사용이 가능하기 때문에 소트웍스 엔솔로지에서 표현한 '일급'이라는 표현을 쓸 수 있는 것 입니다.
그래서 일급 컬렉션도 마찬가지의 의미로 컬렉션을 언제 어디서든 재사용 가능하도록 Wrapping 한 것을 말합니다.
또한 일급 컬렉션에서 멤버 변수가 1개만 존재해야 되는 이유도 재사용성 측면에서 설명됩니다.
왜냐면 다음에 올 신입 개발자나 관리자가 Wrapping된 Class를 볼 때 해당 클래스 안에 멤버 변수가 2개면 해당 클래스가 가지고 있는 의미(semantic problem)가 헷갈릴 수 있기 때문에 OOP 특성을 살려서 변수를 1개만 두자는 이유에서입니다.
이렇듯 Integer를 개발자들이 잘 사용하는 것처럼 일급 컬렉션도 필요하다면 꼭 만들어서 쓰는게 좋습니다.
일급 컬렉션이란 표현이 모호한 이유
그래서 결론적으로 위에서 보았듯이 일급이란 단어는 여러 표현으로 파생될 수가 있습니다.
일급이란 표현이 컴퓨터 개념에서 정립된 표현으로 쓰는 개념이 아니기 때문입니다.
그래서 여러군데 갖다 쓰니 조금 모호한 현상이 생기는데, 그 예로 일급 컬렉션(First Class Collection)을 위에서 설명한 일급 객체(First Class Citizen)의 3가지 조건으로 바라보면 조금 아이러니합니다.
Parameter 전달되고 Return 값으로 사용되고 변수에 할당되는 조건은 그냥 단순한 Collection에서도 가능하기 때문입니다.
굳이 Wrapper 클래스로 감싸지 않아도 된다는 뜻이죠.
//Case 1 - Primitive Type Return
public Map test(){
private Map<String, String> map;
return map;
}
//Case 2 - Wrapper Class Return
public class WrapperMap {
private Map<String, String> map;
}
public WrapperMap test(){
return new WrapperMap();
}
그래서 사실 Map의 멤버변수는 그 활용도에 따라 Wrapper 클래스가 없어도 일급 객체로서 활용됩니다.
활용도에 따라 일급 객체로서 활용된다는 뜻은 사용자가 무분별하게 Map에 요소를 추가한다거나 하면 그건 재사용성이 없을 겁니다.
재사용성이 없는건 일급 객체가 또 아니거든요.
그런 측면에서 컬렉션을 Wrapper로 감싸서 조작하는 것은 쉽게 조작이 불가능하기 때문에 해당 멤버변수의 재사용성을 끌어올린거라고 보면됩니다.
정리하자면 '일급'이라는 의미에서 파생된 일급 객체는 어떠한 연산도 가능하다는 의미에 가깝고 일급 컬렉션은 그냥 컬렉션만 사용하면 재사용성이 없으니 클래스로 묶어서 언제 어디서든 재사용이 가능하게 만든 것에 가깝습니다.
일급이라는 의미만 놓고 보자면 일급 Enum, 일급 변수 등 일급이라는 표현을 어디든 갖다 붙여버리면 그 개념을 일급 객체의 의미로서 바라봐야할 지 재사용성 측면에서 바라봐야할 지 헷갈릴 수 있습니다.
그래서 개인적으로 보기에 소트웍스 엔솔로지에서 표현한 일급 컬렉션이란 표현은 직관적으로 이해되는 표현은 아닌 것 같습니다.
왜냐면 Map 멤버변수도 그 자체로만 봐도 일급 컬렉션일 수도 있거든요.
다만 그걸 더 재사용이 가능하게 만들었을 뿐인거죠.
쓸데없고 과하게 이해한 만큼 누군가에게는 도움이 됐으면 하는 마음으로 글을 마치겠습니다.
'☕ Java' 카테고리의 다른 글
[Java] JVM Warmup (0) | 2023.03.12 |
---|---|
[Java] Object, Objects 차이 (1) | 2023.02.20 |
Optional의 orElse, orElseGet, orElseThrow 사용법 (0) | 2022.06.06 |
Array.sort(), Collection.sort(), Comparable, Comparator 사용법 (0) | 2022.05.15 |
Java 문자열 메소드 속도 효율 및 차이 (0) | 2022.05.12 |