학습 목표
- 자바의 신(22장)
- 컬렉션
- List
- 컬렉션
TIL
- 컬렉션(Collection)
- ArrayList
- Stack
자바의 신 22장 리뷰 및 정리
저번에 ArrayList에 대해 포스팅 한적 있지만 책 진도상 한번 더 학습하게 되었다.
자바의 신 2권의 자바 컬렉션 부분을 읽었다.
자바에서 컬렉션은 목록성 데이터를 처리하는 자료 구조를 통칭한다.
여기서 자료 구조는 Data Structure라고 한다.
한 개의 자료만 담는 것이 아니라 여러 개의 자료를 담을 때 쓰는 것을 자료 구조라고 한다.
그 중 하나가 배열이고 오늘 이야기할 ArrayList(어레이리스트)이다. 이 것 말고도 여러가지 자료구조가 있다.
면접에도 자료 구조가 중요하고 컬렉션에 대해서도 자주 물어본다.
컬렉션은 이터레이터 인터페이스를 상속받는다.
이 의미는 이터레이터 인터페이스를 이용해서 데이터를 순차적으로 가져올 수 있다는 의미이다.
책을 읽으면서 내가 몰랐던 사실은
ArrayList<String> list = new ArrayList();
ArrayList<String> list2 = new ArrayList(100);
두 어레이리스트 모두 객체가 각각 생성된다.
만약 길이를 new ArrayList() 처럼 정해주지 않으면 길이가 10으로 생성된다.
배열에 넣을 값이 10개 안밖이거나 그 미만이면 큰 차이는 안나겠지만
배열에 넣을 값의 수가 많으면 어레이리스트의 길이가 자동으로 늘어나긴하지만
늘어나는 연산작업에 리소스가 들어가므 만약 들어가는 값의 갯수를 알고 있다면
미리 new ArrayList(100); 처럼 () 안에 그 갯수만큼 미리 생성해 주면 성능에 좀 더 유리하다고 한다.
ArrayList에는
toArray() 와
toArray(T[] a) 라는 두 메소드가 있는데
toArray(T[] a) 메소드를 더 추천한다고 한다. 그 이유로는
첫번째 메소드 toArray()는 Object타입의 배열로만 리턴을 하므로 2번째 타입을 정해주는 메소드를 더 추천한다고 한다.
사용법으로는
String[] strList = list.toArray(new String[0]);
이나
Integer[] intList = list.toArray(new Integer[0]);
처럼 타입과 배열 갯수를 0으로 정해주면 된다.
이렇게 하는 이유는 ArrayList 객체의 데이터 크기가 매개 변수로 넘어간 배열 객체의 크기보다 클 경우에는 매개 변수로 배열의 모든 값이 null로 채워진다.
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
String[] strList = list.toArray(new String[5]);
결과 출력시
"1"
"2"
"3"
null
null
이런 식으로 나머지 값에 null 값이 넣어진다
생성되는 배열의 갯수가 배열로 변환하는 갯수보다 크면 나머지 배열의 값이 null이 입력되기 때문이다.
위 코드에서
String[] strList = list.toArray(new String[5]); 을
String[] strList = list.toArray(new String[2]); 로 바꾸면
null
null
이 뜬다고 한다.
나는
"1"
"2"
이렇게 뜰 줄 알았는데
예상 외의 결과가 떳다.
그 이유를 알아보니
인자로 넘기는
new String[2]부분이 list의 길이보다 같거나 크다면 new String[2] 이 배열이 계속 유지되어 사용되고
new String[2]부분이 list의 길이보다 작다면 new String[2] 배열은 무시되고 list의 배열의 길이만큼의 새 배열이 생성되어
값이 입력된다고 한다.
그러니 별 일이 없다면 ist.toArray(new String[0]) 이나 list.toArray(new Integer[0]) 이런식으로 길이는 0으로 맞춘다면
대부분의 경우에는 별 탈이 없을 것 같다.
Stack
List 인터페이스를 구현한 또 하나의 클래스다.
LIFO(Last In First Out) 후입선출 이라는 특징을 가지는데
나중에 입력된 값이 먼저 나간다는 뜻이다.
일반적인 사회 개념과는 다른 방식의 데이터 처리 순서를 가지고 있는 것 같다.
보통 먼저 들어온 사람이 먼저 나간다고 생각하고 있었다.
예를 들면 음식점에서 줄을 먼저 서는 사람이 주문도 먼저하고 먼저 제품을 받아간다.
버스 줄도 먼저 기다린 사람이 먼저 탄다.
스택은 반대다(엄밀히 말하면 완전 반대는 아닌데 간단히 말하면 반대 정확히 말하면 LIFO) 가장 늦게 들어온 값이 가장 빨리 나가고 그 다음 늦게 들어온 값이 그 다음으로 빨리 나간다.
이 스택이 어디에 쓰이는지 도통 이해 할 수 없었는데
소스 코드에서도 많이 쓰이고 있었다.
내가 이걸 이 개념과 연관 짓지 못했기 때문이다.
알게 되었을 떄의 충격은 상당히 기쁘고 얼얼했다.
스택이 쓰이는 곳을 간단히 예를 들어보면
클레스에 메소드1가 있는데
이 메소드1의 코드는 메소드2을 가지고 있고
메소드 2는 메소드 3를 가지고 있다고 하자
코드는 위에서 아래로 읽고 실행되므로
메소드 1 -> 메소드2 -> 메소드3 이런식으로 실행 된다.
스택에 메소드 1 -> 메소드2 -> 메소드3 순으로 저장되면
꺼낼고 실행될 때는 메소드3 -> 메소드2 -> 메소드1 순으로 된다.
어째 스택의 특성(LIFO)와 아주 잘 맞지 않는가??
아주 신기 했다.
실생활에서 쓰이는 건 아직도 예를 못들었는데
암튼 프로그래밍에서는 자주 쓰이는 개념이여서 엄청 놀랍고 신기했다.
아주 중요한 개념이라고들 한다.
'[F-Lab 66해빗 페이백 챌린지 ]' 카테고리의 다른 글
| [F-Lab 모각코 페이백 12일차] 다형성 개념 복습, 추상화 개념 복습, String, Static (0) | 2023.05.25 |
|---|---|
| [F-Lab 모각코 페이백 11일차] 프로그래머스 - 연속된 부분 수열의 합(Java), 투포인터 알고리즘 (0) | 2023.05.24 |
| [F-Lab 모각코 페이백 9일차] 해시맵(HashMap), 해시(Hash) (0) | 2023.05.22 |
| [F-Lab 모각코 페이백 8일차] 얕은 복사, 깊은 복사, 추상클래스와 인터페이스 차이점 (0) | 2023.05.21 |
| [F-Lab 모각코 챌린지 7일차] C1 컴파일러, C2 컴파일러, 인라이닝, 루프 언롤링 (0) | 2023.05.20 |