코드 그라데이션

<보충> 컬랙션 추가 공부(1) List, Stack 본문

Java/Mega

<보충> 컬랙션 추가 공부(1) List, Stack

완벽한 장면 2023. 4. 28. 00:32

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] 라는 표현이 보임.

얘도 결국 내부적으로 배열 형태로 구현되어있음을 확인할 수 있음.

 

728x90
Comments