JAVA

배열(초기화, 복사..)과 컬렉션 종류

S_N_Y 2024. 1. 2. 22:22

📕 배열 초기화

배열 초기화할 때 쓰는 3가지 방법

// 배열 초기화 방법 3가지 정리

import java.util.Arrays; // Arrays 클래스를 import 하기

public class Main {

	public static void main(String[] args) {
		//1. 배열에 특정값 대입하며 선언 - 중괄호 {} 를 사용해서 초기화
		int[] intArray = {1, 2, 3, 4, 5};
		String[] stringArray = {"a", "b", "c", "d"};

		//2-1. for문을 통해 값을 대입하여 초기화
		for (int i = 0; i < intArray.length; i++) {
			intArray[i] = i;
		}

		//2-2. for-each문을 통한 배열 출력하여 초기화
		for (int i : intArray) {
			System.out.print(i); // 01234
		}

		System.out.println(); // 줄바꿈

		//3. 배열의 주소를 모두 같은값으로 초기화(Arrays.fill)
		Arrays.fill(intArray, 1);//배열의 모든 값을 1로 초기화

		for (int i : intArray) {
			System.out.print(i);  // 11111
		}
	}
}

// 출력
// 01234
// 11111

 

 

📗 배열 복사 - Array.copyOf()

// a 배열을 b에 복붙하기
import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		// 2. Arrays.copyOf() 메서드
		int[] a = { 1, 2, 3, 4 };
		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어준다
	}
}

+) .clone()도 복사가 되지만 2차원 이상 배열에서는 얕은 복사(복사했는데 복사했던 배열도 똑같이 바뀌는..) 로 동작하기 때문에 Array.copyOf() 메소드 사용 권장

📘 String 기능 활용

메서드
응답값 타입
설명
length()
int
문자열의 길이를 반환한다.
charAt(int index)
char
문자열에서 해당 index의 문자를 반환한다.
substring(int from, int to)
String
문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다. (to는 범위에 포함되지 않음)
equals(String str)
boolean
문자열의 내용이 같은지 확인한다. 같으면 결과는 true, 다르면 false가 된다.
toCharArray()
char[]
문자열을 문자배열(char[])로 변환해서 반환한다.
new String(char[] charArr)
String
문자배열(char[]) 을 받아서 String으로 복사해서 반환한다.
String str = "ABCD";

// length()
int strLength = str.length();
System.out.println(strLength);  // 4 출력

// charAt(int index)
char strChar = str.charAt(2); // 순번은 0부터 시작하니까 2순번은 3번째 문자를 가리킨다
System.out.println(strChar);  // C 출력

// substring(int from, int to)
String strSub = str.substring(0, 3); // 0~2순번까지 자르기 (3순번은 제외)
System.out.println(strSub);  // ABC 출력

// equals(String str)
String newStr = "ABCD";  // str 값과 같은 문자열 생성
boolean strEqual = newStr.equals(str);
System.out.println(strEqual); // true 출력

// toCharArray()
char[] strCharArray = str.toCharArray(); // String 을 char[] 로 변환

// 반대로 char[] 를 String로 변환하는 방법
char[] charArray = {'A', 'B', 'C'};
String charArrayString = new String(charArray); // char[] 를 String 으로 변환

 

📙 ArrayList

ArrayList : 배열(Array)처럼 일렬로 데이터를 저장하고 조회하여 순번값(인덱스)로 값을 하나씩 조회할 수 있다.

+) Array  Array List의 차이점
Array : 메모리에 연속된 공간을 요청한 사이즈만큼 받고 실제값을 저장하는 기본형 변수 (=정적배열)
ArrayList : 생성시점에 작은 연속된 공간을 요청하여 참조형 변수들을 담아놓고 값이 추가될 때 필요하면 더 큰 공간을 받아 저장 (=동적배열)
// ArrayList 

import java.util.ArrayList; // ArrayList 사용하려면 import 추가

public class Main {

