본문 바로가기

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

[2024-2 Java 스터디] 김민서 #2주차

반응형

 

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

키와 값을 한 쌍으로 가짐

 

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

 

프로그래머스

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

programmers.co.kr

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

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

 

프로그래머스

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

programmers.co.kr

 

 

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

 

프로그래머스

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

programmers.co.kr

반응형