목록을 사용할 수있을 때 배열을 사용해야하는 이유가 있습니까? [닫은]


30

이처럼 보인다 List<T>배열이 더 많은 일을 할 수있는 모든 것을 할 수있는 C #에서, 그냥 배열로 메모리와 성능을 효율적으로도 보인다.

그렇다면 왜 배열을 사용하고 싶습니까?

API 또는 다른 외부 제약 조건 (예 : Main 함수)이 배열을 사용해야하는 경우에 대해서는 분명히 묻지 않습니다 ... 내 코드에서 새로운 데이터 구조를 만드는 것에 대해서만 묻습니다.


56
구현List<T>
래칫 괴물

43
is also just as efficient in memory and performance as an array-음 그 개념을 어디서 얻었습니까?
Oded

12
var test = new string[5,5];) 와 같은 여러 치수
Knerd

7
일반적으로 사용되는 byte [] 배열도 있습니다.
SBoss

11
특히 C #의 경우 Eric Lippert는 blogs.msdn.com/b/ericlippert/archive/2008/09/22/… 에서 이에 대해 썼습니다 .
Mephy

답변:


26

내가 일할 때 트럭을 운전하지 않는 것과 같은 이유. 나는 기능을 사용하지 않는 것을 사용하지 않습니다.

우선 배열은 기본 구조이므로 배열이 List <>보다 빠르고 효율적이므로 인수가 사실이 아닙니다. 어레이는 어디에서나 사용할 수 있으며 다른 언어와 플랫폼을 사용하는 개발자에게 알려져 있습니다.

List <> 대신 배열을 사용하는 가장 중요한 이유는 데이터의 길이고정 되어 있음을 의미하기 때문입니다 . 해당 데이터 수집에서 항목을 추가하거나 제거하지 않으면 유형에 해당 항목이 반영되는지 확인하고 싶습니다.

또 다른 것은 새로운 데이터 구조를 구현하고 있으며 이에 대한 몇 가지 논문을 읽었다 고 가정 해 봅시다. 이제 특정 알고리즘을 구현하는 동안 항상 다른 사람의 일반적인 유형의 구현에 의존 할 수는 없습니다. .NET에서 Mono로, 심지어 다른 버전의 프레임 워크 간에도 변경됩니다.

또한 프레임 워크 종속 유형 대신 배열을 사용하는 코드를 이식하는 것이 더 쉬운 경우가 있습니다.


4
배열이 배열을 List<T>사용하여 구현 되었다는 것을 고려할 때 배열이 목록보다 "빠른"방법은 무엇입니까? 사전에 요소 수를 알고 있다면 (배열을 사용할 때 알아야 할) 목록을 초기화 할 때도 해당 정보를 사용할 수 있습니다.
Theodoros Chatzigiannakis

1
@TheodorosChatzigiannakis 배열을 사용할 때 우리는 메모리를 할당하고 단순히 단순 malloc ()을 할당하며 오버 헤드는 없습니다. List <>를 사용할 때 항목을 "추가"하고 항목을 추가 할 때 List <>에서 경계 검사를 수행하고 현재 용량이 충분하지 않은 경우 새로 할당 된 다른 배열에 내용을 복사하는 VerifyCapacity 메소드를 호출합니다. 새로운 메모리를 동적으로 할당 할 필요가 없다면, List의 성능은 배열만큼 좋지 않습니다.
Mert Akcakaya

4
당신이 말하고있는 것은 정확하지만 우리가 사전에 요소 수를 모른다 중 하나 (이 경우, 배열은 유용하지 어쨌든입니다) 것으로 가정 또는 우리가 사전에 요소 수를 알고 있지만 우리는 의도적으로 사용하지 않습니다 목록의 경우. 우리는하면 원하는 용량 목록을 초기화 할 요소 수를 사용하여, 우리는 (당신이 그 용량에 도달 할 때까지), 따라서 우리는 동일한 성능 비용을 지불 하나의 배열 할당을 얻는다. 추가 기능 (배열이 전혀 없음)을 제외하고 다른 모든 공통 작업 (검색, 색인 별 검색, 색인 별 할당)은 동일합니다.
Theodoros Chatzigiannakis

3
@TheodorosChatzigiannakis : 배열 목록보다 빠릅니다. 간단한 벤치 마크를 실행하여 확인하십시오.
Mehrdad

