발음 때문인지 난 코틀린하면 코뿔소가 생각났다...
블로그를 많이 못해서 예전에 github 블로그에 기술한 것을 다시 정리 겸 가져 왔다
https://progress0407.github.io/backend/2023/02/18/%EC%BD%94%ED%8B%80%EB%A6%B0%EA%B3%BC_%EC%9D%BC%EA%B8%89%EC%BB%AC%EB%A0%89%EC%85%98.html
위와 같이 의문형으로 적은 것은 First-Class Collection을 창안한 사람의 생각을 정확히 알지는 못하기 때문이다
그렇지만 기억에 따르면 동욱님의 글을 보면서 파악한 것은 일급컬렉션은 아래의 정의를 따른다
- "List of 객체"를 감싼 행동을 정의할 수 있는 새로운 클래스
단순하게 말해 아래와 같은 것이 일급 컬렉션이다
class Cars{
private List<Car> cars = new ArrayList<>();
fun somethingDo() { ... }
}
List<Cars> 자체로는 아무것도 할 수 없으니까 그것을 감싼 객체를 정의한 후에 행동을 정의하는 것이다
저게 꼭 ArrayList일 필요는 없고 JCF 모두 해당한다
쓰는 이유는 생략하겠다...
저 개념은 너무나도 널리 알려진 개념이고 이걸 블로깅하는 나 또한 보지 않을 것 같다 ...
하지만 짧게나마 기술하면...
- Collection 자료형에 행동울 기술할 수 있는 자료형이다.
- 기존 Collection 자체는 이미 정의된 자료형이고 이곳에 행동을 넣을 수 없다. (비즈니스는 더욱이)
- 그래서 존재하는게 일급 컬렉션이다.
그리도 일급 컬렉션을 종종 사용해 왔는데, 코틀린에서는 그 활용도가 조금 떨어진다고 생각했다 (이 생각은 여전하다)
왜냐하면 코틀린에서는 확장함수라는 것을 제공하기 때문이다
(아래 코드)
fun List<Car>.move() {
for (car in this) {
car.move()
}
}
fun List<Car>.winners(): List<Car> =
this.stream()
.filter { it.position >= 5 }
.sorted(compareBy { it.name })
.toList()
fun List<Car>.hasWinner(): Boolean =
this.winners()
.isNotEmpty()
클라이언트 코드에서 cars.move() 를 호출하면 일급 컬렉션의 의도와 부합하는 행동을 정의할 수 있다
그럼에도 일급컬렉션이 필요한 이유는?
- 다른 필드가 생길 수 있음
객체가 조금만 더 역할이 많아지면 자연스럽게 다른 필드가 생길 수 있다 (상태 등을 가지게 될 수 있음)
(근데 추후 살펴보니 일급컬렉션은 불변성 또한 보장해야 하는 것으로 보인다...)
이때는 클래스로 분리해야 한다
테스트 코드 작성시 애매한 파일 분리
테스트 코드를 위해서 클래스 별로 테스트를 작성할때 위와 같이 정의한 확장 함수를 어떤 파일로 묶을지 다소 애매하게 느껴질 수 있다 (ExtensionCarsTest 로 해야하는 것인가 등등)
참고
아래는 동욱님 댓글이 달려있다!
https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/
https://jojoldu.tistory.com/412
'Back-end > Java, Kotlin' 카테고리의 다른 글
kotlin-jdsl 기여 일기 (0) | 2024.04.06 |
---|---|
IDEA에서 Kotlin을 사용 중 감동한 건에 대해서... (null 검증) (0) | 2023.05.21 |
Java ZoneDateTime 에 대해서 (0) | 2023.05.08 |
Thread에 대한 것들 (0) | 2021.07.14 |
Annotaion 처리부 구현 (값 주입, Trim) (0) | 2021.04.27 |
hi hello... World >< 가장 아름다운 하나의 해답이 존재한다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!