본문 바로가기
java

리스트에서 배열 변환 시 size를 정확하지 않게 전달해도 된다고?

by ernest45 2024. 9. 20.

 

 

 

코테를 풀다보면 list에서 배열로 변환하는 과정이 흔히 발생한다..

 

여러 방법이 있지만 나는 toArray를 자주 사용한다.

 

 

 

toArray로 String을 list의 사이즈로 항상 지정해줬는데

다른 사람들의 풀이 보다보니,

 

 

사이즈를 지정하지 않고 [0]으로 넘기는 코드를 종종 볼 때가 있다.

 

 

 

new String[0]을 사용하는 이유

  • new String[0]은 크기가 0인 배열을 전달하여, Java가 알아서 적절한 크기의 배열을 동적으로 생성하도록 합니다.
  • 크기를 0으로 전달해도 성능에 영향이 거의 없고, 코드가 간결해집니다.

 

 

 

 

 

 

 

 

배열의 크기를 정확히 맞추고 싶다면 배열 길이 그대로 해도 된다.

하지만 new String[0]이 간편하고, 자파 컴파일러는 성능저하 없이 작동한다.

 

 

 

배열 길이를 정해 넘길 경우 문제점

또 중요한 new String[0]으로 동적할당을 해야할 이유가 있는데,

동시성 이슈가 발생할 수 있다고 한다..

내부 원리는 아직 이해가 가질 않으나

 

 

"해당 메서드에 배열의 길이를 미리 초기화 한 뒤 넘겨서 코드를 실행했는데

도중에 다른 스레드에서 해당 List 의 size 를 줄인다면 원래라면 타지 않았어야할 마지막 조건문이 true 가 되고

그 결과 extra nulls 가 추가될 가능성이 있다. 그렇기에 동시성 이슈가 생길 가능성이 있다는 뜻이다."

 

 

완벽하게 이해하진 못했지만..

 

 

 

 

결과적으로

list.toArray(new String[0])는 크기가 0인 배열을 전달해도 Java가 내부적으로 적절한 크기의 배열을 생성함!

size가 줄어들 일 없이 정확하게 전달할 수 있다면 배열 크기 자체를 넘겨도 된다.

(더 작은 수를 넘길 경우에 발생하는 이슈기에..)

그렇지만 성능 차이가 전혀 없기에 그냥 new String[0]을 습관화 하자!

 

 

 

 

 

 

 

 

 

https://stackoverflow.com/questions/174093/toarraynew-myclass0-or-toarraynew-myclassmylist-size/29444594#29444594

 

https://jongmin4943.tistory.com/entry/ArrayList-%EC%9D%98-toArray-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EB%B0%B0%EC%97%B4-%EC%B4%88%EA%B8%B0%ED%99%94-%EA%B8%B8%EC%9D%B4%EB%A5%BC-0-%EC%9C%BC%EB%A1%9C-%ED%95%B4%EC%95%BC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

'java' 카테고리의 다른 글

로깅 앤 디버깅  (0) 2024.06.09
증감 연산자  (0) 2024.01.23
String이란?  (0) 2023.10.31
하라는 indexof() 공부는 안하고 물리에 빠진 건에 대하여.  (0) 2023.05.19
내맘대로 디버깅(Debug)  (0) 2023.05.17