ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

     

    일급 컬렉션 (First Class Collection)의 소개와 써야할 이유

    최근 클린코드 & TDD 강의의 리뷰어로 참가하면서 많은 분들이 공통적으로 어려워 하는 개념 한가지를 발견하게 되었습니다. 바로 일급 컬렉션인데요. 왜 객체지향적으로, 리팩토링하기 쉬운 코

    jojoldu.tistory.com

    nextstep - 자바 with tdd 플레이 그라운드 

    https://edu.nextstep.camp/

     

    NEXTSTEP

     

    edu.nextstep.camp

     

    '언어 > JAVA' 카테고리의 다른 글

    자바스터디(1)  (0) 2023.10.18
    자바 네트워크 네트워크 입출력 (1) - TCP  (0) 2023.08.22
    Servlet-JSP MVC07 파일 수정하기  (0) 2023.07.24
    Java - File클래스  (0) 2023.07.24
    스트림(2) - 중간 처리  (0) 2023.07.14
Designed by Tistory.