TIL

(2024-4-22) 자바문법종합반 복사,Collection

o_coding 2024. 4. 22. 20:08

얕은복사

int[] a = {1,2,3,4};
int[] b = a;

레퍼런스 타입 은 주소값을 가리키고 있기 때문에 b에 a를 대입 했지만 b와 a가 가리키는 주소가 같아서 b값을 변경하면 a값도 변경된다.

 

깊은복사 메서드 .clone()

int[] a = {1,2,3,4};
int[] b = a.clone();

a.clone()을 하게되면 a배열에 있는 값들만 b에 복사가 되서 별개의 주소를 가리키기 때문에 각각 따로 변경가능하다.

하지만 클론 매서드는 2차원 이상 배열에서 얕은복사로 동작한다.(배열 안에 배열이 있으면 안에 있는 배열들은 같은 주소를 가리키기 때문에) 그래서 Arrays 클래스에 copyOf 메서드를 사용하면 완전히 깊은복사가 가능하다.

int[] a = {1,2,3,4};
int[] b = Arrays.copyOf(a,a.length); //배열과 함께 length값도 넣어줍니다.

 

Collection

-List 

*ArrayList

:동적 배열로 크기가 가변적으로 늘어난다 생성 시점에 작은 연속된 공간을 요청해서 참조형 변수들을 담아 놓는다.

ArrayList<Integer> intList = new ArrayList<Integer>();
intList.add(99);
intList.add(15);
intList.add(3);
System.out.println(intList.get(0));

intList.set(1,10);
System.out.println(intList.get(0));

intList.remove(0);
System.out.println(intList.get(0));
System.out.println(intList.toString());
//클리어 전
intList.clear();
System.out.println(intList.toString());

제네릭에 레퍼클래스로 타입을 적어서 생성 하고 사이즈를 지정할 필요가 없다.

.add() : 리스트에 추가

.set(인덱스,변경할값) : 지정한 인덱스에 값 변경

.get(인덱스) : 지정한 인덱스 값 조회

.toString() : 리스트 전체 조회

.clear() : 리스트 초기화

*LinkedList

:메모리에 남은 공간을 요청해서 여기저기 나누어서 실제값을 저장한다. 기본적인 기능은 ArrayList와 동일하다. 값이 이리저리 나누어 저장되기 때문에 조회하는 속도가 느리다. 하지만 값을 추가하거나 삭제할 때는 빠르다.

ArrayList<Integer> intList = new ArrayList<Integer>();

 

 

-Stack

:LIFO 방식으로 가장 최근에 들어간 데이터가 가장 먼저 나오는 방식

Stack<Integer> intStack = new Stack<Integer>();

intStack.push(10);
intStack.push(15);
intStack.push(1);

while(!intStack.isEmpty()){
System.out.println(intStack.pop());
}
intStack.push(10);
intStack.push(15);
intStack.push(1);

System.out.println(intStack.peek());
System.out.println(intStack.size());

.push(데이터) : 데이터 추가

.pop() : 스택 가장 위에있는 데이터 제거

.isEmpty() : 스택이 비어있는 경우 true반환

.peek() : 스택 가장 위에있는 데이터 반환

 

-Queue

:FIFO방식으로 처음들어간 데이터가 가장먼저 나오는 방식이다.Queue는 생성자가 없는 인터페이스 이기 때문에 new로 생성 못하고 LinkedList로 생성한다 .add()와 .isEmpty()는 동일하고 스택에서는 pop()을 사용했지만

큐에서는 poll을 사용해 데이터를 제거한다. 그리고 가장 먼저 입력된 데이터부터 출력된다. peek()를 사용할 때도 가장 먼저 입력한 아레있는 데이터를 반환

public static void main(String[] args) {
Queue<Integer> intQueue = new LinkedList<>();

intQueue.add(1);
intQueue.add(5);
intQueue.add(9);

while (!intQueue.isEmpty()){
System.out.println(intQueue.poll());
}
intQueue.add(1);
intQueue.add(5);
intQueue.add(9);
System.out.println(intQueue.peek());
System.out.println(intQueue.size());
}

.poll() : 큐 가장 아래있는 데이터 제거

.peek() : 큐 가장 아래있는 데이터 반환

-Set

:순서가 없고 중복이 없다 순서가 보장되지 않고 중복을 허용하지 않는 프로그램에서 사용할 수 있는 자료구조이다 생성자가 존재하는

HashSet을 이용해서 구현할 수 있다.

public static void main(String[] args) {
Set<Integer> intSet = new HashSet<>();
intSet.add(1);
intSet.add(12);
intSet.add(5);
intSet.add(9);
intSet.add(1);
intSet.add(12);
for (Integer value : intSet) {
System.out.println(value);
}
System.out.println(intSet.contains(2));
System.out.println(intSet.contains(5));
}

.contains(데이터) : 데이터를 포함하는 지 확인 boolean타입 반환

-Map

:Key와 Value로 이루어져 있고 Key값은 중복을 허용하지 않는다 순서를 보장하지 않기때문에 인덱스가 없어서 iterator로 조회한다.

public static void main(String[] args) {
Map<String,Integer> intMap = new HashMap<>();
intMap.put("",1);
intMap.put("",2);
intMap.put("",3);
intMap.put("",4);
intMap.put("",5);
intMap.put("",6);
for (String value : intMap.keySet()) {
System.out.println("value = " + value);
}
for (Integer value : intMap.values()) {
System.out.println("value = " + value);
}
System.out.println(intMap.get(""));
}

.keySet() : 키로된 배열 반환

.values() : value로 된 배열 반환

.get(key) : 입력한 키에 value 반환

key값이 중복이면 마지막에 put한 값으로 저장된다.