	public static void main(String[] args) {
		ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언 + 생성
		
		intList.add(15); // <Integer>니 괄호 안에 숫자
		intList.add(25);
		intList.add(35);
		
		System.out.println(intList.get(0)); // 15 출력
		System.out.println(intList.get(1)); // 25 출력
		System.out.println(intList.get(2)); // 35 출력
		System.out.println(intList.toString()); // [1,2,3] 출력
        
		// 2번째 있는 값(25)을 바꾸기 - .set()
		intList.set(1, 10); // 1번순번의 값을 10으로 수정해보았음
		System.out.println(intList.get(1)); // 10 출력
		
		
		intList.remove(1); // 1번순번의 값을 삭제 - .remove()
		System.out.println(intList.toString()); // [1,3] 출력
		
		intList.clear(); // 전체 값을 삭제 - .clear()
		System.out.println(intList.toString()); // [] 출력
	}
}

 

📕 LinkedList

LinkedList :모리에 남는 공간을 요청해서 여기저기 나누어 실제값을 담아놓고, 실제값이 있는 주소값으로 목록을 구성하고 저장하는 자료구조(여기저기 나누어 담기 때문에 모든 값을 조회할 때는 느림.. 그러나 값을 중간에 추가/삭제할 때는 빠름!)

// LinkedList 

import java.util.LinkedList; // LinkedList import 하기

public class Main {

	public static void main(String[] args) {
		LinkedList<Integer> linkedList = new LinkedList<>(); // 선언 + 생성

		linkedList.add(1);
		linkedList.add(2);
		linkedList.add(3);

		System.out.println(linkedList.get(0)); // 1 출력
		System.out.println(linkedList.get(1)); // 2 출력
		System.out.println(linkedList.get(2)); // 3 출력
		System.out.println(linkedList.toString()); // [1,2,3] 출력 (전체라 속도 느림)

		linkedList.add(2, 4); // 2번 순번에 4 값을 추가
		System.out.println(linkedList); // [1,2,4,3] 출력

		linkedList.set(1, 10); // 1번순번의 값을 10으로 수정
		System.out.println(linkedList.get(1)); // 10 출력

		linkedList.remove(1); // 1번순번의 값을 삭제
		System.out.println(linkedList); // [1,4,3] 출력

		linkedList.clear(); // 전체 값을 삭제
		System.out.println(linkedList); // [] 출력
	}
}

 

📗 stack

stack : 값을 수직으로 쌓아놓고 넣었다 빼는 데이터 관리 자료구조 (FIFO)

기능 : 넣기 - push(), 조회 - peek(), 꺼내기 - pop()

- 기능이 제한적인 이유 : 최근에 저장된 데이터를 나열하기, 데이터의 중복처리 막기 등으로 유용하게 쓸 수 있기 때문

// Stack 

import java.util.Stack; // stack import 하기

public class Main {

	public static void main(String[] args) {
		Stack<Integer> intStack = new Stack<Integer>(); // 선언 + 생성
		
		intStack.push(1);
		intStack.push(2);
		intStack.push(3);

		while (!intStack.isEmpty()) { // 다 지워질때까지 출력
		    System.out.println(intStack.pop()); // 3,2,1 출력
		}

		// 다시 추가
		intStack.push(1);
		intStack.push(2);
		intStack.push(3);
		
		// peek() -조회
		System.out.println(intStack.peek()); // 3 출력 - 가장 위에 있는거 집기 때문
		System.out.println(intStack.size()); // 3 출력 (peek() 할때 삭제 안됐다는 증거)
		
		// pop() - 꺼내기
		System.out.println(intStack.pop()); // 3 출력
		System.out.println(intStack.size()); // 2 출력 (pop() 할때 삭제 됐다는 증거)		
		
		System.out.println(intStack.pop()); // 2 출력
		System.out.println(intStack.size()); // 1 출력 (pop() 할때 삭제 됐다는 증거)		

		while (!intStack.isEmpty()) { // 다 지워질때까지 출력
		    System.out.println(intStack.pop()); // 1 출력 (마지막 남은거 하나)
		}
	}
}

📘 Queue

Queue : 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합 (FIFO 가능)

기능 : 넣기 - add(), 조회 - peek(), 꺼내기 - poll()

주의) 생성자가 존재하는 클래스인 LinkedList를 사용해야지만 Queue를 생성하여 받을 수 있다

// Queue 

import java.util.LinkedList; // LinkedList, Queue impot 하기
import java.util.Queue;

public class Main {

