03-8 맵
- 키와 값을 한 쌍으로 갖는 자료형
1.맵 자료형 중 하나인 HashMap의 메서드, 예제코드 살펴보기
import java.util.HashMap; //HashMap클래스가 있는 자바 패키지 불러오기
메서드 | 설명 | 예제 코드 |
put | key와 value 추가 | HashMap<String, String> map = new HashMap<>(); map.put("people", "사람"); map.put("baseball", "야구"); |
get | key에 해당하는 value 추출 (key에 해당하는 value가 없다면 null 리턴) |
HashMap<String, String> map = new HashMap<>(); map.put("people", "사람"); map.put("baseball", "야구"); System.out.println(map.get("people")); // "사람" 출력 |
getOrDefault | key에 해당하는 value가 있을때는 value 추출, 있다면 기본값 추출 | System.out.println(map.getOrDefault("java", "자바")); // java에 대한 value가 없을때 자바 출력 |
containsKey | 맵에 해당 key가 있는지를 참, 거짓으로 리턴 | HashMap<String, String> map = new HashMap<>(); map.put("people", "사람"); map.put("baseball", "야구"); System.out.println(map.containsKey("people")); // true 출력 |
remove | 해당 key의 항목을 삭제한 후 value 값 리턴 | HashMap<String, String> map = new HashMap<>(); map.put("people", "사람"); map.put("baseball", "야구"); System.out.println(map.remove("people")); // "사람" 출력 |
size | 맵 요소의 개수 리턴 | HashMap<String, String> map = new HashMap<>(); map.put("people", "사람"); map.put("baseball", "야구"); System.out.println(map.size()); // 2출력 |
keySet | 맵의 모든 key를 모아서 리턴 | HashMap<String, String> map = new HashMap<>(); map.put("people", "사람"); map.put("baseball", "야구"); System.out.println(map.keySet()); // [baseball, people] 출력 |
03-9 집합
- 집합과 관련된 것을 쉽게 처리하기 위해 만듦
1. 집합 자료형 중 가장 많이 사용하는 HashSet (기본 예제 코드)
import java.util.Arrays; // 배열을 만들기 위해 Arrays 클래스 불러오기
import java.util HashSet; // HashSet 클래스 불러오기
HashSet<String> set = new HashSet<>(Arrays.asList("H", "e", "l", "l", "o"));
System.out.println(set); // [e, H, l, o] 출력
2. 집합 자료형의 특징
- 중복을 허용하지 않음
- 순서가 없음 --> 인덱싱 지원 X
3. 교집합, 합집합, 차집합 구하기 + 이 외의 메서드
메서드 (집합 종류) | 설명 | 예제 코드 |
intersection (교집합) |
|
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6)); HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9)); HashSet<Integer> intersection = new HashSet<>(s1); // s1으로 intersection 생성 union.retainAll(s2); // 교집합 수행 System.out.println(intersection); // [4, 5, 6] 출력 |
addAll (합집합) | HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6)); HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9)); HashSet<Integer> union = new HashSet<>(s1); // s1으로 union 생성 union.addAll(s2); // 합집합 수행 System.out.println(union); // [1, 2, 3, 4, 5, 6, 7, 8, 9] 출력 |
|
removeAll (차집합) | HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6)); HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9)); HashSet<Integer> substract = new HashSet<>(s1);// s1으로 substract 생성 substract.removeAll(s2); // 차집합 수행 System.out.println(substract); // [1, 2, 3] 출력 |
|
add | 집합에 값을 추가할 때 사용 | HashSet<String> set = new HashSet<>(); set.add("Jump"); set.add("To"); set.add("Java"); System.out.println(set); // [Java, To, Jump] 출력 |
remove | 특정 값을 제거할 때 사용 | HashSet<String> set = new HashSet<>(Arrays.asList("Jump", "To", "Java")); set.remove("To"); System.out.println(set); // [Java, Jump] 출력 |
03-10 상수 집합
- enum 자료형 : 서로 연관 있는 여러 개의 상수 집합을 정의할 때 사용
1. 예제코드
enum CoffeeType {
AMERICANO,
ICE_AMERICANO,
CAFE_LATTE
};
public static void main(String[] args) {
System.out.println(CoffeeType.AMERICANO); // AMERICANO 출력
System.out.println(CoffeeType.ICE_AMERICANO); // ICE_AMERICANO 출력
System.out.println(CoffeeType.CAFE_LATTE); // CAFE_LATTE 출력
for(CoffeeType type: CoffeeType.values()) {
System.out.println(type); //순서대로 AMERICANO, ICE_AMERICANO, CAFE_LATTE 출력
2. enum이 필요한 이유
- 매직 넘버를 사용할 때보다 코드가 명확하다 (의미없는 숫자 대신 명확한 이름을 인수로 사용할 수 있다)
- 잘못된 값을 사용해 생길 수 있는 오류를 막을 수 있다
03-11 형 변환과 final
1. 형 변환
- 자료형을 다른 자료형으로 바꾸는 것
형 변환 방식 | 변형 코드 | 예제 코드 |
문자열 --> 정수 | Integer.parseInt | String num = "123"; int n = Integer.parseInt(num); //integer클래스를 사용 System.out.println(n); // 123 출력 |
정수 --> 문자열 | 빈문자열("") 더해주기 | int n = 123; String num = "" + n; //문자열로 변환 System.out.println(n); // 123 출력 |
String.valueOf(정수) | String num1 = String.valueOf(n); | |
Integer.toString(정수) | String num2 = Integer.toString(n); | |
문자열 --> 실수 | Double.parseDouble | double d = Double.parseDouble(num); |
Float.parseFloat | double d = Float.parseFloat(num); | |
실수 --> 정수 | (int) 변수; | double d2 = 123.456; int n2 = (int) d2; // 123 출력 |
정수 --> 실수 | 캐스팅 필요 X | int n1 = 123; double d1 = n1; |
※ 실수 형태 문자열을 정수로 바꿀 때 NumberFormatException이 발생하므로 주의
2. final
- 자료형에 값을 단 한 번만 설정할 수 있게 강제하는 키워드
final int n = 123; // final로 설정하면 값을 바꿀 수 없다.
n = 456; // 컴파일 오류 발생
04. 제어문 이해하기
04-1 if문
1. 기본 구조
if (조건문) {
<수행할 문장1>;
<수행할 문장2>;
...
} else {
<수행할 문장A>;
<수행할 문장B>;
...
}
2. 예제 코드
boolean money = true;
if (money) {
System.out.println("택시를 타고 가라");
}else {
System.out.println("걸어가라");
}
3. 비교연산자
x < y | x가 y보다 작다 |
x > y | x가 y보다 크다 |
x == y | x와 y가 같다 |
x != y | x와 y가 같지 않다 |
x >= y | x가 y보다 크거나 같다 |
x <= y | x가 y보다 작거나 같다 |
4. and, or, not 연산자
x && y | x와 y 모두 참이어야 참이다 |
x || y | x와 y 둘 중 적어도 하나가 참이면 참이다 |
!x | x가 거짓이면 참이다 |
▼ 3,4의 비교연산자와 and, or, not 연산자의 자세한 설명은 아래 자바연산자 티스토리를 통해 확인
04-5. else if
- 판단을 해야할 조건문이 여러개 있을 때 사용
- 개수의 제한 없이 사용 가능
1. 기본 구조
if (조건문) {
<수행할 문장1>
<수행할 문장2>
...
}else if (조건문) {
<수행할 문장1>
<수행할 문장2>
...
}else if (조건문) {
<수행할 문장1>
<수행할 문장2>
...
...
} else {
<수행할 문장1>
<수행할 문장2>
...
}
04-2 switch / case 문
- 일정한 형식이 있는 조건, 판단문
1. 기본 구조
switch(입력변수) {
case 입력값1: ...
break;
case 입력값2: ...
break;
...
default: ...
break;
}
※ 입력값이 정형화되어 있는 경우 if 문보다는 switch / case 문을 쓰는 것이 가독성이 좋다
2. 예제 코드
public class Sample {
public static void main(String[] args) {
int month = 8;
String monthString = "";
switch (month) { // 입력 변수의 자료형은 byte, short, char, int, enum, String만 가능하다.
case 1: monthString = "January";
break;
case 2: monthString = "February";
break;
case 3: monthString = "March";
break;
case 4: monthString = "April";
break;
case 5: monthString = "May";
break;
case 6: monthString = "June";
break;
case 7: monthString = "July";
break;
case 8: monthString = "August";
break;
case 9: monthString = "September";
break;
case 10: monthString = "October";
break;
case 11: monthString = "November";
break;
case 12: monthString = "December";
break;
default: monthString = "Invalid month";
break;
}
System.out.println(monthString); // case8인 August 출력
}
}
04-3 while문
1. 기본 구조
while (조건문) {
<수행할 문장1>;
<수행할 문장2>;
<수행할 문장3>;
...
}
2. 무한 루프란?
- 조건문을 항상 참으로 만들어 while문 안의 내용이 무한히 반복되는것
while (true) {
<수행할 문장1>;
<수행할 문장2>;
...
}
3. while문 빠져나가기 - break
- break : while문을 강제로 멈춰야 할 때 사용
▼아래 코드와 같이 조건문을 통해 조건문이 참이 되면 break를 호출하는 식으로 사용 가능
int coffee = 10;
int money = 300;
while (money > 0) {
System.out.println("돈을 받았으니 커피를 줍니다.");
coffee--;
System.out.println("남은 커피의 양은 " + coffee + "입니다.");
if (coffee == 0) {
System.out.println("커피가 다 떨어졌습니다. 판매를 중지합니다.");
break;
}
}
4. while문으로 돌아가기 - continue
- continue : 조건이 참인 경우 while문으로 돌아가게 함
int a = 0;
while (a < 10) {
a++; // a가 10보다 작은 동안 a는 1씩 증가
if (a % 2 == 0) {
continue; // 짝수인 경우 조건문으로 돌아간다.
}
System.out.println(a); // 홀수만 출력된다.
}
04-4 for문
1. 기본 구조
for (초기치; 조건문; 증가치) {
...
}
2. for문으로 돌아가기 - continue
- continue : 조건문으로 돌아감 (while문에서의 continue와 동일)
int[] marks = {90, 25, 67, 45, 80};
for(int i=0; i<marks.length; i++) {
if (marks[i] < 60) {
continue; // 조건문으로 돌아간다.
}
System.out.println((i+1)+"번 학생 축하합니다. 합격입니다.");
}
3. 이중 for문
- for문 안에 for문 넣기
for(int i=2; i<10; i++) {
for(int j=1; j<10; j++) {
System.out.print(i*j+" ");
}
System.out.println(""); // 줄을 바꾸어 출력하는 역할을 한다.
}
04-5 for each 문
- 객체를 루프에 돌려 순차적으로 대입
for (type 변수명: iterate) { // iterate: 루프를 돌릴 객체
body-of-loop
}
※ for each 문은 따로 반복 횟수를 명시적으로 주는 것이 불가능, 한 단계씩 순차적으로 반복할 때만 사용이 가능
3장 Quiz
1.다음 중 HashMap의 특징은?
답 : d) 동기화되어 있다?
2. Map에서 키-값 쌍을 추가할 때 사용하는 메서드는?
답 : a) put()
3. 다음 코드의 출력 결과는 무엇인가?
Map<String, Integer> map = new HashMap<>();
map.put("Java", 8);
map.put("Python", 3);
System.out.println(map.get("Java"));
답 : b) 8
4. Map에 키가 존재하는지 여부를 알 수 있는 메서드는?
답 : d) containsKey
5. Set의 주요 특징 중 하나는 무엇인가?
답 : c) 중복된 요소를 허용하지 않는다.
6. 다음 코드의 출력 결과는 무엇인가?
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Java");
System.out.println(set.size());
답 : b) 1
7. Set에 요소를 추가할 때 사용하는 메서드는?
답 : a) add()
8. Java에서 자동 형 변환(implicit casting)이 이루어지는 경우는?
답 : b) float에서 int로 변환할 때
9. 다음 코드의 출력 결과는 무엇인가?
답 : a) 9
10. 다음 중 final 키워드의 올바른 사용법이 아닌 것은?
답 : a) final 변수를 재할당할 수 있다.
11. Java에서 기본형 타입을 참조형 타입으로 변환할 때 사용하는 클래스는?
답 : d) Object ?
12. 다음 코드의 출력 결과는 무엇인가?
final int x = 10;
x = 15; // 이 줄에서 에러 발생
System.out.println(x);
답 : c) Error
서술형 문제
1. Java의 Set 인터페이스를 사용하는 목적에 대해 서술하시오.
답 : 중복을 허용하지 않으므로 자료형의 중복을 제거하기 위한 필터 역할로 사용한다. 또한, 교집합, 합집합, 차집합을 구할 때 유용하다.
2. 형 변환(타입 캐스팅)의 개념을 설명하고, 자바에서의 자동 형 변환과 수동 형 변환의 차이점을 서술하시오.
답 : 형 변환이란 데이터 타입을 바꿔주는 것이다. 자동 형 변환은 int에서 float으로 변환될때와 같이 자동으로 변환되는 것이고, 수동 형 변환은 변환을 직접 지정해주어야 된다는 차이점이 있다.
3. Java의 final 키워드에 대해 설명하고, final 변수를 사용할 때의 장점을 서술하시오.
답 : final키워드는 변수를 지정할 때 값을 고정시켜주는 키워드이다. final 변수를 사용한다면 값을 고정시켜줄 수 있어 값이 바뀌면 안 될때 사용할 수 있다.
4. 형 변환 시 발생할 수 있는 예외 상황에 대해 설명하고, ClassCastException이 발생하는 경우를 예로 들어 설명하시오.
답 : 형 변환을 할 때 변환하려는 객체가 해당 타입이 아닐 때 ClassCastException이 발생한다. 문자열을 숫자 타입으로 변환할 때 오류가 발생하는 것을 예로 들 수 있다.
코딩테스트 문제
완주하지 못한 선수
https://school.programmers.co.kr/learn/courses/30/lessons/42576
숫자 문자열과 영단어
https://school.programmers.co.kr/learn/courses/30/lessons/81301
4장 Quiz
1. 다음 코드의 출력 결과는 무엇인가?
int num = 10;
if (num > 5) {
System.out.println("A");
} else {
System.out.println("B");
}
답 : a) A
2. 다음 중 if 문의 올바른 사용법은?
답 : b)
if (x > 10) {
System.out.println("x는 10보다 큽니다.");
}
3. 다음 중 중첩 if 문의 예는?
답 : a)
if (a > b)
if (b > c)
System.out.println("a > b > c");
4. 다음 if-else if-else 구조에서 result의 값은 무엇인가?
int score = 85;
String result;
if (score >= 90) {
result = "A";
} else if (score >= 80) {
result = "B";
} else {
result = "C";
답 : b) B
5. 다음 if 문에서 논리 오류가 있는 것은?
답: a)
if (x = 10) {
System.out.println("x는 10입니다.");
}
6. 다음 코드의 출력 결과는 무엇인가?
답 : c) Wednesday
7. switch 문에서 break 문을 생략하면 어떤 결과가 발생하는가?
답 : c) 다음 case의 코드도 연속적으로 실행된다.
8. 다음 중 switch 문의 올바른 사용 예는?
답 : c)
switch (x) {
case 1:
System.out.println("One");
break;
case 2:
System.out.println("Two");
break;
default:
System.out.println("Other");
}
9. 다음 코드의 출력 결과는 무엇인가?
char grade = 'B';
switch (grade) {
case 'A':
System.out.println("Excellent");
break;
case 'B':
System.out.println("Good");
case 'C':
System.out.println("Fair");
break;
default:
System.out.println("Poor");
}
답 : a) Good Fair
10. 다음 중 switch 문에서 사용할 수 없는 자료형은?
답 : c) double
11. 다음 코드의 출력 결과는 무엇인가?
답 : a) 0 1 2
12. 다음 중 무한 루프를 생성하는 for 문의 예는?
답 : d)
for (int i = 0; i <= 10; i--) {}
13. 다음 코드의 출력 결과는 무엇인가?
for (int i = 5; i > 0; i--) {
if (i == 3) {
break;
}
System.out.print(i + " ");
}
답 : a) 5 4
14. 다음 중 for 문을 사용하여 1부터 10까지의 합을 구하는 올바른 코드는?
답 : a와 c 모두 올바르다
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
System.out.println(sum);
int sum = 0;
for (int i = 0; i <= 10; i++) {
sum += i;
}
System.out.println(sum);
15. 다음 코드의 출력 결과는 무엇인가?
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue;
}
System.out.print(i + " ");
}
답 : b) 0 1 3 4
16. 다음 코드의 출력 결과는 무엇인가?
답 : a) 1 2 3
17. 다음 중 무한 루프를 생성하는 while 문의 예는?
답 : a)
while (true) {}
18. 다음 코드의 출력 결과는 무엇인가?
int count = 0;
while (count < 5) {
if (count == 3) {
count++;
continue;
}
System.out.print(count + " ");
count++;
}
답 : b) 0 1 2 4
19. 다음 중 while 문을 사용하여 1부터 10까지의 홀수를 출력하는 올바른 코드는?
답 : d) a와 c 모두 올바르다
int i = 1;
while (i <= 10) {
if (i % 2 != 0) {
System.out.print(i + " ");
}
i++;
}
int i = 1;
while (i < 10) {
System.out.print(i + " ");
i += 2;
}
20. 다음 코드의 출력 결과는 무엇인가?
int i = 0;
while (i < 3) {
System.out.print(i + " ");
i += 2;
}
답 : b) 0 2
21. 다음 코드의 출력 결과는 무엇인가?
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.print(num + " ");
}
답 : a) 1 2 3 4 5
22. 다음 중 for-each 문을 사용하는 이유로 옳지 않은 것은?
답 : c) 요소를 수정할 수 있기 위해
23. 다음 코드의 출력 결과는 무엇인가?
답 : a) A B C
24. 다음 중 for-each 문을 사용하여 리스트의 모든 요소를 출력하는 올바른 코드는?
List<String> list = Arrays.asList("Java", "Python", "C++");
for (String lang : list) {
System.out.println(i);
}
List<String> list = Arrays.asList("Java", "Python", "C++");
for (Object obj : list) {
System.out.println(i);
}
답 : d) b와 c 모두 올바르다
25. 다음 코드의 출력 결과는 무엇인가?
int[] numbers = {2, 4, 6, 8};
int sum = 0;
for (int num : numbers) {
sum += num;
}
System.out.println(sum);
답 : b) 20
코딩테스트 문제
배열 회전시키기 : https://school.programmers.co.kr/learn/courses/30/lessons/120844
콜라츠 추측 : https://school.programmers.co.kr/learn/courses/30/lessons/12943
※ 500번 반복할 때까지 1이 되지 않으면 --> 400번으로 바꾸면 풀림..
참고문헌 : https://wikidocs.net/book/31
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 이가인 #2주차 (2) | 2024.10.16 |
---|---|
[2024-2 Java 스터디] 김지나 #2주차 "~제어문" (0) | 2024.10.16 |
[2024-2 Java 스터디] 정채은 #1주차 (0) | 2024.10.10 |
[2024-2 Java 스터디] 강보경 #1주차 (0) | 2024.10.10 |
[2024-2 Java 스터디] 이민형 #1주차 (1~3장) (6) | 2024.10.10 |