본문 바로가기

WINK-(Web & App)/JAVA 스터디

[2024-2 Java 스터디] 김지나 #2주차 "~제어문"

반응형

✅ 맵

- 대응 관계를 쉽게 표현할 수 있게 해주는 자료형

- 키, 값을 한 쌍으로 갖는 자료형 (키를 이용해서 값을 얻는 형식으로 사용됨)

맵 자료형 중에서 제일 기본인 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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Q2. https://school.programmers.co.kr/learn/courses/30/lessons/81301

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

- 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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Q2. https://school.programmers.co.kr/learn/courses/30/lessons/12943

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

반응형