코드 그라데이션
<보충> 컬랙션 추가 공부(1) List, Stack 본문
1.
public class ListTest1 {
public static void main(String[] args) {
String[] name = {"kim", "lee", "park", "jung", "oh"};
ArrayList<String> lname = new ArrayList<String>(Arrays.asList(name));
// 이 순간 lname에 이 name 배열이 들어간다.
System.out.println("초기 값 : " + lname);
lname.add("ha"); // oh 뒤에 붙는다
System.out.println("\"ha\" 가 추가된 후의 값 : " + lname );
lname.set(0, "김"); // 한글로 김으로 바뀜
lname.set(3, "곽"); // jung이 곽으로 바뀜
System.out.println("\"ha\" 로 변경되고 \"곽\" 이 추가된 값 : " + lname);
Collections.shuffle(lname); // 돌면서 섞여버림.
System.out.println("shuffle() 메소드가 적용된 값 : " + lname);
Collections.sort(lname); // 오름차순 자동 정렬됨.
System.out.println("sort() 메소드가 적용된 값 : " + lname);
System.out.println("5번째 요소의 값 : " + lname.get(4));
Collections.fill(lname, "김"); // 전부 김으로 바뀌어버림.
System.out.println("모든 요소를 \"김\" 으로 설정된 값 : " + lname );
}
}
여기서는 String 배열을 String 리스트로 바꾼 건데,
배열을 리스트로 바꾸고 싶으면, 반복문을 돌면서 일일이 값을 넣는 것이 아니라,
(Arrays.asList(배열명)) 과 같은 명령어를 써준다. 이것 자체가 리스트가 된다.
*원래 객체의 이름을 출력하면, 객체의 해시코드(주솟값) 등이 복잡하게 나오는데,
ArrayList는 정갈하게 구현되어 있기 때문에 이름을 출력해도 [ , , , ...]
이런식으로 순서대로 정렬이 되어서 나온다는 특징이 있다.
add한 요소는 기본적으로 가장 뒤에 붙는다.
set(바꾸기)은 인덱스 번호를 통해서 위치를 명시한다.
cf) Queue랑 Stack은 가운데 요소를 바꾸는 게 안 된다!
Collections는 유틸리티 클래스로 굳이 외우기보다는 필요하면 가져다가 쓰면 될 듯.
2.
class A {
int a;
int b;
A(int a, int b) {
this.a = a;
this.b = b;
}
void print() {
System.out.println("a: " + a + "b: " + b);
}
}
public class ListTest2 {
public static void main(String[] args) {
//ArrayList 속에 자료형으로 아예 클래스를 집어넣는 사례.
// ArrayList 선언
ArrayList<A> sampleList = new ArrayList<>();
// 값을 집어넣기
for (int i = 0; i<sampleList.size(); i++) {
sampleList.add(new A(i, i+1)); // new로 집어넣는게 중요하다.
}
// 출력하기 => 위에 print 메서드 있었음.
for (int i = 0; i<sampleList.size(); i++) {
sampleList.get(i).print(); // get(i) 까지 오면 그냥 가져오기만 한다.
}
// 몇 번째 인덱스인지 찾기
for (int i = 0; i<sampleList.size(); i++) {
if (sampleList.get(i).b == 4) {
System.out.println(i);
}
}
}
}
* ArrayList<A> sampleList = new ArrayList<>();
=> 여기서도 클래스배열과 마찬가지로 요소 한 칸 한 칸씩 new를 해서 객체를 집어넣어줘야 한다는 것.
* . 은 끊어서 본다
sampleList.get(i).print()
samplList의 i번째의 A를 가져오고, 이 A를 print한다.
3.
public class StackTest {
public static void main(String[] args) {
Stack<String> stackSample = new Stack<>();
System.out.println("스택에 push 1 : " + stackSample.push("경기도"));
System.out.println("스택에 push 2 : " + stackSample.push("충청도"));
System.out.println("스택에 push 3 : " + stackSample.push("강원도"));
System.out.println("스택에 push 4 : " + stackSample.push("전라도"));
System.out.println("스택에 push 5 : " + stackSample.push("제주도"));
System.out.println("==================================================");
int num = stackSample.search("제주도");
if (num != -1) { //-1이 기본값이었다!
System.out.println(" 스택에서 숫자 \"제주도\"의 위치는 : " + num + "번째 입니다.");
}
else {
System.out.println("제주도는 목록에 존재하지 않습니다.");
}
System.out.println("======================================================");
// 삭제
while (!stackSample.empty()) { // 목록이 존재하는 동안
String obj = stackSample.pop(); // 스택의 맨 위에 있는 객체를 pop하여 가져옴
System.out.println("스택에서 pop : " + obj); // pop한 객체 출력
}
}
}
* 스택은 매우 일관된 규칙성이 있다.
모양 상 넣고 빼고 원리가 일정.
(순서는 신경 쓸 필요가 없고, 스택이 알아서 작업해줄 것)
* search()는 코드를 타고 들어가보면
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
이렇게 나와있다.
해석해보면,
- 마지막 인덱스를 구해서 그 인덱스가 0 이상이면 크기에서 인덱스만큼을 빼주고,
- 객체가 없는 경우에는 기본값으로 -1을 리턴함.
=> 위치정보 구하기
예를 들어, Stack 내부에 5개의 요소가 저장되어 있고,
주어진 객체 o가 Stack의 맨 위에서 2번째 인덱스에 위치한다면
size() - i는 5 - 2 = 3.
즉, 객체 o는 Stack의 맨 위에서 3번째 위치임을 알려줌.
대충 이런 모양새
* 그리고 스택을 타고 들어가보면
elementData[i] 라는 표현이 보임.
얘도 결국 내부적으로 배열 형태로 구현되어있음을 확인할 수 있음.
'Java > Mega' 카테고리의 다른 글
<보충> 컬랙션 추가 공부 (2) Map, Set, Queue (0) | 2023.04.28 |
---|---|
Day27. 스타크래프트 문제 코드 비교 (0) | 2023.04.28 |
<보충> Day26. 인터페이스, 추상화 예제 복기하면서 주석 달기 (1) | 2023.04.27 |
Day31. 쓰레드 예시문제 1. (0) | 2023.04.26 |
Day31. Thread(쓰레드) (4) 쓰레드 사이의 통신 (0) | 2023.04.26 |