1
@TheodorosChatzigiannakis, 예, 그러나 여전히 경계 점검이 있습니다.
Mert Akcakaya

18

물론 변경 가능한 구조체 컬렉션을 관리하려면 배열이 필요합니다 .

struct EvilMutableStruct { public double X; } // don't do this

EvilMutableStruct[] myArray = new EvilMutableStruct[1];
myArray[0] = new EvilMutableStruct()
myArray[0].X = 1; // works, this modifies the original struct

List<EvilMutableStruct> myList = new List<EvilMutableStruct>();
myList.Add(new EvilMutableStruct());
myList[0].X = 1; // does not work, the List will return a *copy* of the struct

(가변 구조체의 배열이 바람직한 경우가있을 수 있지만, 일반적으로 배열 내에서 가변 구조체의 다른 동작은 다른 컬렉션과 달리 피해야 할 오류의 원인입니다)


더 심각하게 참조로 요소전달하려면 배열이 필요합니다 . 즉

Interlocked.Increment(ref myArray[i]);  // works
Interlocked.Increment(ref myList[i]);   // does not work, you can't pass a property by reference

잠금없는 스레드 안전 코드에 유용 할 수 있습니다.


고정 크기 컬렉션 을 기본값으로 빠르고 효율적으로 초기화 하려면 배열이 필요합니다 .

double[] myArray = new double[1000]; // contains 1000 '0' values
                                     // without further initialisation

List<double> myList = new List<double>(1000) // internally contains 1000 '0' values, 
                                             // since List uses an array as backing storage, 
                                             // but you cannot access those
for (int i =0; i<1000; i++) myList.Add(0);   // slow and inelegant

