int i = 123; //값 타입
object o = i; // 박싱, 암묵적인 형변환이 가능
int j = (int)o;// 언박싱, 명시적인 형변환을 통해서 가능


ArrayList a = new ArrayList();
a.Add(1);
a.Add("2");
a.Add(3.5f); ArrayList는 내부적으로 object 배열을 가지고 있다. 그렇기 때문에, 타입과 상관없이 값을 보관할 수 있다는 장점이 있다. 하지만, 이는 값 형식의 데이터에 한해서 반드시 박싱을 일으키게 한다.(object의 배열임으로) ArrayList는 값 자체를 저장하는 것이 아닌, object 타입으로 박싱되어 메모리 어딘가에 할당되어 있는 값의 ‘주소값’을 저장하고 있다. 만약 이를 boxing없이 사용하고 싶다면 각각의 타입에 따라서 따로 정의해야 할 것이다. 하지만, 이는 중복되는 코드를 늘리는 비효율적인 프로그래밍이다. generic의 추가로 한번의 정의로 boxing문제와 코드 중복 문제를 해결할 수 있게 되었다. List는 내부적으로 T타입의 배열을 가지고 있다.List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3); 이는 해당 값을 그대로 복사해오기 때문에, boxing이 일어나지 않는다.Array
-배열의 길이는 생성시간에 결정, 변경 불가
-인덱스를 사용하여 요소에 직접 접근 가능
-다차원 배열 지원
List
-동적으로 크기가 조정될 수 있는 컬렉션
-요소의 추가, 삭제, 수정 등이 자유로움
-인덱스를 사용하여 요소에 직접 접근 가능
-Generic으로 구현되어 타입 안정성 보장
ArrayList
-동적으로 크기가 조정될 수 있는 컬렉션
-요소의 추가, 삭제, 수정 등이 자유로움
-인덱스를 사용하여 요소에 직접 접근 가능
-boxing, unboxing으로 인한 성능저하가 있을 수 있음
| 컨테이너 | 자료구조 |
|---|---|
List<> | 배열 |
SortedSet<> | 레드-블랙 트리 |
HashSet<> | 해시 테이블 |
Dictionary<,> | 해시 테이블 |
SortedList<,> | 배열 |
SortedDictionary<,> | 레드-블랙 트리 |