class Car{
Name name;
Position position;
}
최근에 박재성(포비)님이 운영하시는 넥스트스텝에 < 자바 플레이그라운드 with TDD, 클린코드 > 과정을 들으며
"일급 컬렉션을 쓴다"라는 요구사항에 맞춰서 프로그래밍하기 위해 일급 컬렉션이 무엇인지 알아보았다.
우선 일급 컬렉션이 무엇이고 언제 써야 하며 썼을 때 얻는 이점이 무엇인지 궁금했다.
우선 일급 컬렉션이란?
규칙 8: 일급 컬렉션 사용
이 규칙의 적용은 간단하다.
컬렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다.
각 컬렉션은 그 자체로 포장돼 있으므로 이제 컬렉션과 관련된 동작은 근거지가 마련된 셈이다.
필터가 이 새 클래스의 일부가 됨을 알 수 있다.
필터는 또한 스스로 함수 객체가 될 수 있다.
또한 새 클래스는 두 그룹을 같이 묶는다든가 그룹의 각 원소에 규칙을 적용하는 등의 동작을 처리할 수 있다.
이는 인스턴스 변수에 대한 규칙의 확실한 확장이지만 그 자체를 위해서도 중요하다.
컬렉션은 실로 매우 유용한 원시 타입이다.
많은 동작이 있지만 후임 프로그래머나 유지보수 담당자에 의미적 의도나 단초는 거의 없다. - 소트웍스 앤솔로지 객체지향 생활체조 편
사실 이것만 본다면 일급 컬렉션을 왜 써야 하는지 와닿지 않을 수 있다. 왜 굳이 다른 멤버 변수가 없어야 하며 새 클래스를 만들어야 하는가..
with TDD, 클린 코드 과정의 자동차 게임을 예로 들면
class Car{
Name name;
Position position;
}
Car 클래스는 이름과 위치정보를 갖고 있다. 자동차 게임에서는 여러 이름을 입력받아 Car객체들을 다뤄야한다.
그러면 우린 List <Car>를 이용할 수 있다고 생각할 것이다.
MVC 패턴을 이용하여 설계했는데 처음에 Controller 부분에 List <Car>를 생성하여 리스트를 관리하거나 Service 부분에서 관리해야 하나 생각했다.
이때 문제가 발생했는데 컨트롤러에서 List <Car>를 관리하면서 관련 로직 또한 컨트롤러에 들어갔고 컨트롤러가 단일 책임원칙이 지켜지지 않는다는 생각이 들었다. 자동차 게임에서는 List <Car> 관련 로직이 많은 부분을 차지하는데 코드에서 악취가 났다..
이때 일급 컬렉션을 사용할 수 있겠구나 생각했다
public class Cars {
// 멤버변수는 컬렉션 하나
private List<Car> cars;
// 관련 로직
}
public class Car {
private Name name;
private Position oil;
// ...
}
이렇게 하면 Cars 클래스에서 List <Car>의 생성과 관련 로직을 한 곳에서 관리할 수 있다는 장점이 있다. 또한 controller에서도 코드가 간결해진다.
만약 자동차 경주는 최소 2명 이상 8명 이하여야 한다는 룰이 생긴다고 해도 Cars클래스에서 생성할때 유효성 검증을 할 수 있다는 장점도 있다.
'BE > Java' 카테고리의 다른 글
String vs StringBuffer vs StringBuilder (0) | 2022.11.07 |
---|---|
[Java] 자바11의 간단한 설명 (2) | 2022.10.31 |
[Java] 객체 지향 설계 5원칙(SOILD) (0) | 2022.08.31 |
자바의 대표적인 빌드 관리 툴 메이븐과 그레이들 (2) | 2022.08.10 |
자바 제네릭스(generics)란? (0) | 2022.04.24 |