[TIL#9] Java를 자바랑 part.4 <배열(다차원, 가변), 컬렉션(ArrayList, LinkedList, Stack, Queue, Set, Map)
<어제 검색해서 찾은 것들>
: 없을 무
<데일리 루틴>
내배캠 공부
밥 잘 먹기
운동 (사유 : 감기)
1. 기본형 변수 vs 참조형 변수 심화
1) 기본형 변수 '소문자로 시작함' 반면, 참조형 변수는 '대문자로 시작함'. Wrapper class에서 기본형 변수를 감싸줄 때(boxing), int를 감싸는 변수는 Integer였다. 즉 소문자 변수들을 감싸는 변수는 대문자다.
2) 기본형 변수는 값 자체를 저장하는 반면, 참조형 변수는 별도의 공간에 값을 저장 후 그 주소를 저장함.(=주소형 변수)
3) 참조형 변수들이 가진 기능들이 더 유용하다.
2. String
: String = char [ ], 문자열은 문자형의 배열과 동일하다.
1) 유용한 기능
가) ~~.length ( ); ~~의 길이(=저장 개수)를 지칭
나) ~~.charAt ( ); ~~의 ( )번째 문자를 지정
다) ~~.substring (ㅁ , ㄴ); ~~의 String을 ㅁ부터 ㄴ전까지 잘라서 새로운 String을 만들겠다.
라) ~~.equals ( ); ~~의 String이 ( )의 String과 같니?
마) ~~.toCharArray ( ); String을 char[ ]로 변형
3. 다차원 배열
: A[ ]의 값이 B[ ]인 2차원 배열, A[ ]의 값이 B[ ]이고 B[ ]의 값이 C[ ]인 3차원 배열......(계속)이라고 한다. 쉽게 표현하자면 1차원(점, 선), 2차원(면), 3차원(공간)을 생각하면 된다.
1) 선언
2차원 배열 선언 int[][] array int array[][] int[] array[]
2) 생성
int[][] array = new int[2][3];
새로운 2차원 배열은 2*3=6개의 저장 공간을 가진 배열이 된다. 2차원 배열이니 2*3의 표를 그린 것과 같다.
3) 초기화
가)직접 대입
int[][] array = { {1, 2, 3}, {4, 5, 6} };
나)for문 사용
int[][] array = new int[2][3];
for (int i =0; i < array.length; i++)
{for (int j=0; j < array[j].length; j++)
{array[i][j] = 0;}}
나) 2차원 배열이므로 구구단과 유사.
4) 가변 배열
: 2차원 배열을 만들 때 뒤쪽 배열의 숫자를 지정하지 않음으로 길이가 정해지지 않은 배열을 만들 수 있음
가) int[][] array = new int[2][ ];
나)int[][] array = { {10, 20}, {10, 20, 30, 40}, {10} };
가) 2 * ? 의 배열이 만들어진다. ?배열의 크기를 각각 다르게 지정할 수 있다.
나) 지정 선언하면서 가변 배열을 만들 수도 있다.
5)조회
int[][] array = { {10, 20, 30}, {10, 20, 30, 40}, {10, 20} };
가) System.out.println(array[1][3]);
나) for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.println(array[i][j]); } }
가) 단건 조회 : 2번째 배열의 4번째 값(40)을 조회한다.
나) i.length (=1차원 길이)와 j.length (=2차원 길이) 를 순회하며 값을 조회한다. 출력 값은 '10, 20, 30, 10, 20, 30, 40, 10, 20'
6) 활용
int [] arr = {3, 2, 0, 5, 1};
int max = arr[0];
for (int num : arr) {
if (num > max) {
max = num; } }
System.out.println("최대값은 = " + max);
최댓값 구하기 : int arr이란 배열을 만들고 3, 2, 1, 5, 1 값을 저장하는 길이 5의 배열을 만든다. max에 arr의 첫 번째 값(3)을 저장한다. 향상된 for문을 이용하여 arr의 값을 순차적으로 num에서 사용한다. 만약 num이 max보다 크다면 num을 max에 대입한다. 향상된 for문을 완료하면 max를 출력한다.
최솟값은 부등호를 반대로 하면 된다.
4. 컬렉션
: 배열을 더 고도화시킨 것. 크기 자동조정, 추가, 수정, 삭제, 반복, 순회, 필터, 포함확인 등등등... 기본형 변수가 아닌 참조형 변수를 저장한다. ex) int의 참조형 변수 Integer, long의 참조형 변수 Long, double의 참조형 변수 Double, 그리고 String 등
1) 종류
가) ArrayList : 순서가 있는 데이터의 집합(데이터 중복 허용), 처음에 길이를 몰라도 만들 수 있음. List라고 쓰고 ArrayList라고 읽는다.
A) ArrayList<Integer> intList = new ArrayList<Integer>();
B) intList.add(1); intList.add(2); intList.add(3);
C) System.out.println(intList.get(0));
D) System.out.println("최초 " +intList.toString());
E) intList.set(1, 10);
System.out.println(intList.get(1));
System.out.println("2번째 값을 바꾼 후 "+ intList.toString());
F) intList.remove(0);
System.out.println(intList.get(0));
System.out.println("2번째 값을 바꾸고 1번째 값을 지운 후 "+ intList.toString());
G) intList.clear();
System.out.println("모든 값을 지운 후 "+intList.toString());
A) 선언 방법 : ArrayList<저장할데이터의참조형데이터타입Integer> List이름 = new ArrayList<저장할데이터의참조형데이터타입Integer> ( );
B) 초기화 방법 : ~~.add(1) ~~List 에 ( )를 값으로 추가.
C) 읽는 방법 : ~~.get( ㅁ ) ~~List 에 ㅁ+1 번째 값을 읽는다.
D) 배열 전체를 읽는 방법 : ~~.toString( ) ~~을 문자열로 바꾼다. + sout와 연결되어 전체를 읽을 수 있다. 값은 [1, 2, 3].
E) 값 바꾸기 : ~~.set (ㅁ, ㄴ) ~~List 의 ㅁ+1 번째 값을 ㄴ으로 바꾼다. 값은 [1, 10, 3].
F) 값 지우기 : ~~.remove (ㅁ) ~~List 의 ㅁ+1 번째 값을 삭제한다. ㅁ+1 번째 값이 지워지면 값들이 한 칸씩 당긴다. 즉 ㅁ+2 번째 값이 ㅁ번째 값으로 바뀐다. 값은 [10, 3].
G) 전체 값 지우기 : ~~.clear( ); ~~List 의 모든 값을 지운다. 값은 [ ].
나) LinkedList
: 대부분의 기능은 ArraytList와 동일. 메모리에 남는 공간을 요청해서 여기저기 나누어서 실제 값을 저장한 후 그 주소값을 받아 LinkedList를 구성하고 저장한다. 조회속도는 느리나 추가 삭제 속도는 빠르다.
A) LinkedList<Integer> linkedList = new LinkedList<Integer>();
B) linkedList.add(10); linkedList.add(20); linkedList.add(30);
System.out.println(linkedList.get(0));
System.out.println(linkedList.toString());
C) linkedList.add(1, 200);
System.out.println(linkedList.toString());
linkedList.set(0, 30);
System.out.println(linkedList.toString());
linkedList.remove(0);
System.out.println(linkedList.toString());
linkedList.clear();
System.out.println(linkedList.toString());
A) 선언 방법 : LinkedList<저장할데이터의참조형데이터타입Integer> List이름 = new LinkedList<저장할데이터의참조형데이터타입Integer> ( );
B) 초기화 방법 : ~~.add(1) ~~List 에 ( )를 값으로 추가.
C) ArrayList와 다른 .add의 사용법 : ~~.add(ㅁ, ㄴ) List의 ㅁ+1 번째 자리에 ㄴ을 추가. ㄴ이 ㅁ+1 자리에 추가되면 값들이 뒤로 밀린다. 즉 추가되기 전 ㅁ+2의 값은 ㅁ+3의 값이 된다. 값은 [10, 200, 20, 30].
다) Stack
: 값을 수직으로 값을 쌓아놓고, 넣었다가 뺀다. 바구니 형태의 FILO(First In Last Out) 구조. 값을 넣고(push), 조회하고(peek), 꺼내는 기능(pop)이 주된 기능. 최근 저장된 데이터를 나열하거나, 데이터의 중복 처리를 막고 싶을 때 사용.
A) Stack<Integer> intStack = new Stack<Integer>();
B) intStack.push(10); intStack.push(15); intStack.push(1);
값이 다 지워질 때까지 출력
C) while (!intStack.isEmpty()){System.out.println(intStack.pop());}
intStack.push(10); intStack.push(15); intStack.push(1);
D) System.out.println(intStack.peek());
E) System.out.println(intStack.size());
A) 선언 방법 : Stack<저장할데이터의참조형데이터타입Integer> List이름 = new Stack<저장할데이터의참조형데이터타입Integer> ( );
B) 초기화 방법 : Stack이름.push(1) Stack이름에 ( )를 값으로 추가.
C) 모든 값을 출력 : ~~.isEmpty( ) 는 ~~이 비었냐?하고 묻는다. 그 앞에 !(=not)을 붙여서 ~~이 채워져 있냐?로 바꿨고 채워져 있다면 while문을 반복한다. ~~.pop는 ~~ Stack제일 위에 값을 반환하고 꺼내서 버린다. Stack은 바구니 형태의 FILO(First In Last Out) 구조이므로 제일 나중에 들어간 값부터 출력하고 바구니에서 꺼내서 버린다. 값은 1, 15, 10.
D) 조회하기 : ~~.peek( ) 는 ~~Stack에서 조회할 수 있는 제일 처음 값을 조회한다. Stack의 구조상 가장 위에 있는 값을 조회한다. 값은 1.
E) 사이즈 확인 : ~~.size( ) 는 ~~Stack의 사이즈(=저장개수, 길이)를 확인하는 기능이다.
라) Queue
: 빨대처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합. FIFO(First In First Out) 구조로 먼저 들어간 순서대로 값을 조회할 수 있다. add(추가), peek(조회), poll(꺼내다) 기능이 대표적. 과거 작성한 글에서 nextLine 사용 관련 문제점을 기술할 때 한번 언급이 되었다.(3번 항목 참조)
A) Queue<Integer> intQueue = new LinkedList<>();
intQueue.add(1); intQueue.add(5); intQueue.add(9);
B) while (!intQueue.isEmpty()) {System.out.println(intQueue.poll());}
intQueue.add(1); intQueue.add(5); intQueue.add(9);
C) System.out.println(intQueue.peek());
System.out.println(intQueue.size());
A) 선언 방법 : 위의 다른 메서드들과 동일하다. 다만, LinkedList를 대입한다. 이유는 생성자가 없는 인터페이스이기 때문에 new로 Queue를 생성할 수 없다. 반대로 new는 생성자가 있는 인터페이스만 만들 수 있다. 이 개념은 조금 더 뒤에서 다루겠다.
B) 전부 꺼내기 : Stack에서의 코드와 비슷하다. poll은 Queue에서 값들을 꺼낸다. Queue의 구조상 제일 먼저 입력된 값인 1부터 꺼내어지고 sout로 출력된다. 값은 1, 5, 9.
C) 조회하기 : peek는 조회할 수 있는 제일 처음 값을 조회한다. Queue의 구조상 가장 먼저 입력된 값을 조회한다. 값은 1.
마) Set
: 순서가 없는 데이터의 집합(데이터 중복 허용 안 함), 순서 없고 중복 없는 배열, 집합이라고 생각하면 된다. 순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조. 그냥 쓸 수도 있으나 HashSet, TreeSet 등으로 응용해서 같이 사용 가능하다. Set 또한 생성자가 없는 인터페이스라서 바로 생성할 수 없다. 따라서 현 수준에서는 생성자가 있는 HashSet으로 설명한다.
Set<Integer> intSet = new HashSet<>();
intSet.add(1); intSet.add(12); intSet.add(5); intSet.add(9);
intSet.add(1); intSet.add(12);
A) for (Integer value : intSet) {
System.out.println(value);
}
B) System.out.println(intSet.contains(2));
System.out.println(intSet.contains(5));
A) 향상된 for문으로 int의 참조형 변수 Integer를 생성하고 intset을 값으로 한다. 그리고 출력한다. Set은 중복을 허용하지 않기 때문에 출력 값이 1, 12, 5, 9, 1, 12가 아닌 1, 12, 5, 9로 나온다.
B) ~~contains( ) 는 ~~에 ( )를 포함하고 있니?라고 물어본다. 값은 F, T로 나온다.
나머지 remove나 기타 다른 부분들은 위와 같다.
바) Map
: 순서가 없는 (Key, Value) 쌍으로 이루어진 데이터의 집합(Key값 중복 허용 안 함), Key로 Value를 찾는 구조이기 때문에 Key는 중복되면 안 된다. Map 또한 HashMap, TreeMap으로 응용 가능하다.
A) Map<String, Integer> intMap = new HashMap<>();
B) intMap.put("일", 11); intMap.put("이", 12); intMap.put("삼", 13);
intMap.put("삼", 14); intMap.put("삼", 15);
C) for (String key : intMap.keySet()) {System.out.println(key);}
D) for (Integer value : intMap.values()) {System.out.println(value);}
E) System.out.println(intMap.get("삼"));
A) 선언 방법 : Map은 (Key, Value)가 함께 움직인다. 따라서 선언 또한 따로 해줘야 한다.
B) 초기화 방법 : ~~.put(Key, Value) 로 ~~에 Key값과 Value값을 입력한다.
C) Key 출력하기 : Key는 "일", "이", "삼" 처럼 String으로 입력했으니 String으로 참조형 변수를 만들고 key값을 불러오는 메서드 ~~.keyset을 사용한다. Map은 key값의 중복을 허용하지 않기 때문에 "일", "이", "삼", "삼", "삼" 이 아니라 중복되는 Key의 값을 생략한 "일", "이","삼"이 출력된다.
D) Value 출력하기 : 그렇다면 중복되는 key에 해당하는 value의 값은 무엇일까? Key 출력하기와 마찬가지로 value의 값인 int의 참조형 변수 Interger를 만들고 Value값을 가져오는 메서드 ~~.values를 사용한다. 출력값은 11, 12, 15 이다. 즉, 생략되지 않는 Key는 제일 마지막의 Key이다.
E) Value 단건 조회 : ~~.get( )으로 단건 조회한다.
<TMI. 감기 걸렸다. 환절기 감기는 무섭다.>
[TIL#11-2] Java를 자바랑 part.5 <객체, 메서드> (0) | 2023.10.19 |
---|---|
[TIL#11-1] Java를 자바랑 part.5 <객체 지향 프로그래밍이란?> (0) | 2023.10.19 |
[TIL#8] Java를 자바랑 part.3 <연산자, 조건문(if, switch-case), 반목문(for, while, break, countinue), 배열(Arrays.), 깊은복사&얕은복사> (2) | 2023.10.16 |
[TIL#6-1] Java를 자바랑 part.2 <import, Scanner입력&출력, 문자와 문자열, 참조형 변수 심화, 형변환> (0) | 2023.10.13 |
[TIL#5-2] Java를 자바랑 part.1 <변수, 래퍼클래스> (0) | 2023.10.12 |