맵
대응 관계를 쉽게 표현할 수 있게 해주는 자료형
키와 값을 한 쌍으로 가짐
HashMap
- put - key와 value를 추가할 수 있음, 제네릭스(key, value 모두 String) 사용 (ex. map.put("people", "사람); )
- get - key에 해당하는 value를 얻을 때 사용 (ex. map.get("people"); )
- getOrDefault - null 대신 기본값을 얻고 싶을 때 사용 (ex. map.getOrDefault("java", "자바"); )
- containsKey - 해당 key가 있는지 true 또는 false로 리턴 (ex. map.containskey("people"); )
- remove - 해당 key의 항목을 삭제한 후 value 값 리턴 (ex. map.remove("people"); )
- size - 맵 요소의 개수 리턴 (ex. map.size(); )
- keySet - 맵의 모든 key를 모아서 집합 자료형으로 리턴 (ex. map.keySet(); )
- LinkedHashMap - 입력된 순서대로 데이터 저장
- TreeMap - 입력된 key의 오름차순으로 데이터 저장
집합
집합과 관련된 것을 쉽게 처리하기 위해 만듦 (HashSet, TreeSet, LinkedHashSet 등이 있음)
1. 집합 자료형의 2가지 특징
- 중복을 허용하지 않음
- 순서가 없음
2. 교집합 구하기
- retainAll 메서드 이용
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
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 생성
intersection.retainAll(s2); // 교집합 수행
System.out.println(intersection); // [4, 5, 6] 출력
}
}
3. 합집합 구하기
- addAll 메서드 사용
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
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] 출력
}
}
4. 차집합 구하기
- removeAll 메서드 사용
import java.util.Arrays;
import java.util.HashSet;
public class Sample {
public static void main(String[] args) {
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] 출력
}
}
5. 집합 자료형과 관련된 메서드
- add - 집합 자료형에 값을 추가
- addAll - 값을 한꺼번에 여러 개 추가
- remove - 특정 값을 제거
상수 집합
enum - 서로 연관 있는 여러 개의 상수 집합을 정의할 때 사용
enum FruitJuice {
ORANGE,
GRAPE,
LEMON
};
상수 집합 정의 후 출력, 반복문에서 사용 가능
enum의 장점
- 매직 넘버보다 코드가 명확
- 잘못된 값으로 인한 오류를 막을 수 있음
형 변환과 final
1. 문자열 -> 정수
public class Sample {
public static void main(String[] args) {
String num = "123";
int n = Integer.parseInt(num);
System.out.println(n); // 123 출력
}
}
2. 정수 -> 문자열
정수 앞에 빈 문자열 ""을 더해주거나 String.value0f(정수), Integer.toString(정수)를 사용
public class Sample {
public static void main(String[] args) {
int n = 123;
String num = "" + n;
System.out.println(num); // 123 출력
}
}
public class Sample {
public static void main(String[] args) {
int n = 123;
String num1 = String.valueOf(n);
String num2 = Integer.toString(n);
System.out.println(num1); // 123 출력
System.out.println(num2); // 123 출력
}
}
3. 소수점이 포함되어 있는 숫자 형태의 문자열 -> 실수
Double.parseDouble 또는 Float.parseFloat 사용
public class Sample {
public static void main(String[] args) {
String num = "123.456";
double d = Double.parseDouble(num);
System.out.println(d);
}
}
4. 정수 -> 실수
캐스팅이 필요없음
public class Sample {
public static void main(String[] args) {
int n1 = 123;
double d1 = n1; // 정수를 실수로 바꿀때에는 캐스팅이 필요없다.
System.out.println(d1); // 123.0 출력
}
}
5. 실수 -> 정수
반드시 정수형으로 캐스팅
실수의 소수점은 제거 된다
public class Sample {
public static void main(String[] args) {
double d2 = 123.456;
int n2 = (int) d2; // 실수를 정수로 바꿀때에는 반드시 정수형으로 캐스팅해 주어야 한다.
System.out.println(n2); // 소숫점이 생략된 123 출력
}
}
6. 실수 형태의 문자열 -> 정수
NumberFormatException 발생 -> Double.parseDouble() 사용
public class Sample {
public static void main(String[] args) {
String num = "123.456";
int n = Integer.parseInt(num); // 실수 형태의 문자열을 정수로 변환할 경우 NumberFormatException이 발생한다.
}
}
7. final
자료형에 값을 단 한 번만 설정할 수 있게 강제하는 키워드, 리스트의 경우도 재할당 불가 (값을 더하거나 빼는 것도 할 수 없게 하고싶다면 List.of 작성 -> 수정할 수 없는 리스트로 만들기)
ed!public class Sample {
public static void main(String[] args) {
final int n = 123;
n = 456; // 컴파일 오류 발생
}
}
제어문
1. if 문
if (condition) {
//조건이 참일 때 실행
}
* 조건이 참일 때 실행할 문장이 1개일 시엔 중괄호 생략 가능
비교 연산자x < y | x가 y보다 작다 |
x > y | x가 y보다 크다 |
x == y | x와 y가 같다 |
x != y | x와 y가 같지 않다 |
x >= y | x가 y보다 크거나 같다 |
x <= y | x가 y보다 작거나 같다 |
and, or, not 연산자
x && y | x와 y 모두 참이어야 참이다 |
x || y | x와 y 둘 중 적어도 하나가 참이면 참이다 |
!x | x가 거짓이면 참이다 |
contains 메서드 - 리스트에 해당 아이템이 있는지 조사
2. else 문
if (condition) {
//조건이 참일 때 실행
} else {
//만족하는 조건이 없을 때 실행
}
3. else if 문 (연관된 조건일 때)
if (condition1) {
//조건1이 참일 때 실행
} else if (condition2) {
//조건1이 거짓이고, 조건2가 참일 때 실행
} else if (condition3) {
//조건2이 거짓이고, 조건3이 참일 때 실행
} else {
//모든 조건이 거짓일 때 실행
}
* else 생략 가능
* 독립 조건일 시엔 if문 따로 여러 개 사용
4. switch / case 문
switch (조건식) {
case value1:
// 조건식의 결과 값이 value1일 때 실행
break;
case value2:
// 조건식의 결과 값이 value2일 때 실행
break;
default:
// 조건식의 결과 값이 위의 어떤 값에도 해당하지 않을 때
}
* switch의 조건문은 참 거짓이 아닌 그냥 값
* break문이 없을 땐 다음 case 실행
* default 생략 가능
5. while 문
while (조건식) {
// 조건식이 참일 때 반복해서 실행
}
조건문 자체가 true일 때 - 무한루프
* break - 반복문을 즉시 종료하고 나감
while(조건식) {
코드1;
break; //즉시 while문 종료로 이동
코드2; //실행되지 않음
}
//while문 종료
* continue - 어떤 조건이 참이 아닐 때 while 문의 맨 처음으로 돌아가고 싶은 경우에 사용
while(조건식) {
코드1;
continue; //즉시 조건식으로 이동
코드2; //실행되지 않음
}
int a = 0;
while (a < 10) {
a++;
if (a % 2 == 0) {
continue; // 짝수인 경우 조건문으로 돌아간다.
}
System.out.println(a); // 홀수만 출력된다.
}
6. for 문
for (초기식; 조건식; 증감식) {
// 코드
}
초기식 실행 (딱 1번만) -> 조건식 검증 -> 참이면 코드 실행 -> 거짓이면 for문 빠져나가기 -> 증감식 실행 -> 조건식 실행
* 조건문 없을 시에 무한루프
while 문과 마찬가지로 break, continue 사용 가능
7. 이중 for 문
// 구구단 출력 코드
for(int i=2; i<10; i++) {
for(int j=1; j<10; j++) {
System.out.print(i*j+" ");
}
System.out.println(""); // 줄을 바꾸어 출력하는 역할을 한다.
}
8. for each 문
for 문을 이용하는데 조건문의 문법이 조금 다름, 반복 횟수를 명시적으로 주는 것이 불가, 한 단계씩 순차적으로 반복할 때만 사용
for (type 변수명: iterate) {
body-of-loop
}
iterate는 자료형(배열 or ArrayList 등)만 가능, 변수명의 타입은 iterate 객체에 포함된 자료형과 일치해야 함
Quiz 3.5
1. 다음 중 HashMap의 특징은?
답 : c) null 키를 허용한다.
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)이 이루어지는 경우는?
답 : c) int에서 double로 변환할 때
9. 다음 코드의 출력 결과는 무엇인가?
double d = 9.78;
int i = (int) d;
System.out.println(i);
답 : a) 9
10. 다음 중 final 키워드의 올바른 사용법이 아닌 것은?
답 : a) final 변수를 재할당할 수 있다.
11. Java에서 기본형 타입을 참조형 타입으로 변환할 때 사용하는 클래스는?
답 : a) Wrapper
12. 다음 코드의 출력 결과는 무엇인가?
final int x = 10;
x = 15; // 이 줄에서 에러 발생
System.out.println(x);
답 : c) Error
서술형 문제
1. Java의 Set 인터페이스를 사용하는 목적에 대해 서술하시오.
답 : Set은 중복을 허용하지 않기 때문에 하나의 Set에 같은 객체가 여러 번 추가되지 않도록 할 때 사용한다.
2. 형 변환(타입 캐스팅)의 개념을 설명하고, 자바에서의 자동 형 변환과 수동 형 변환의 차이점을 서술하시오.
답 : 형 변환은 한 자료형을 다른 자료형으로 변환하는 것이다. 자동 형 변환은 작은 타입에서 큰 타입으로, 수동 형 변환은 큰 타입에서 작은 타입으로 명시적으로 변환한다.
3. Java의 final 키워드에 대해 설명하고, final 변수를 사용할 때의 장점을 서술하시오.
답 : final 키워드는 값을 변경할 수 없는 상수, 오버라이딩이 불가능한 메서드, 상속이 불가능한 클래스를 지정하는 데 사용된다. final 변수를 사용하면 코드의 안정성이 높아진다.
4. 형 변환 시 발생할 수 있는 예외 상황에 대해 설명하고, ClassCastException이 발생하는 경우를 예로 들어 설명하시오.
답: 형 변환 시 예외 상황으로는 호환되지 않는 타입 간의 변환이 있으며 (ClassCastException, ArithmeticException, NumberFormatException), ClassCastException은 부모 타입의 객체를 자식 타입으로 잘못 형 변환할 때 발생한다.
코딩테스트
https://school.programmers.co.kr/learn/courses/30/lessons/42576
https://school.programmers.co.kr/learn/courses/30/lessons/81301
Quiz 4
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. 다음 코드의 출력 결과는 무엇인가?
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");
}
답 : c) Wednesday
7. switch 문에서 break 문을 생략하면 어떤 결과가 발생하는가?
답 : c) 다음 case의 코드도 연속적으로 실행된다.
8. 다음 중 switch 문의 올바른 사용 예는?
답 : b)
switch (day) {
case "Monday":
System.out.println("Today is Monday");
break;
case "Tuesday":
System.out.println("Today is Tuesday");
break;
}
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. 다음 코드의 출력 결과는 무엇인가?
for (int i = 0; i < 3; i++) {
System.out.print(i + " ");
}
답 : 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. 다음 코드의 출력 결과는 무엇인가?
int i = 1;
while (i <= 3) {
System.out.print(i + " ");
i++;
}
답 : 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. 다음 코드의 출력 결과는 무엇인가?
String[] fruits = {"Apple", "Banana", "Cherry"};
for (String fruit : fruits) {
System.out.print(fruit.charAt(0) + " ");
}
답 : a) A B C
24. 다음 중 for-each 문을 사용하여 리스트의 모든 요소를 출력하는 올바른 코드는?
답 : 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
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 이서영 #2주차 (1) | 2024.10.16 |
---|---|
[2024-2 Java 스터디] 이민형 #2주차 (3~4장) (1) | 2024.10.16 |
[2024-2 Java 스터디] 이가인 #2주차 (2) | 2024.10.16 |
[2024-2 Java 스터디] 김지나 #2주차 "~제어문" (0) | 2024.10.16 |
[2024-2 Java 스터디] 김태일 #2주차 (4) | 2024.10.15 |