Array
배열은 크기를 지정해 놓고 생성해야 된다. 이처럼 크기를 고정해 놓고 생성하는 것을 정적 배열이라 한다.
int[] arr = new int[3]; // 크기를 지정해놓고 생성
arr[0] = 1;
System.out.println(arr[0]);
얕은 복사
int[] a = {1, 2, 3, 4};
int[] b = a;
b[0] = 3;
System.out.println(a[0]);
// 결과 : 3
이렇게 복사하면 배열의 주소값이 복사되어 a와 b가 같은 값을 가리키게 된다.
깊은 복사
clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작한다.
int[] a = {1, 2, 3, 4};
int[] b = a.clone();
b[0] = 3;
System.out.println("b[0] : " + b[0]);
System.out.println("a[0] : " + a[0]);
// 결과 : b[0] : 3
// a[0] : 1
그러므로, 배열을 복사할 때는 copyOf() 메서드를 이용한다.
// 깊은 복사 메서드
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값도 같이 넣어줍니다.
}
}
Collection
List
리스트는 크기가 가변적으로 늘어나는 동적배열이다.
ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언과 동시에 생성 크기 지정x
intList.add(99);
intList.add(50);
intList.add(12); // 값이 추가되면서 크기가 늘어난다.
System.out.println(intList.get(1));
intList.set(1, 77); // 값을 수정
System.out.println(intList.get(1));
ArrayList<Integer> intList = new ArrayList<Integer>(); // 선언과 동시에 생성
intList.add(99);
intList.add(50);
intList.add(12);
System.out.println(intList.get(0));
intList.remove(0);
System.out.println(intList.get(0));
결과 : 99
50 // remove로 값을 제거하면 뒤에 있던 값들이 앞으로 땡겨진다.
Stack
값을 수직으로 쌓아놓고 넣었다가 빼서 조회하는 형식으로 데이터를 관리하는 자료형
LIFO “나중에 들어간 것이 가장 먼저 나온다(Last-In-First-out)”
Stack<Integer> intStack = new Stack<>();
intStack.push(29);
intStack.push(7);
intStack.push(1004); // 값을 넣어줌
while (!intStack.isEmpty()){
System.out.println(intStack.pop()); // 맨 위에 값을 꺼낸다.
}
// 결과 :
1004
7
29
Set
순서가 없고 자료의 중복을 허용하지 않는 집합으로 생성자가 없어 생성자가 존재하는 HashSet 클래스를 이용해서 생성한다.
- 선언 : Set<Integer> intSet
- 생성 : new HashSet<Integer>()
- 추가 : intSet.add({추가할 값})
- 조회 : intSet.get({조회 할 순번})
- 삭제 : intSet.remove({삭제할 값})
- 포함확인 : intSet.contains({포함확인 할 값}) - 해당값이 포함되어 있는지 boolean 값으로 응답
Map
key-value 구조로 key값은 중복을 허용하지 않는다.
- 선언 : Map<String, Integer> intMap
- 생성 : new HashMap<>()
- 추가 : intMap.put({추가할 Key값},{추가할 Value값})
- 조회 : intMap.get({조회할 Key값})
- 전체 key 조회 : intMap.keySet() - Map의 모든 Key를 모아서 Set 자료형으로 리턴
- 전체 value 조회 : intMap.values() - Map의 모든 Value를 모아 Set 자료형으로 리턴
- 삭제 : intMap.remove({삭제할 Key값})
연습
자료구조 요리 레시피 메모장 만들기
- 입력값
- 저장할 자료구조명을 입력합니다. (List / Set / Map)
- 내가 좋아하는 요리 제목을 먼저 입력합니다.
- 이어서 내가 좋아하는 요리 레시피를 한 문장씩 입력합니다.
- 입력을 마쳤으면 마지막에 “끝” 문자를 입력합니다.
- 출력값
- 입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 먼저 출력해줍니다.
- 이어서, 입력한 모든 문장 앞에 번호를 붙여서 입력 순서에 맞게 모두 출력해줍니다.
내가 작성한 코드 일부
switch (type) {
case "List" :
boolean flag = true;
ArrayList<String> recipeArr = new ArrayList<>();
while (flag) {
String recipe = sc.nextLine();
recipeArr.add(recipe);
if(recipe.equals("끝")) {
flag = false;
}
}
System.out.println("[ " + type + "으로 저장된 " + title + " ]");
for(String item : recipeArr) {
System.out.println(item);
}
break;
정답 코드 일부
switch (collectionName) {
case "List":
ArrayList<String> strList = new ArrayList<>();
while (true) {
// 한줄씩 입력받아서 strList 에 저장
String text = sc.next();
if (Objects.equals(text, "끝")) {
break;
}
strList.add(text);
}
title = "[ List로 저장된 " + title + " ]"; // [ 제목 ]
System.out.println(title);
// strList 한줄씩 출력
for (int i = 0; i < strList.size(); i++) {
int number = i + 1;
System.out.println(number + ". " + strList.get(i));
}
break;
알게 된 점
- "끝"을 입력받았을 때 boolean 변수를 false로 바꿔서 while문을 빠져나왔는데 정답코드를 보니 그냥 간단하게 break를 쓰면 됐었다. 아직 break가 익숙지 않아서 이런 차이가 생긴 것 같다.
- 처음에 레시피를 next()로 받았더니 레시피를 한 줄 단위가 아닌 단어로 받아와서 nextLine()으로 수정했다. 공백을 포함한 한 줄을 온전히 받으려면 nextLine 메서드를 써야겠다.
'TIL > WEEK2' 카테고리의 다른 글
JAVA3 객체지향 프로그래밍2 (0) | 2023.05.26 |
---|---|
JAVA3 객체지향 프로그래밍1 (0) | 2023.05.25 |
JAVA 2주차 조건문과 반복문 (0) | 2023.05.23 |
JAVA 1주차 (0) | 2023.05.22 |