아무거나 개발공부

JAVA - stream count() 메서드의 반환값은 왜 long 일까 (feat. chatGPT)

코드 살인마 2023. 2. 23. 21:11
728x90

개요

회사에서 자바로 신규 게임을 개발 중에 있기도 하고, 의식적으로 계속 stream을 사용하려고 연습중이라, Stream을 무지하게 사용하고 있다.

 

그런 와중에 stream의 종결함수인 count()를 사용하며 int로 형변환 하던 중 '생각해보니 count()의 return 타입이 왜 long 타입이지?' 라는 궁금증이 들었다.

 

뇌피셜로는 당연하게도 얼마나count()가 될지 모르니, 가장 큰 타입(long)으로 한 거 같긴한데..
그렇다면 왜collectionsize()메서드는 retrun 타입이 int인걸까?

 

요즘 핫한 chatGPT와 구글 서치를 통해 알아보았다.

 

구글

1996년 초 자바가 나왔을 때는 일반 pc 메모리는 8~16MB 였다. 배열과 collection 모두 메모리 크기와 밀접하게 연관되어 있으므로 int 타입 대신 long 타입을 사용하는 것은 큰 낭비라고 생각하였다고 한다.

또한, 자바의 collection과 달리 stream에는 잠재적으로 요소 수가 무제한일수 있으며, 호환성의 고려 사항이 없다고 한다. 그래서 더 넒은 범위인 long 타입으로 retrun을 하는 것이다.

일단 자바가 나온지 오래되었기 때문에 그 때 당시 컴퓨터의 퍼포먼스를 생각하면 return 타입이 int가 될 수 있었을 것이다.

 

그리고 list, map, set 등의 자료구조를 표현하는 collection 과 달리 stream은 좀 더 큰 범위이기 때문에 위 설명에도 호환성에 고려 사항이 없다고 표현한 것 같다.

 

chatGPT

ChatGPT는 일단 친절하기 때문에, streamcollection에 대한 정의도 알려주고,,, 한마디로 잡설이 길다. 정리하자면 아래와 같다.

Collection 인터페이스에서는 size() 메서드가 int 값을 반환하도록 지정되어 있습니다. 이는 대부분의 컬렉션에 대해서는 충분한 크기를 나타내는 데에 문제가 없는 값입니다. 또한, 대부분의 시스템에서 int가 처리할 수 있는 범위를 벗어나는 큰 컬렉션은 필요하지 않는 경우가 많습니다.

따라서, List 인터페이스에서도 size() 메서드를 int 값을 반환하도록 유지하면, List를 사용하는 대부분의 경우에 문제가 발생하지 않습니다. 만약 컬렉션의 크기가 int 범위를 벗어나는 경우, stream() 메서드를 사용하여 스트림으로 변환한 다음 count() 메서드를 사용하면, long 값으로 크기를 계산할 수 있습니다.

또한 count() 메소드가 long 값을 반환하므로, 평균이나 합계를 계산하는 등의 다른 작업에서도 long 결과가 필요한 경우에 용이합니다. Stream API 전체에서 일관된 데이터 타입을 사용하면, 작업을 조합할 때 형식 불일치나 정밀도 손실과 같은 문제가 발생하지 않도록 보장할 수 있습니다.

 

결론

chatGPT도 좋은 답변이였으나, 구글에서 나온 정보가 더 정답에 가깝다고 생각한다.

 

자바 초 때 컴퓨터 성능을 고려해서 int 타입을 사용하였고, 이후에 stream을 지원하는 자바8이 2014년도에 나왔으니 이때의 컴퓨터 성능을 생각하면 long 타입을 사용하는 것이 당연하다.

 

만약 내가 자바 언어를 개발했다고 해도, 컴퓨터 성능이 뛰어난 지금 시대에 이런 사소한 메모리의 효율성을 따지기 보다도, 해당 메소드를 사용하는데 에러가 발생하지 않도록 하는 것이 더 중요하다 생각했을 것이다.

 

그렇지만, 로우한 환경에서 개발하는 사람들(임베디드 개발을 했던 나 포함)은 이런 타입의 효율성을 지켜야하는 강박증이 있긴하다....

'아무거나 개발공부' 카테고리의 다른 글

JAVA - Void와 void의 차이?  (0) 2023.04.06