본문 바로가기

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

[2024-2 Java 스터디] 김태일 #2주차

반응형

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 연산자의 자세한 설명은 아래 자바연산자 티스토리를 통해 확인

 

[Java] 자바 연산자

연산자(operator)- 연산에 사용되는 표시나 기호- 피연산자 : 연산이 되는 데이터종류연산자우선순위증감 연산자++, --1순위산술 연산자+, -, *, /, %2순위시프트 연산자>>, >>3순위비교 연산자>, =, 4순위

taei1.tistory.com

 

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

 

프로그래머스

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

programmers.co.kr

 

숫자 문자열과 영단어

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

 

프로그래머스

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

programmers.co.kr

 

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

 

프로그래머스

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

programmers.co.kr

 

콜라츠 추측 : https://school.programmers.co.kr/learn/courses/30/lessons/12943

 

프로그래머스

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

programmers.co.kr

※ 500번 반복할 때까지 1이 되지 않으면 --> 400번으로 바꾸면 풀림..


참고문헌 : https://wikidocs.net/book/31

 

점프 투 자바

이 책은 프로그래머를 꿈꾸며 자바 입문서를 찾는 사람들을 위한 책이다. 이 책은 자바의 문법을 하나하나 자세히 알기 보단 어렵게 느껴지는 자바를 쉽고 재미있게 이해하는 것을 목표…

wikidocs.net

반응형