Java의 반복문, 배열, 다차원 배열, 향상된 for문, List, Map, Set 컬렉션 프레임워크
1) while 반복문과 switch 표현식
| 학습 내용 | 설명 |
|---|
| while 반복문 | 조건이 참인 동안 반복 수행 |
| break | 반복문 즉시 종료 |
| switch 표현식 | 값을 반환할 수 있는 switch 문 |
| Scanner | 사용자 입력 처리 |
| isBlank() | 문자열이 비어있는지 확인 |
import java.util.Scanner;
public class Example01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("포켓몬을 선택하세요.");
System.out.println("1. 이상해씨 2. 꼬부기 3. 파이리 4. 피카츄");
int selectedNumber = scanner.nextInt();
String pokemonName = switch (selectedNumber) {
case 1 -> "이상해씨";
case 2 -> "꼬부기";
case 3 -> "파이리";
case 4 -> "피카츄";
default -> "";
};
if (pokemonName.isBlank()) {
System.out.println("잘못된 입력입니다.");
} else {
System.out.println("선택한 포켓몬 : " + pokemonName);
break;
}
}
}
}
- 사용자가 올바른 번호를 입력할 때까지 반복
- switch 표현식으로 포켓몬 이름 반환
- 빈 문자열 여부를 검사하여 유효성 체크
- 정상 입력 시 break로 반복 종료
2) for문과 while문
| 학습 내용 | 설명 |
|---|
| for문 | 반복 횟수가 명확할 때 사용 |
| while문 | 조건 기반 반복 |
| 증감 연산자 | ++, -- |
| 중첩 반복문 | 반복문 안에 반복문 |
| 스코프(scope) | 변수의 사용 가능 범위 |
public class Example02 {
public static void main(String[] args) {
for (int number = 1; number <= 9; number++) {
System.out.println(number);
}
int count = 1;
while (count <= 9) {
System.out.println(count++);
}
for (int number = 9; number >= 1; number--) {
System.out.println(number);
}
for (int dan = 1; dan <= 9; dan++) {
for (int multiplier = 1; multiplier <= 9; multiplier++) {
System.out.println(dan + " * " + multiplier +
" = " + dan * multiplier);
}
}
}
}
- 정방향 반복과 역방향 반복 구현
- 이중 for문으로 구구단 출력
- 내부 반복문이 모두 종료된 후 외부 반복문 진행
03. 배열(Array)
| 학습 내용 | 설명 |
|---|
| 배열 선언 | 같은 자료형 여러 개 저장 |
| 배열 초기화 | new 자료형[크기] |
| 인덱스 | 0부터 시작 |
| length | 배열 길이 |
| Arrays.toString() | 배열 출력 |
import java.util.Arrays;
public class Example03 {
public static void main(String[] args) {
int[] scores = new int[5];
scores[0] = 100;
System.out.println(scores[0]);
System.out.println(scores.length);
System.out.println(Arrays.toString(scores));
int[][] matrix = {
{1,2,3},
{4,5,6}
};
System.out.println(Arrays.deepToString(matrix));
}
}
- 배열 생성 후 값 저장
- 배열 길이 확인
- 2차원 배열 출력
04. 배열 순회와 2차원 배열
| 학습 내용 | 설명 |
|---|
| 배열 순회 | 반복문을 이용한 접근 |
| 역순 탐색 | length 활용 |
| 2차원 배열 | 행(row), 열(column) 구조 |
| 이중 반복문 | 다차원 배열 탐색 |
String[] fruits = {"apple", "banana", "cherry"};
for (int index = 0; index < fruits.length; index++) {
System.out.println(fruits[index]);
}
for (int index = fruits.length - 1; index >= 0; index--) {
System.out.println(fruits[index]);
}
- 정방향 탐색
- 역방향 탐색
- 2차원 배열은 이중 반복문 사용
05. 향상된 for문 (for-each)
| 학습 내용 | 설명 |
|---|
| 향상된 for문 | 배열 요소 순회 |
| 반복 변수 | 읽기 전용 개념 |
| 다차원 배열 순회 | 중첩 for-each 가능 |
char[] alphabetArray = {'a','b','c'};
for(char alphabet : alphabetArray){
System.out.println(alphabet);
}
- 배열 요소를 직접 순회
- 인덱스 없이 접근 가능
- 읽기 전용으로 사용
06. List와 ArrayList
| 학습 내용 | 설명 |
|---|
| ArrayList | 동적 배열 |
| List 인터페이스 | 리스트의 공통 규격 |
| 제네릭 | 자료형 제한 |
| add/get/set/remove | 주요 메서드 |
import java.util.ArrayList;
import java.util.List;
public class Example06 {
public static void main(String[] args) {
List<Integer> numberList = new ArrayList<>();
numberList.add(10);
numberList.add(20);
System.out.println(numberList.get(0));
numberList.set(1, 100);
numberList.remove(0);
System.out.println(numberList);
}
}
- List 타입으로 선언
- ArrayList 객체 생성
- 추가, 조회, 수정, 삭제 수행
07. Map과 HashMap
| 학습 내용 | 설명 |
|---|
| Map | Key-Value 구조 |
| HashMap | Map 구현 클래스 |
| put/get | 저장 및 조회 |
| getOrDefault | 기본값 처리 |
| entrySet | 전체 순회 |
import java.util.HashMap;
import java.util.Map;
public class Example07 {
public static void main(String[] args) {
Map<String, Integer> fruitPriceMap = new HashMap<>();
fruitPriceMap.put("사과", 1000);
fruitPriceMap.put("바나나", 2000);
System.out.println(fruitPriceMap.get("사과"));
fruitPriceMap.put(
"체리",
fruitPriceMap.getOrDefault("체리", 0)
);
for(Map.Entry<String, Integer> item
: fruitPriceMap.entrySet()) {
System.out.println(item.getKey());
System.out.println(item.getValue());
}
}
}
- Key-Value 구조 사용
- getOrDefault로 NullPointerException 예방
- entrySet으로 전체 순회
08. Set과 HashSet
오늘 배운 내용
| 학습 내용 | 설명 |
|---|
| Set | 중복 불가 |
| HashSet | Set 구현 클래스 |
| contains | 존재 여부 확인 |
| add/remove | 추가 및 삭제 |
실습 코드
import java.util.HashSet;
import java.util.Set;
public class Example08 {
public static void main(String[] args) {
Set<String> memberSet = new HashSet<>();
memberSet.add("철수");
memberSet.add("철수");
memberSet.add("영희");
System.out.println(memberSet);
System.out.println(memberSet.contains("영희"));
memberSet.remove("철수");
}
}
- 중복 데이터 저장 불가
- contains로 존재 여부 확인
- remove로 삭제 가능
직면한 문제와 해결 과정
문제 1. ArrayList 와 List 의 차이
고민한 내용
ArrayList<Integer> scoreList = new ArrayList<>();
List<Integer> scoreList = new ArrayList<>();
| 구분 | ArrayList 선언 | List 선언 |
|---|
| 타입 | 구현 클래스 | 인터페이스 |
| 사용 가능 메서드 | ArrayList 전용 + List 메서드 | List가 제공하는 메서드만 |
| 유연성 | 낮음 | 높음 |
| 실무 사용 | 상대적으로 적음 | 권장 |
해결하기 위해 시도한 것
| 시도 | 결과 |
|---|
| ArrayList로 선언 | 정상 동작 |
| List로 선언 | 정상 동작 |
| 메서드 사용 범위 비교 | 인터페이스 기준으로 제한됨 확인 |
결론
List<Integer> scoreList = new ArrayList<>();
실무에서는 구현체보다 인터페이스에 의존하는 것이 객체지향 원칙에 더 적합하다.
문제 2. HashMap<String,Integer> 와 Map<String,Integer> 의 차이
고민한 내용
HashMap<String, Integer> productMap = new HashMap<>();
Map<String, Integer> productMap = new HashMap<>();
해결하기 위해 시도한 것
| 시도 | 결과 |
|---|
| HashMap 타입 선언 | 사용 가능 |
| Map 타입 선언 | 사용 가능 |
| 구현체 변경 가정 | Map이 훨씬 유리 |
차이점 정리
| 구분 | HashMap | Map |
|---|
| 종류 | 구현 클래스 | 인터페이스 |
| 역할 | 실제 동작 구현 | 규격 정의 |
| 유연성 | 낮음 | 높음 |
| 실무 권장 | △ | ◎ |
이를 통해 배운 점
객체지향 프로그래밍에서는 구현체(HashMap, ArrayList)가 아니라 인터페이스(Map, List)에 의존하도록 설계하는 것이 유지보수와 확장성 측면에서 유리하다.
Map<String, Integer> itemMap = new HashMap<>();
List<Integer> scoreList = new ArrayList<>();
앞으로 컬렉션을 선언할 때는 특별한 이유가 없다면 인터페이스 타입(List, Map, Set)을 우선 사용하는 습관을 가져야겠다고 느꼈다.