✅ 맵
- 대응 관계를 쉽게 표현할 수 있게 해주는 자료형
- 키, 값을 한 쌍으로 갖는 자료형 (키를 이용해서 값을 얻는 형식으로 사용됨)
맵 자료형 중에서 제일 기본인 HashMap에 대해서 알아보도록 하겠씁니당.
1) HashMap
- 키, 값에 String 이외의 자료형은 사용할 수 없음
메서드 | 사용 방법 | 의미 |
put | HaseMap<String, String> map = new HashMap<>(); // 제네릭스 이용 map.put("coffee", "아바라"); map.put("beverage", "딸기주스"); |
key, value 추가 |
get | map.get("coffee"); 아바라 // key에 해당하는 value가 없을 때는 null 리턴 디폴트 값을 얻고 싶다면 getOrDefault 메서드 사용 |
key에 해당하는 value 얻기 |
containsKey | map.containsKey("beverage"); true |
맵에 해당 key가 있는지 판단 후 리턴 |
remove | map.remove("coffee"); 아바라 |
맵에서 해당 key, value 삭제 후 value 값 리턴 |
size | map.size(); 2 |
맵 요소의 개수 리턴 |
keySet | map.keySet(); [아바라, 딸기주스] |
맵의 모든 key를 모아 집합 자료형으로 리턴 |
- 맵에 입력된 순서대로 데이터를 가져오고 싶다면 LinkedHashMap(입력 순서대로 데이터 저장), TreeMap(key 오름차순 저장) 사용
✅ 집합
- 집합과 관련된 것을 쉽게 처리하기 위해 만든 것
집합 자료형 중에서 제일 많이 사용되는 HashSet에 대해서 알아보도록 하겠씁니당.
1) 집합 자료형의 특징
- 중복 허용 x
- 순서 x -> 인덱싱으로 값 얻을 수 없음 (하지만 LinkedHashSet, TreeSet을 사용한다면 맵에서와 같은 방식으로 작용함!!)
2) 교집합, 합집합, 차집합 구하기
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] arge) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(5, 6, 7, 8, 9, 10));
}
}
- 교집합 구하기: retainAll 메서드 이용
HashSet<Integer> intersection = new HashSet<>(s1); // s1을 intersection으로 복사
intersection.retainAll(s2); // 교집합합시다
System.out.println(intersection); // [5, 6] 출력
- 합집합 구하기: addAll 메서드 이용
HashSet<Integer> union = new HashSet<>(s1); // s1을 union으로 복사
union.addAll(s2); // 합집합합시다
System.out.println(union); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 출력
- 차집합 구하기: removeAll 메서드 이용
HashSet<Integer> substract = new HashSet<>(s1); // s1을 substract로 복사
substract.removeAll(s2); // 차집합합시다
System.out.println(substract); // [1, 2, 3, 4] 출력
3) 집합 자료형과 관련된 메서드
- add: 집합 자료형에 값을 추가
- addAll: 값을 한꺼번에 여러 개 추가
- remove: 특정 값 제거
✅ 상수 집합
- enum 자료형: 미리 정의된 상수들의 특별한 집합
- enum 자료형을 사용한다면 코드가 명확해지고, 다양한 오류를 막을 수 있음
enum CoffeeType {
HAZEL_AMERICANO,
VANILLA_LATTE,
ICED_AMERICANO
}; // 상수 집합 생성
System.out.println(CoffeeType.VANILLA_LATTE); // VANILLA_LATTE 출력
for(CoffeeType type: CoffeeType.values()) {
System.out.println(type); // HAZEL_AMERICANO, VANILLA_LATTE, ICED_AMERICANO 출력
} // 반복문에서 사용 가능
✅ 형 변환
- 형 변환: 어떤 자료형을 다른 자료형으로 바꾸는 것
① 문자열 -> 정수
- Integer 클래스 사용
String num = "1234";
int n = Integer.parseInt(num); //parseInt() 함수는 문자열을 정수로 변환한 값 리턴
// 1234
② 정수 -> 문자열
- 정수 앞에 빈 문자열("")을 더해주기
- String.valueOf(정수), Integer.toString(정수) 사용하기
int n = 1234;
String num = "" + n; // 1234
String num1 = String.valueOf(n); // 1234
String num2 = Integer.toString(n); // 1234
③ 문자열 -> 실수
- Double.parseDouble, Float.parseFloat 사용하기
String num = "12.3456"
double d = Double.parseDouble(num); // 12.3456
④ 정수 <-> 실수
- 정수 -> 실수에서는 캐스팅 x
- 실수 -> 정수는 반드시 캐스팅 o
int n1 = 123;
double d1 = n1; //123.0
double d2 = 123.456;
int n2 = (int) d2; // 앞에 (int) 붙이는게 캐스팅!! 강제로 int형으로 바꾼다는 의미
// 소수점이 제거된 123 출력
⑤ 실수 문자열 -> 정수
- 실수 형태의 문자열을 정수로 바꿀 때는 오류가 발생
- 따라서 ③을 따라 실수 문자열을 실수 숫자 자료형으로 바꾼 후 ④를 이용해 실수를 정수로 변환해야 함
✅ final
- 자료형에 값을 딱 한 번만 설정할 수 있게 강제하는 키워드
- 값 변경 불가
final int n = 123;
n = 456; // 오류 발생
final ArrayList<String> a = new ArrayList<>(Arrays.asList("a", "b"));
a = new ArrayList<>(Arrays.asList("c", "d")); // 에러 발생
// 리스트 재할당 불가, 값 더하거나 빼는 건 가능
04장. 제어문 이해하기
✅ if 문
1) if 문과 else 문의 기본 구조
2) 비교 연산자
비교 연산자 | 설명 |
x < y | x가 y보다 작다 |
x > y | x가 y보다 크다 |
x == y | x와 y가 같다 |
x != y | x와 y가 같지 않다 |
x >= y | x가 y보다 크거나 같다 |
x <= y | x가 y보다 작거나 같다 |
3) and, or, not 연산자
연산자 | 설명 |
x && y | x, y 모두 참이어야 참 |
x || y | x, y 둘 중 적어도 하나가 참이면 참 |
!x | x가 거짓이면 참 |
4) contains
- List 자료형에 해당 요소가 있는지 조사하는 메서드
ArrayList<String> = new ArrayList<String>();
pocket.add("money");
pocket.add("phone");
pocket.add("wallet");
if (pocket.contains("wallet")) {
System.out.println("집에 가라");
} else {
System.out.println("갔던 곳을 다시 가봐");
}
5) else if
- 판단해야 하는 조건이 두 개 이상일 때
if (조건문1) {
실행문1
} else if (조건문2) {
실행문2
}
- else if는 이전 조건문이 거짓일 때 수행됨
✅ switch/case 문
switch(입력변수) {
case 입력값1: ...
break;
case 입력값2: ...
break;
...
default: ...
break;
}
- 입력변수 값과 동일한 case 입력값이 있다면 -> 해당 case 문에 속한 문장이 실행됨
- break문이 없으면 다음 case 문에 속한 문장이 실행됨
✅ while문
1) while문의 기본 구조
while (조건문) {
<수행할 문장1>;
<수행할 문장2>;
<수행할 문장3>;
...
}
2) 무한 루프
- 무한히 반복한다는 의미
while (true) {
<수행할 문장1>;
<수행할 문장2>;
...
}
- 무한 루프의 기본 형태. 조건 자체가 true이므로 무한히 반복함
3) while 문 빠져나가기 - break
- while 문을 강제로 멈춰야 할 때 사용
int sandwich = 5;
int money = 300;
while (money > 0) {
System.out.println("샌드위치 줍니다");
sandwich--;
System.out.println("남은 샌드위치의 양은 " + sandwich + "입니다");
if (sandwich == 0) {
System.out.println("샌드위치가 다 떨어져서 판매중지요");
break;
}
}
- while의 조건이 항상 참이기 때문에 무한 루프가 됨 -> sandwich가 0이 되면 break로 while문을 빠져나감
4) while 문으로 돌아가기 - continue
- while 문의 맨 처음으로 돌아감
int a = 0;
while (a < 10) {
a++;
if (a % 2 == 1) {
continue; // 홀수인 경우 조건문으로 돌아간다.
}
System.out.println(a); // 짝수만 출력된다.
}
- a가 홀수일 때는 System.out.println(a) 실행되지 않고 continue를 받아서 다시 while문의 처음인 a < 10으로 돌아감
✅ for 문
1) for 문의 기본 구조
for (초기치; 조건문; 증가치) {
...
}
String[] numbers = {"one", "two", "three"};
for(int i=0; i<numbers.length; i++) {
System.out.println(numbers[i]);
}
// numbers 배열의 첫 번째 요소부터 마지막 요소까지 출력하는 예제
// i = 0부터 시작. i가 numbers의 길이보다 작을 때 실행. 명령문 실행 후 i++
2) for 문으로 돌아가기 - continue
- for 문의 처음으로 돌아감
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)+"번 학생 축하합니다. 합격입니다.");
}
- marks의 i 번째 인덱스가 60 미만이라면 조건문의 처음으로 돌아감 (60 이상이면 System.our.println() 실행)
3) 이중 for 문
for(int i=2; i<10; i++) {
for(int j=1; j<10; j++) {
System.out.print(i*j+" ");
}
System.out.println(""); // 출력 후 줄바꿈
} // 구구단 출력 예제
- 첫 번째 for문에서 i에 2~9 까지의 숫자를 정함. 두 번째 for문에서 i에 j를 곱함 -> 구구단 출력
✅ for each 문
1) for each 문의 기본 구조
for (type 변수명: iterate) {
body-of-loop
}
- iterate: 루프를 돌릴 객체. iterate 객체에서 하나씩 순차적으로 변수명에 대입 -> for 문 수행. 루프를 돌릴 수 있는 자료형(배열, ArrayList)만 가능
- 변수명의 타입은 iterate 객체의 자료형과 일치해야 함
- 반복 횟수 명시적으로 줄 수 없음
- 순차적 반복에서만 사용 가능
String[] numbers = {"one", "two", "three"};
for(String number: numbers) {
System.out.println(number);
}
// one two three 출력
2주차 퀴즈
객관식
Q1. 다음 중 HashMap의 특징은?
A1. c) null 키를 허용한다.
Q2. Map에서 키-값 쌍을 추가할 때 사용하는 메서드는?
A2. a) put()
Q3. 다음 코드의 출력 결과는 무엇인가?
Map<String, Integer> map = new HashMap<>();
map.put("Java", 8);
map.put("Python", 3);
System.out.println(map.get("Java"));
A3. b) 8
Q4. Map에 키가 존재하는지 여부를 알 수 있는 메서드는?
A4. d) containsKey()
Q5. Set의 주요 특징 중 하나는 무엇인가?
A5. c) 중복된 요소를 허용하지 않는다.
Q6. 다음 코드의 출력 결과는 무엇인가?
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Java");
System.out.println(set.size());
A6. a) 1
Q7. Set에 요소를 추가할 때 사용하는 메서드는?
A7. a) add()
Q8. Java에서 자동 형 변환(implicit casting)이 이루어지는 경우는?
A8. c) int 에서 double 로 변환할 때
Q9. 다음 코드의 출력 결과는 무엇인가?
double d = 9.78;
int i = (int) d;
System.out.println(i);
A9. a) 9
Q10. 다음 중 final 키워드의 올바른 사용법이 아닌 것은?
A10. a) final 변수를 재할당할 수 있다.
Q11. Java에서 기본형 타입을 참조형 타입으로 변환할 때 사용하는 클래스는?
A11. a) Wrapper
Q12. 다음 코드의 출력 결과는 무엇인가?
final int x = 10;
x = 15; // 이 줄에서 에러 발생
System.out.println(x);
A12. c) Error
서술형 문제
Q1. Java의 Set 인터페이스를 사용하는 목적에 대해 서술하시오.
A1. Set 인터페이스는 중복을 허용하지 않기 때문에 동일한 값을 가진 데이터가 저장되는 것을 방지할 수 있으며 집합 연산이 가능하기 때문에 집합 연산이 필요할 때 사용 가능하다.
Q2. 형 변환(타입 캐스팅)의 개념을 설명하고, 자바에서의 자동 형 변환과 수동 형 변환의 차이점을 서술하시오.
A2. 형 변환은 어떤 자료형을 다른 자료형으로 바꾸는 것이다. 자동 형 변환은 컴파일러가 자동으로 바꿔주는 것인데, 일반적으로 작은 타입에서 큰 타입으로의 형 변환할 때 일어난다(데이터 손실이 없기 때문에). 수동 형 변환은 명시적으로 형 변환을 하는 것이다. 큰 타입에서 작은 타입으로 형 변환할 때는 데이터 손실이 일어날 수 있어서 형 변환 연산자를 사용해야 한다.
Q3. Java의 final 키워드에 대해 설명하고, final 변수를 사용할 때의 장점을 서술하시오.
A3. final은 자료형에 딱 한 번만 값을 설정할 수 있게 강제해주는 키워드이다. final 변수를 사용하면 선언된 값을 변경할 수 없으므로 의도하지 않은 변경을 방지할 수 있다.
Q4. 형 변환 시 발생할 수 있는 예외 상황에 대해 설명하고, ClassCastException이 발생하는 경우를 예로 들어 설명하시오.
A4. 형 변환 시 발생할 수 있는 예외 상황은 ClassCastException: 객체가 잘못된 타입으로 변환될 때, ArithmeticException: 값의 범위 초과할 때, NumberFormatException: 문자열 포맷이 올바르지 않을 때가 있다. ClassCastException은 주로 부모 클래스로 객체를 생성했는데 그 객체를 자식 클래스로 캐스팅을 시도했을 때 발생한다.
코딩 테스트
Q1. https://school.programmers.co.kr/learn/courses/30/lessons/42576
Q2. https://school.programmers.co.kr/learn/courses/30/lessons/81301
- 4장 퀴즈 -
객관식
Q1. 다음 코드의 출력 결과는 무엇인가?
int num = 10;
if (num > 5) {
System.out.println("A");
} else {
System.out.println("B");
}
A1. a) A
Q2. 다음 중 if문의 올바른 사용법은?
A2. b)
if (x > 10)
System.out.println("x는 10보다 큽니다.");
Q3. 다음 중 중첩 if문의 예는?
A3. a)
if (a > b)
if (b > c)
System.out.println("a > b > c");
Q4. 다음 if-else if-else 구조에서 result의 값은 무엇인가?
Q4. b) B
Q5. 다음 if문에서 논리 오류가 있는 것은?
A5. a)
if (x = 10) {
System.out.println("x는 10입니다.");
}
Q6. 다음 코드의 출력 결과는 무엇인가?
int day = 3;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
default:
System.out.println("Invalid day");
}
A6. c) Wednesday
Q7. switch 문에서 break 문을 생략하면 어떤 결과가 발생하는가?
A7. c) 다음 case의 코드도 연속적으로 실행된다.
Q8. 다음 중 switch 문의 올바른 사용 예는?
A8. c)
switch (x) {
case 1:
System.out.println("One");
break;
case 2:
System.out.println("Two");
break;
default:
System.out.println("Other");
}
Q9. 다음 코드의 출력 결과는 무엇인가?
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");
}
A9. a) Good Fair
Q10. 다음 중 switch 문에서 사용할 수 없는 자료형은?
A10. c) double
Q11. 다음 코드의 출력 결과는 무엇인가?
for (int i = 0; i < 3; i++) {
System.out.print(i + " ");
}
A11. a) 0 1 2
Q12. 다음 중 무한 루프를 생성하는 for 문의 예는?
A12. d)
for (int i = 0; i <= 10; i--) {}
Q13. 다음 코드의 출력 결과는 무엇인가?
for (int i = 5; i > 0; i--) {
if (i == 3) {
break;
}
System.out.print(i + " ");
}
A13. a) 5 4
Q14. 다음 중 for 문을 사용하여 1부터 10까지의 합을 구하는 올바른 코드는?
A14. a), c)
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
System.out.println(sum);
Q15. 다음 코드의 출력 결과는 무엇인가?
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue;
}
System.out.print(i + " ");
}
A15. b) 0 1 3 4
Q16. 다음 코드의 출력 결과는 무엇인가?
int i = 1;
while (i <= 3) {
System.out.print(i + " ");
i++;
}
A16. a) 1 2 3
Q17. 다음 중 무한 루프를 생성하는 while 문의 예는?
A17. a)
while (true) {}
Q18. 다음 코드의 출력 결과는 무엇인가?
int count = 0;
while (count < 5) {
if (count == 3) {
count++;
continue;
}
System.out.print(count + " ");
count++;
}
A18. b) 0 1 2 4
Q19. 다음 중 while 문을 사용하여 1부터 10까지의 홀수를 출력하는 올바른 코드는?
A19. d) a와 c 모두 올바르다.
Q20. 다음 코드의 출력 결과는 무엇인가?
int i = 0;
while (i < 3) {
System.out.print(i + " ");
i += 2;
}
A20. b) 0 2
Q21. 다음 코드의 출력 결과는 무엇인가?
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.print(num + " ");
}
A21. a) 1 2 3 4 5
Q22. 다음 중 for-each 문을 사용하는 이유로 옳지 않은 것은?
A22. c) 요소를 수정할 수 있기 위해
Q23. 다음 코드의 출력 결과는 무엇인가?
String[] fruits = {"Apple", "Banana", "Cherry"};
for (String fruit : fruits) {
System.out.print(fruit.charAt(0) + " ");
}
A23. a) A B C
Q24. 다음 중 for-each 문을 사용하여 리스트의 모든 요소를 출력하는 올바른 코드는?
A24. d) b와 c 모두 올바르다.
Q25. 다음 코드의 출력 결과는 무엇인가?
int[] numbers = {2, 4, 6, 8};
int sum = 0;
for (int num : numbers) {
sum += num;
}
System.out.println(sum);
A25. b) 20
Q1.https://school.programmers.co.kr/learn/courses/30/lessons/120844
Q2. https://school.programmers.co.kr/learn/courses/30/lessons/12943
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 김민서 #2주차 (0) | 2024.10.16 |
---|---|
[2024-2 Java 스터디] 이가인 #2주차 (2) | 2024.10.16 |
[2024-2 Java 스터디] 김태일 #2주차 (4) | 2024.10.15 |
[2024-2 Java 스터디] 정채은 #1주차 (0) | 2024.10.10 |
[2024-2 Java 스터디] 강보경 #1주차 (0) | 2024.10.10 |