(같은 작업을 수행하는 List의 생성자를 구현할 수 있습니다. c #은이 기능을 제공하지 않습니다.)


컬렉션의 일부 를 효율적으로 복사 하려면 배열이 필요합니다

Array.Copy(array1, index1, array2, index2, length) // can't get any faster than this

double[,] array2d = new double[10,100];
double[] arraySerialized = new double[10*100];
Array.Copy(array2d, 0, arraySerialized, 0, arraySerialized.Length);
// even works for different dimensions

(다시 말해서 이것은 List에도 구현할 수 있지만 C #에는 존재하지 않습니다.)


유형이 덕트 테이프 (예 : 점의 좌표)와 함께 붙어 있지만 관련된 독립 변수 그룹을 나타내는 경우 노출 된 필드 구조체가 가장 적합합니다. 변수에 이러한 그룹이 많이 포함되어 있으면 해당 구조 유형의 배열이 가장 좋습니다. 객체를 원하는 곳에서 가변 구조체를 사용해서는 안되지만, 덕트 테이프와 함께 여러 변수가 붙어있는 곳에서 객체 인 것처럼 물건이나 객체를 사용해야하는 것은 아닙니다.
supercat

마지막 성능 비트가 필요하고 힙 할당 및 참조를 감당할 수없는 경우와 같이 변경 가능한 구조체를 원하는 경우가있을 수 있으며,이 경우 구조체 배열이 가장 좋습니다. 여기에 좋은 에세이가 있습니다 . 그러나 클래스가 "다수의 변수가 붙어 있음"을 나타내서는 안된다는 것에 동의하지 않습니다. 개념적으로 구조체와 클래스는 거의 동일하지만 차이점은 주로 구현 세부 사항 때문입니다.
HugoRune

변경 가능한 개체 참조 모음을 독립 변수의 독립적 인 그룹의 모음으로 사용하려면 각 요소가 비유 기적 참조가 유니버스의 어느 곳에도 존재하지 않는 개체를 식별하는 불변을 설정하고 유지해야합니다. 그것은 확실히 이루어질 수 있지만 (언제나 가능하다), 언어 나 틀에 프로그래머가 그 변하지 않는 것을지지하는 것을 도울 수있는 것은 없다. 반대로, 네 개의 인스턴스 필드가있는 구조 유형의 길이 100 배열은 400 개의 독립 변수를 자동으로 영구적으로 캡슐화합니다.
supercat

이 의견은이 문제를 더 논의하기에 잘못된 장소라고 생각 하며 자신의 답변 을 추가했을 때 여기 에이 정보를 복제 할 필요가없는 것 같습니다. 말할 것도없이, 배열은 가변 구조체를 관리하는데 사용될 수 있습니다. 특정 데이터 제약 조건을 적용하기 위해 해당 구조체의 구현 동작을 사용할지 여부와시기는 실제로 내 대답 범위를 벗어납니다.
HugoRune

15

그렇다면 왜 배열을 사용하고 싶습니까?

드물게 , 당신은 당신이 시나리오지지 않습니다 알고 당신이 요소의 고정 된 수를 필요로합니다. 디자인 관점에서이를 피해야합니다. 3 가지가 필요한 경우 비즈니스의 본질은 다음 릴리스에서 4 가지가 매우 자주 필요하다는 것을 의미합니다.

그러나이 드문 시나리오가 실제로 발생하는 경우 고정 크기 불변을 강제하기 위해 배열을 사용하는 것이 유용합니다. 다른 프로그래머에게 고정 크기임을 알리는 신호를 제공하며, 누군가가 요소를 추가하거나 제거 할 때 오용을 방지하여 코드의 다른 곳에서 기대치를 깨뜨리는 데 도움이됩니다.


23
배열의 크기는 코드를 작성할 때 스톤으로 설정되지 않습니다. 그것은 종종 런타임 변수 일 수 있습니다. 배열이 생성 된 후에는 변경되지 않습니다 .

11
고정 된 수의 요소를 다루는 것은 드문 일이 아닙니다. 3D 포인트로 작업하는 경우 향후 어느 시점에서도 5D 포인트로 작업하지 않을 수 있습니다. 배열의 더 큰 문제는 배열이 변경 가능하고 요소에 편리한 레이블이 부착되어 있지 않다는 것입니다.
Doval

3
@JanDvorak 목록은 축소되거나 커질 수 있으므로 고정 된 수의 요소와 관련된 컨텍스트에서는 의미가 없습니다.
Doval

9
드물게? 모든 사람이 초 복잡한 초구 성형 엔터프라이즈 괴물에서 작업하는 것은 아닙니다.
whatsisname

3
고정 된 수의 요소를 갖는 것이 매우 일반적입니다. 길이가 상수로 정의되어 있는지 확인하십시오. 따라서 다음 릴리스에서 요소 수를 3에서 4로 늘리면 상수를 변경하면이 상수에 의존하는 모든 것이 적용됩니다.
Hans

9

귀하의 질문은 실제로 전에 이미 답변되었습니다 .

또한 배열만큼 메모리와 성능이 효율적으로 보입니다.

그렇지 않습니다. 내가 연결 한 질문에서 :

List/foreach:  3054ms (589725196)
Array/foreach: 1860ms (589725196)

중요한 경우에는 배열이 두 배 빠릅니다. 메모리 사용량도 사소한 차이가 없다고 확신합니다.

귀하의 질문에 대한 주요 전제가 패배했기 때문에 이것이 귀하의 질문에 대한 답변이라고 가정합니다. 이 외에도 때때로 Win32 API, GPU의 셰이더 또는 기타 비 DotNet 라이브러리에 의해 배열이 강제됩니다.

DotNet 내에서도 일부 메소드는 배열을 소비하거나 리턴합니다 (예 :) String.Split. 즉, 이제 호출 비용 ToListToArray항상 비용을 먹거나 배열을 준수하고 사용해야 합니다. 코드의 다운 스트림 사용자에게이를 전파하여주기를 계속할 있습니다.

이 주제에 대한 스택 오버 플로우에 대한 추가 질문과 답변 :


흥미롭게도, 그 대답 은 ( foreach 대신에 ) 구식 인덱싱 루프 사용 하면 성능 차이가 최소화 된다는 것을 지적합니다 .
user949300

3

다른 답변에 나열된 이유 외에도 배열 리터럴은 선언하는 데 더 적은 문자가 필요합니다.

var array = new [] { "A", "B", "C" };
var list = new List<string>() { "A", "B", "C" };

대신 배열을 사용 List하면 (1) IEnumerable<T>리터럴 을 전달해야 하거나 (2) 다른 기능이 있는 경우 코드를 조금 더 짧고 읽기 쉽게 만듭니다.List 중요하지 않고 목록과 같은 일부를 사용해야하는 오자.

나는 때때로 단위 테스트에서 이것을했습니다.


1
그렇습니다. 그것은 또한 당신의 작품을 전달해야은 IList <T>
Esben SKOV 페데르센

+1, 종종 컬렉션에없는 같은 유형의 두 개체에 대한 작업이 있습니다. 그것은 쓰기 쉽고, 짧고 분명 foreach( var x in new []{ a, b, c ) ) DoStuff( x )또는 new []{ a, b, c ).Select( ... )
스테인

3

이것은 엄격하게 OO 관점에서입니다.

배열을 전달 해야하는 이유는 생각할 수 없지만 클래스 내부의 배열 표현이 최선의 선택 인 상황을 확실히 알 수 있습니다.

유사한 특성을 제공하는 다른 옵션이 있지만 순열 처리, 루프 중첩, 행렬 표현, 비트 맵 및 데이터 인터리빙 알고리즘 처리 문제를 해결하는 배열만큼 직관적 인 것은 없습니다.

행렬 수학에 광범위하게 의존하는 많은 과학 분야가 있습니다. (예 : 이미지 처리, 데이터 오류 수정, 디지털 신호 처리, 응용 수학 문제의 다량). 해당 필드에있는 대부분의 알고리즘은 다차원 배열 / 매트릭스 사용 측면에서 작성됩니다. 따라서 알고리즘이 기반으로하는 논문과의 직접적인 연계를 잃는 대신에 "소프트웨어"를보다 친숙하게 만드는 것이 아니라 정의 된대로 알고리즘을 구현하는 것이 더 자연 스러울 것입니다.

내가 말했듯이,이 경우 목록을 사용하여 벗어날 수는 있지만 이미 복잡한 알고리즘 위에 또 다른 복잡성 계층이 추가됩니다.


3

이것은 실제로 목록이있는 다른 언어 (예 : Java 또는 Visual Basic)에도 적용됩니다. 메소드가 List 대신 배열을 리턴하므로 배열을 사용해야하는 경우가 있습니다.

실제 프로그램에서는 배열이 자주 사용되지는 않지만 데이터 크기가 고정되어 있음을 알고 때로는 배열을 사용하여 얻는 작은 성능 향상을 좋아합니다. 마이크로 최적화는 목록을 반환하는 방법이나 다차원 데이터 구조의 필요성과 마찬가지로 유효한 이유입니다.


1
많은 언어에는 별도의 목록과 배열 모음이 없습니다. 반면에 작동 할 list<T>위치 vector<T>를 사용 하는 것은 C / C ++에서 비참한 나쁜 생각입니다.
로봇 고트

1
"메소드가 배열을 반환하기 때문에"-이것은 자바의 잘못된 기능이며 프로그래머가 "Arrays.asList (x)"를 사용하여 코드를 폐기하도록합니다. T []는 적어도 Iterable <T>을 구현해야합니다.
kevin cline

4
@StevenBurnap-C에서 그 코드를 컴파일 할 방법이 없기 때문에 확실히 최악입니다.
Pete Becker

@PeteBecker이 표현 vector<T> x 은 C에서 나에게 잘 컴파일됩니다 . :-)
svick December

죄송합니다. C 핸드 롤에 해당하는 것을 의미했습니다 list<T>. 기본적으로 배열이 더 나은 선택 일 때 기본적으로 목록을 사용하는 개발자로 인해 많은 성능 문제가 발생했습니다.
로봇 고 르트

1

글쎄, 내가 쓰고있는 게임에서 배열을 사용하는 것을 발견했다. 고정 된 수의 슬롯이있는 인벤토리 시스템을 만드는 데 사용했습니다. 여기에는 몇 가지 이점이 있습니다.

  1. 나는 어떤 슬롯이 널인지보고 게임 오브젝트에 얼마나 많은 오픈 인벤토리 슬롯이 있는지 알고있었습니다.
  2. 각 항목의 색인이 정확히 무엇인지 알고있었습니다.
  3. 여전히 "typed"배열 (Item [] Inventory)이므로 "Item"유형의 개체를 추가 / 제거 할 수 있습니다.

인벤토리 크기를 "증가"해야한다면 이전 항목을 새 배열로 전송하여 그렇게 할 수 있지만 인벤토리가 화면 공간에 의해 고정되어 동적으로 더 크게 만들 필요가 없다는 것을 알았습니다. 더 작게, 내가 그것을 사용하는 목적으로 잘 작동했습니다.


1

목록의 모든 요소를 ​​순회하는 경우 아니요, 배열이 필요하지 않습니다. '다음'또는 임의의 '대체하지 않고 선택'하면 문제가 없습니다.

그러나 알고리즘이 컬렉션의 요소에 무작위로 액세스 해야하는 경우 배열이 필요합니다.

이것은 "가야합니까?"와 다소 유사합니다. 합리적인 현대 언어에서는 전혀 필요하지 않습니다. 그러나 추상화를 벗겨 낸다면 언젠가는 실제로 사용할 수있는 모든 것입니다. 즉, 이러한 추상화를 구현하는 유일한 방법은 '불필요한'기능입니다. (물론 비유가 완벽하지는 않습니다. 배열이 프로그래밍 연습이 좋지 않다고 생각하지 않습니다. 이해하기 쉽고 생각하기 쉽습니다).


List <T>는 랜덤 액세스도 제공합니다. 물론 배열로 구현 되었지만 사용자를 귀찮게 할 필요는 없습니다. 따라서 배열을 사용해야하는 단일 이유는 다음과 같습니다 List<T>.

@delnan 나는 그것이 추상화와 관련하여 나의 요점이라고 생각합니다. 때로는 효율성 측면뿐만 아니라 어레이 측면에서 생각하는 것이 좋습니다. (물론 링크 된 목록을 생각하는 것이 더 좋으며, 링크를 염려하지 않고 다른 방식으로 구현되지 않은 목록을 생각하는 것보다 더 나은 방법 일뿐만 아니라 컬렉션을 개선하는 것이 더 좋습니다.
Mitch

0

레거시 호환성.

모든 형태의 개인 경험 :

레거시 프로그래머-제 동료는 30 년 이상 동안 배열을 사용하여 새로운 아이디어를 마음에 새기고 행운을 빕니다.

레거시 코드-foo (array bar [])는 list / vector / collection toarray 함수를 사용할 수 있지만 추가 기능을 사용하지 않는 경우 배열을 사용하여 시작하기가 더 쉽고 종종 유형 전환없이 더 읽기 쉽습니다.

레거시 보스-내 상사는 몇 년 전에 경영진에 들어가기 전에는 훌륭한 프로그래머 였지만 여전히 "어레이를 사용하고 있었다"고 회의를 종료 할 수 있다고 생각합니다.


3
20 년이 지난 동료들과 어떤 데이터 유형을 사용하고 싶은지 알고 싶은 보스 ... 나는이 사이트가 내 직업이 얼마나 더 나빠질 수 있는지를 상기시켜주는 것을 좋아합니다.
JoelFan

1
우리가하는 것의 약 40 %는 토론이 KB 단위로 진행되는 임베디드 디자인입니다. 그는 그가 구식이 아니라고 말하고 싶습니다. lol
Skeith

0

1) 다차원 버전의 List가 없습니다. 데이터에 차원이 둘 이상 있으면 목록을 사용하는 것이 매우 비효율적입니다.

2) 많은 수의 작은 데이터 유형 (예 : 지형 유형에 대해 1 바이트가있는 맵)을 처리하는 경우 캐싱으로 인해 성능 차이가 상당히 커질 수 있습니다. 어레이 버전은 메모리 읽기 당 여러 항목을로드하고 목록 버전은 하나만로드합니다. 또한 배열 버전은 캐시에서 목록 버전보다 몇 배나 많은 셀을 보유합니다. 데이터를 반복적으로 처리하는 경우 배열 버전이 캐시에 적합하지만 목록 버전에는 맞지 않으면 큰 차이를 만들 수 있습니다.

