-
Java - 일급컬렉션언어/JAVA 2023. 7. 25. 11:40
일급컬렉션이란 Collection을 Wrapping하면서, 그 외 다른 멤버 변수가 없는 상태
1.일급컬렉션 적용 규칙
- 일급컬렉션에는 컬렉션 외 다른 멤버변수 없어야한다.
- 각 컬렉션은 자체로 포장돼 있음으로, 콜렉션과 관련된 동작 근거지가 마련됨
- 필터가 일급컬렉션 클래스에 일부가 된다.
> 필터는 또한 스스로 함수 객체가 될 수 있다.
Map<String,String> map = new HashMap<>(); map.put("1","A"); //.. 이를 아래와 같이 클래스 안으로 묶음 public class GameRanking{ private Map<String,String> ranks; public GameRanking(Map<String,String> ranks){ this.ranks = ranks; } } List<Car> carList = new ArrayList<>(); public class CarsList{ pirvate List<Car> carlist; public CarsList(List<Car> carlist){ this.carlist = carlist; } }
2. 일급 컬렉션의 이점
- 특정 조건으로만 생성할 수 있는 비지니스에 맞는 자료구조 생성(비지니스 종속적)
- 불변 컬렉션(컬렉션 내부 자료 수정 불가)
- 상태와 행위 관리(캡슐화)
- 이름이 있는 컬렉션
2.1 비지니스 종속적 자료구조
(비지니스 조건에 맞는 특정 자료구조 생성)
예를 들어 carlist를 만들때
- List안에 차의 수는 최대 10개만 가능합니다.
- List안에 각 자동차는 중복없이 저장되어야합니다.
위 두가지 제약사항이 있다고 가정한다면,
public class racingGame{ public void createRacingCars(){ List<Car> cars = createCars(); validateSize(cars); validateDuplicate(cars); } }
- 위와 같이 cars를 생성할 때 이게 유효성을 검증해야한다.
- 생성할 뿐 아니라, cars가 필요한 모든 장소에서는 이를 검증하기 위한 로직이 필요할 것이다.
- 그렇다면, 모든 생성되는 모든 cars는 위의 검증처리가 완료된 상태로만 생성되도록 만들순 없을까?
public class CarsList{ pirvate List<Car> carlist; public CarsList(List<Car> carlist){ validateSize(carlist); validateDuplicate(carList); this.carlist = carlist; } private void validateSize(List<car> list){}; private void Duplicate(List<car> list){}; }
- 이와 같이 특정 조건으로만 생성할 수 있는 자료구조를 만들면 된다.
2.2 불변
- 일급 컬렉션은 컬렉션의 불변을 보장한다.
- 컬렉션을 생성할 때 final을 쓴다 해도 컬렉션에 새로운 데이터가 추가되거나 삭제되는 것은 막을 수 없다.
- 이는 final을 통해 변수에 새로운 값,참조값을 할당하지 못하도록 막는 것이지, 한번 할당된 참조값 안에 특정 값을 수정하지 못하게 막는 것은 아니기 때문이다.
- 불변객체를 만드는 것은 매우 중요하다 (객체의 값이 절대 바뀔일이 없다는 것을 보장하여, 사이드 이펙트 최소화)
- java에서는 final만으로 완벽한 불변객체 만드는 것에 한계가 있기 때문에 래퍼클래스와 일급컬렉션으로 이를 해결해야 한다.
public class PencilCase{ private List<Pencil> pencils; public PencilCase(List<Pencil> pencils){ this.pencils = pencils; } public long getNumberofPencil(){ return pencils.size(); } }
- 위와 같은 일급컬렉션은 값을 받거나, 새로운 값을 return해 줄 뿐 내부를 변경할 수 없도록 만든다.
2.3 상태와 행위를 한곳에서 관리
- 값과 관련 로직이 함께 존재한다(캡슐화)
List<Car> cars = Arrays.asList( new Car(AUTO,"pobis"), new Car(AUTO,"javis"), new Car(MANUAL,"nabis"), new Car(MANUAL,"jans"), ); //값 //필요 로직 List<Car> autoCarOwner = cars.stream.filter(car -> car.Type().equals(AUTO))..collect(Collectors.toList());
- 차 중에 AUTO인 차량을 소유한 사람들이 List를 만든다.
- 값과 로직이 분리되어 있으면, Car에 상태에 따라 필요 로직을 수행하고 싶은데, 현재로는 이를 강제할 수 없다.
- 이와 같은 상태라면, 같은 기능 메소드 중복생성, 혹은 필요 메소드를 누락 시킬 수도 있다.
- 관련 컬렉션과 가지고 있는 값과 관련 메서드를 한 곳에 모아두면 이를 막을 수 있다.
public class CarsList{ pirvate List<Car> carlist; public CarsList(List<Car> carlist){ validateSize(carlist); validateDuplicate(carList); this.carlist = carlist; } private void validateSize(List<car> list){}; private void Duplicate(List<car> list){}; public List<Car> autoOwners(){ return getFilterdList(car -> CarType.isAuto(car.getType())); } public List<Car> manualOwners(){ return getFilterdList(car -> CarType.isManual(car.getType())); } private List<Car> getFilteredList(Pridicate<Car> pri){ return carlist.stream().filter(pri).collect(Collectors.toList()); } }
2.4 이름이 있는 컬렉션
- 컬렉션에 이름을 붙일 수 있다!
- 같은 car의 모임이지만, auto와 manual리스트는 다르고, 이는 변수명으로도 구분할 수 있다.
- 변수명으로만 컬렉션을 구분하면
> 변수명으로만 컬렉션을 검색했을 때, 위 컬렉션이 처리되는 로직들은 보기 힘들다.
> 같은 그룹이라도, 변수명으로 구분하면, 사람마다 조금씩 변수명을 다르게 지을 수 있다(강제불가)
> 명확한 의미를 부여하기 힘들다.
- 일급컬렉션으로 이러한 문제를 해결할 수 있다.
참고자료: https://jojoldu.tistory.com/412
nextstep - 자바 with tdd 플레이 그라운드
'언어 > JAVA' 카테고리의 다른 글
쓰레드 기본 (0) 2023.08.25 자바 네트워크 네트워크 입출력 (1) - TCP (0) 2023.08.22 Servlet-JSP MVC07 파일 수정하기 (0) 2023.07.24 Java - File클래스 (0) 2023.07.24 Java - io 직렬화(Serialization) (0) 2023.07.24