	public static void main(String[] args) {
		Queue<Integer> intQueue = new LinkedList<>(); // 선언 + 생성

		intQueue.add(1);
		intQueue.add(2);
		intQueue.add(3);

		while (!intQueue.isEmpty()) { // 다 지워질때까지 출력
			System.out.println(intQueue.poll()); // 1,2,3 출력
		}

		// 다시 추가
		intQueue.add(1);
		intQueue.add(2);
		intQueue.add(3);

		// peek()
		System.out.println(intQueue.peek()); // 1 출력 (맨먼저 들어간값이 1 이라서)
		System.out.println(intQueue.size()); // 3 출력 (peek() 할때 삭제 안됐다는 증거)

		// poll()
		System.out.println(intQueue.poll()); // 1 출력
		System.out.println(intQueue.size()); // 2 출력 (poll() 할때 삭제 됐다는 증거)

		System.out.println(intQueue.poll()); // 2 출력
		System.out.println(intQueue.size()); // 1 출력 (poll() 할때 삭제 됐다는 증거)

		while (!intQueue.isEmpty()) { // 다 지워질때까지 출력
			System.out.println(intQueue.poll()); // 3 출력 (마지막 남은거 하나)
		}
	}
}

 

📙 Set

set : 순서를 보장 안 하지만 중복 허용 안하는 데이터의 집합(배열)

기능 : 추가 - intSet.add({추가할 값})

         조회 - intSet.get({초회할 순번})

         삭제 - intSet.remove({삭제할 값})

         포함 확인 - intSet.contains({포함확인 할 값})

주의) 생성자가 존재하는 클래스인 HashSet, TreeSet, LinkedHashSet 등으로 응용 사용해야지 set을 생성하여 받을 수 있다

          그러나 set은 그냥 쓸 수도 있다 - Queue와 마찬가지로 생성자가 없는 껍데기라 바로는 생성할 수 없음

// Set 

import java.util.HashSet; // HashSet(예시는 일단 hashset으로), Set import 하기
import java.util.Set;

public class Main {

	public static void main(String[] args) {
		Set<Integer> intSet = new HashSet<Integer>(); // 선언 + 생성

		intSet.add(1);
		intSet.add(2);
		intSet.add(3);
		intSet.add(3); 
		intSet.add(3); 

		for (Integer value : intSet) {
			System.out.println(value); // 1,2,3 출력(중복된 값(3)은 덮어씀)
		}

		// contains()
		System.out.println(intSet.contains(2)); // true 출력
		System.out.println(intSet.contains(4)); // false 출력

		// remove()
		intSet.remove(3); // 3 삭제

		for (Integer value : intSet) {
			System.out.println(value); // 1,2 출력
		}
	}
}

 

📕 Map

map : 위에는 value값들만 넣어서 관리했다면 map은 key-value 구도로 구성된 데이터 구조

기능 : 추가 - intMap.put({추가할 값},{추가할 value값})

         조회 - intMap.get({조회할 key값})

         전체 key 조회 -  intMap.keySet( )

         전제 value 조회 - intMap.values( )

         삭제 - intMap.remove({삭제할 key값})

 

set과 마찬가지로 HashSet, TreeSet, LinkedHashSet 등으로 응용하여 사용할 수 있다

// Map 

import java.util.Map; // map import 하기

public class Main {

	public static void main(String[] args) {
		Map<String, Integer> intMap = new HashMap<>(); // 선언 + 생성

		//          키 , 값
		intMap.put("일", 11);
		intMap.put("이", 12);
		intMap.put("삼", 13);
		intMap.put("삼", 14); // 중복 Key값은 덮어씀
		intMap.put("삼", 15); // 중복 Key값은 덮어씀

		// key 값 전체 출력
		for (String key : intMap.keySet()) { // .keySet() : key만 빼서 배열로 만들기
			System.out.println(key); // 일,이,삼 출력
		}

		// value 값 전체 출력
		for (Integer key : intMap.values()) {
			System.out.println(key); // 11,12,15 출력 - 마지막에 쓴 15로 덮어쓰기된 것
		}

		// get() - 해당 키의 value 출력
		System.out.println(intMap.get("삼")); // "삼"이란 key를 가진 value 출력 : 15 출력
	}
}