극단적 인 경우에는 Minecraft를 고려하십시오. (예, C #으로 작성되지 않았습니다. 같은 이유로 적용됩니다.)



0

일부 유형 T의 100 요소 배열은 유형 T의 100 개의 독립 변수를 캡슐화합니다. T가 유형 Q의 변경 가능한 공용 필드와 유형 R의 변수 유형을 갖는 값 유형 인 경우 배열의 각 요소는 독립 변수를 캡슐화합니다. 어레이는 전체적으로 타입 Q의 100 개의 독립 변수 및 타입 R의 100의 독립 변수를 캡슐화 할 것이다; 이러한 변수는 다른 변수에 영향을주지 않고 개별적으로 액세스 할 수 있습니다. 배열 이외의 콜렉션 유형은 구조 필드를 독립 변수로 사용할 수 없습니다.

T가 대신 Q 및 R 유형의 공개 가변 필드를 가진 클래스 유형이 된 경우 배열의 각 요소 는 유니버스의 인스턴스에 대한 유일한 참조를 보유하며 배열 T의 요소가없는 경우 외부 참조가 존재하는 객체를 식별하도록 수정되면 배열은 유형 Q의 100 독립 변수 및 유형 R의 100 독립 변수를 효과적으로 캡슐화합니다. 다른 수집 유형은 이러한 배열의 동작을 모방 할 수 있지만 유일한 목적이라면 배열은 Q 타입의 100 변수와 R 타입의 100 변수를 캡슐화하는 것입니다. 각 변수 쌍을 자체 클래스 객체에 캡슐화하는 것은 비용이 많이 드는 방법입니다. 더욱이, 사용하거나 를 변경할 수있는 클래스 유형 배열 요소로 식별되는 변수는 독립적이지 않을 수 있습니다 .

타입이 어떤 종류의 객체처럼 행동해야한다면, 클래스 타입이거나 프라이빗 필드 구조로 대체 이외의 다른 돌연변이 수단을 제공하지 않아야합니다. 그러나 유형이 독립적 인 관련-하지만-변수의 무리처럼 덕트 테이프와 함께 붙어 작동하도록되어 있다면, 하나는 유형 사용해야 한다 노출 필드 구조체 - 변수의 무리가 덕트 테이프와 함께 붙어를 . 이러한 유형의 배열은 작업하기에 매우 효율적이며 의미가 매우 깨끗합니다. 다른 유형을 사용하면 의미가 흐려 지거나 성능이 저하되거나 둘 다로 이어질 수 있습니다.


0

한 가지 중요한 차이점은 메모리 할당입니다. 예를 들어, 연결된 목록을 순회하면 많은 캐시 누락과 성능 저하가 발생할 수 있지만 배열은 특정 데이터 유형의 여러 인스턴스를 보유하는 연속 된 메모리 청크를 나타내며 순회하면 CPU에 충돌 할 가능성이 높습니다. 은닉처.

물론 역 참조를 통해 메모리의 어느 곳으로나 이동할 수 있기 때문에 객체 참조 배열이 캐시 적중의 이점을 크게 얻지 못할 수 있습니다.

그런 다음 배열을 사용하여 목록을 구현하는 ArrayList와 같은 목록 구현이 있습니다. 그것들은 유용한 기본 요소입니다.


2
이 질문은 특히 List<T>링크 된 목록을 사용하여 구현되지 않고 배열을 사용하여 구현 된 .Net 유형에 대해 묻습니다 ( ArrayList<T>Java 와 본질적으로 동일 함 ).
svick December

-2

선택시기 Array및 선택시기에 사용할 수있는 몇 가지 지침이 있습니다 List.

  • Array메소드에서 돌아올 때 사용하십시오 .
  • List메소드 내부에서 리턴 값을 구성 할 때 변수로 사용하십시오 . 그런 다음 .ToArray()메소드에서 돌아올 때 사용 하십시오.

일반적으로 Array소비자가 컬렉션에 항목을 추가하지 않으려 는 경우를 사용 하십시오. List소비자가 컬렉션에 항목을 추가 할 때 사용 합니다.

Array "정적"컬렉션을 다루는 동안 List 을 처리하기위한 것이며 "동적"컬렉션을 처리하기위한 것입니다.


2
제안하는 규칙은 임의적이며 불필요한 복사를 수행하는 비효율적 인 코드를 초래할 수 있습니다. 최소한 어떤 형태의 정당화가 필요합니다.
Jules

@Jules 개발자 경험이 마이크로 최적화보다 훨씬 중요하다는 것을 알았습니다. 이 수준에서는 성능 문제가 없습니다.
Daniel Lidström

그러나이 규칙에 의해 개발자 경험이 어떻게 향상되는지 알 수 없습니다. 코드의 클라이언트가 반환 된 값으로 무엇을하고 싶을 지 추측해야하며 코드를 잘못 사용할 때 코드를 사용하기가 쉽지 않지만 이점이 전혀 없습니다. 성능은 이차적 인 문제 일 수 있지만 아무 것도 얻지 못하는 규칙을 따르도록 희생하지는 않을 것입니다.
Jules

@ Jules 나는 그것이 당신의 취향에 달려 있다고 생각합니다. 반환 값을 상수로 처리하는 것을 선호하므로 Array대신 대신 사용하는 것이 좋습니다 List. 그래도 당신의 생각을 듣고 반갑습니다!
Daniel Lidström

UmmodifiableLists 사용을 고려 했습니까?
Jules
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.