일급 컬렉션이 뭘까??

2023. 2. 28. 13:29객체지향

728x90

일급 컬렉션… 몇 번 들어봤지만, 아직 잘 와닿지는 않습니다.

 

이번 기회에, 정학히 왜 써야하는 지 어떤 상황에서 써야하는 것인 지에 대하여 공부해보도록 하겠습니다.

 

‘객체지향적으로, 리팩토링하기 쉬운 코드로 가려면 일급 컬렉션이 필요하다.’ 라고 합니다.

 

이에대하여 알려면, 일급 컬렉션이 무엇이진부터 알아야합니다.

 

우선, 일급 컬렉션은 영어로 First Class Collection입니다.

우선, 일급 컬렉션이 되려면, 컬렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야합니다.

 

public class Baseballs {

    private final List<Integer> baseballs;

    public Baseballs(List<Integer> baseBalls){
        this.baseBalls = baseBalls;
    }
}

 

정리하면, Collection을 Wrapping하면서, 그 외 다른 멤버 변수가 없는 상태를 일급 컬렉션이라고 합니다!

 

여기서 궁금한 점이 있었습니다.

만약, Integer를 Ball로 바꾸는 것이 더 좋을까요?

public class Baseballs {

    private final List<Ball> baseballs;

    public Baseballs(List<Ball> baseBalls){
        this.baseBalls = baseBalls;
    }
}

 

일단…

  1. 둘 모두 일급 컬렉션인가?

일단, 둘 모두 Collection을 Wrapping하고 있기 때문에 일급 컬렉션입니다.

  1. 둘은 어떤 차이가 있는가?

Baseballs 클래스의 baseballs 필드가 List<Ball>인 경우가 List<Integer>에 비해 더 객체지향적인 것 같습니다. → Ball에대한 클래스를 만듬으로써 야구공 하나에대한 상태를 표현할 수 있다!

 

다시 일급 컬렉션으로 돌아와서!

 

일급 컬렉션을 사용하면 어떤 장점이 있을까요?

 

  • 비즈니스에 종속적인 자료구조
  • Collection의 불변성을 보장한다.
  • 상태와 행위를 한 곳에서 관리할 수 있다.
  • 이름이 있는 컬렉션으로 만들 수 있다.

 

비즈니스에 종속적이다

저는 ‘비즈니스에 종속적이다’라는 말은 요구사항을 포함한 객체 라고 이해했습니다.

예를 들어서 아래와 같은 요구사항이 있다고 하면,

  • 한 숫자는 1~9로 이루어져야함.
  • 총 3개의 서로 다른 숫자임

아래와 같이 Baseballs 객체를 만들 수 있습니다.

public class Baseballs {

    private final List<Ball> baseBalls;

    public Baseballs(List<Integer> baseBalls){
        this.baseBalls = baseBalls;
    }
}

만약, 일급컬렉션을 사용하지 않을 시 여러 문제가 발생할 수 있습니다.

 

예를 들어, 개발자들간의 협업시 Baseballs객체를 다른 방법으로 만들 수 있습니다. 다른 방법으로 만든다면, 기존에 만들어져있던 Baseballs객체를 만드는 로직이 사용되지 않아 자원이 낭비되고, 잘못된 Baseballs 객체가 만들어질 수도 있습니다.

 

따라서, 요구사항을 반영해야하는 자료구조를 가진 객체가 필요하다면, 일급컬렉션을 사용하는 것이 좋을 것 같습니다.

Collection의 불변성을 보장

일급 컬렉션은 불변을 보장합니다.

final을 사용해서 그런 건가요?? 아닙니다!!

 

Java의 final은 불변을 만들어주는 것이 아니라, 재할당을 금지시킵니다!

음 그러면 어떻게 불변을 보장하는 건가요??

 

final과 함께 컬렉션의 값을 변경할 수 있는 메소드가 없는 컬렉션을 만들면 됩니다!

public class Baseballs {

    private final List<Integer> baseballs;

    public Baseballs(List<Integer> baseBalls){
        this.baseBalls = baseBalls;
    }

		public Baseballs(){
			// 기본 생성자
		}
}

잠깐! 이렇게 하면 안 되는 건가요??

음… 이렇게 하면 Baseballs의 불변성이 깨져서 일급 컬렉션의 장점중 하나를 활용하지 못할 것 같습니다.

public class Baseballs {

    private final List<Integer> baseballs;

    public Baseballs(List<Integer> baseBalls){
        this.baseBalls = baseBalls;
    }

		public Baseballs(){
			// 기본 생성자
		}
}

 

상태와 행위를 한 곳에서 관리

값과 로직이 함께 존재합니다.

public class Baseballs {

    private final List<Integer> baseballs;

    public Baseballs(List<Integer> baseBalls){
        this.baseBalls = baseBalls;
    }

		public Integer countballs(~){
				return ~;
		}
}

말 그대로 상태와 행위를 한 곳에서 관리할 수 있어 객체지향적인 코드를 짤 수 있습니다.

이름이 있는 컬렉션

컬렉션에 이름을 붙일 수 있다.

저는 이렇게 이해하였습니다. 중요한 객체임에도 개발자들끼리 이를 부를 어떠한 용어가 없을 시 커뮤니케이션 간의 힘듬이 있을 수 있습니다.

 

따라서, 컬렉션에 이름을 붙여서 명확히 이 객체를 표현할 수 있습니다.

 

 아래 글을 바탕으로 공부하였습니다!!

 

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

 

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

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

jojoldu.tistory.com

 

이상입니다~~

 

728x90

'객체지향' 카테고리의 다른 글

추상화 - 인터페이스, 추상 클래스  (0) 2023.02.20
상속과 합성을 언제 사용해야할까?  (0) 2023.02.20