본문 바로가기

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

[2024-2 Java 스터디] 이가인 #2주차

반응형
  • 자료형
    •  맵, 집합, 상수 집합, 형 변환, final
  • 제어문
    • if 문, switch/case 문, while 문, for 문, for each 문
  • 메서드 정리
  • 퀴즈, 코테

 


자료형 

  • 대응 관계 표현
  • 키(key)와 값(value)을 한 쌍으로 갖는 자료형
  • 순서가 없다.
  • HashMap, LinkedHashMap(입력 순으로 데이터 저장), TreeMap(입력된 key의 오름차순으로 데이터 저장) 등이 있고 HashMap이 가장 기본이다

 

  • HashMap의 메서드
    1. put (key와 value 추가)
    2. get (key에 해당하는 value얻을 때)
    3. containsKey (해당 key가 있는지 t/f로 리턴)
    4. remove (해당 key의 항목 삭제 후 value 값 리턴)
    5. size (맵 요소의 개수 리턴)
    6. keySet (맵의 모든 key를 모아 리턴)
import java.util.HashMap;

public class Sample {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("people", "사람");
        map.put("baseball", "야구"); // key와 value 추가
        
        System.out.println(map.get("people")); // "사람" 출력
        
        System.out.println(map.containsKey("people"));  // true 출력
        
        System.out.println(map.remove("people"));  //key와 value가 모두 삭제된 후 "사람" 출력
        
        System.out.println(map.size()); // 1 출력
        
        System.out.println(map.keySet());  // [baseball] 출력 (모든 key모아서 집합자료형으로 리턴)
    }
}

 

 

 

 

집합
  • 집합(Set) 자료형은 집합과 관련된 것을 쉽게 처리하기 위해 만든 것으로 HashSet, TreeSet, LinkedHashSet 등이 있다.
  • 가장 많이 사용하는 HashSet
  • 중복 허용 x
  • 순서 x (맵과 마찬가지)

 

  • HashSet의 메서드 
    1. retainAll (교집합)
    2. addAll (합집합)
    3. removeAll (차집합)
    4. add (원소 추가)
    5. addAll (값을 한꺼번에 여러 개 추가)
    6. remove (특정 값 제거)
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] 출력
        
        HashSet<Integer> union = new HashSet<>(s1);  // s1으로 union 생성
        union.addAll(s2); // 합집합 수행
        System.out.println(union);  // [1, 2, 3, 4, 5, 6, 7, 8, 9] 출력
    
         HashSet<Integer> substract = new HashSet<>(s1);  // s1으로 substract 생성
        substract.removeAll(s2); // 차집합 수행
        System.out.println(substract);  // [1, 2, 3] 출력
    }
}

교,차,합집합을 구할때는 먼저 그것에 맞는 변수(공간)를 생성해야함!! 

 

import java.util.HashSet;

public class Sample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Jump");
        set.add("To");
        set.add("Java");
        System.out.println(set);  // [Java, To, Jump] 출력
        
        set.addAll(Arrays.asList("Jump","To", "Java")); // 이렇게 다같이 할 수도 있음
        
        set.remove("To");
        System.out.println(set);  // [Java, Jump] 출력
    }
}

 

 

 

 

상수 집합 (enum 자료형)
  • 서로 연관 있는 여러 개의 상수 집합을 정의할 때 사용
public class Sample {
    enum CoffeeType {
        AMERICANO,
        ICE_AMERICANO,
        CAFE_LATTE
    };

    public static void main(String[] args) {
    	
        System.out.println(CoffeeType.AMERICANO);  // AMERICANO 출력
        
        for(CoffeeType type: CoffeeType.values()) {
            System.out.println(type);  // 순서대로 AMERICANO, ICE_AMERICANO, CAFE_LATTE 출력
        }
    }
}

 

  • 종류별로 판매된 커피의 개수를 리턴할 때  ➡️ 메서드가 존재하진않지만 아래와 같은 식으로 활용
/**
 * countSellCoffee는 판매된 커피의 갯수를 리턴하는 메서드이다.
 * @param type 커피의 종류 (1: 아메리카노, 2: 아이스 아메리카노, 3: 카페라떼)
 */
int countSellCoffee(int type) {
    ... 생략 ...
}

int americano = countSellCoffee(1); // 이런식으로 사용한다. 숫자를 기억헤야하는 단점이 있음

이런식으로 숫자를 기억해야하는 단점이 있어 이를 숫자 대신 상수 집합인 CoffeType을 인수로 사용하면 보다 코드가 명확해지고 잘못된 값을 사용해 생길 수 있는 오류를 막을 수 있다. 

 

enum CoffeeType {
    AMERICANO,
    ICE_AMERICANO,
    CAFE_LATTE
};

/**
 * countSellCoffee는 판매된 커피의 갯수를 리턴하는 메서드이다.
 * @param type 커피의 종류 (CoffeType)
 */
int countSellCoffee(CoffeType type) {
    ... 생략 ...
}

int americano = countSellCoffee(CoffeType.AMERICANO);  // 아메리카노의 판매갯수

 

 

 

 

형 변환

 

1. 문자열 -> 정수형

String num = "123";
        int n = Integer.parseInt(num);

2. 정수형 -> 문자열

// 1. 가장 쉬운 방법
int n = 123;
String num = "" + n;
        
// 2.
 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를 사용

String num = "123.456";
double d = Double.parseDouble(num);

4. 정수형 <-> 실수형

int n1 = 123;
double d1 = n1;  // 정수를 실수로 바꿀때에는 캐스팅이 필요없다.
System.out.println(d1);  // 123.0 출력

double d2 = 123.456;
int n2 = (int) d2; // 실수를 정수로 바꿀때에는 반드시 정수형으로 캐스팅해 주어야 한다.

4. 실수형태 문자열 -> 정수형  

Double.parseDouble을 이용해 실수로 바꾼 후 사용

String num = "123.456";
int n = Integer.parseInt(num);  // 실수 형태의 문자열을 정수로 변환할 경우 NumberFormatException이 발생한다.

 

 

 

 

 

final ( 재할당 불가능 )
  • 자료형에 값을 단 한 번만 설정할 수 있게 강제하는 키워드
  • 값을 다시 바꿀 수 없음 (리스트의 경우도)
  • 프로그램을 수행하면서 그 값이 바뀌면 안 될 때 사용
  • 다시 바꾸려하거나 리스트의 경우에도 다시 할당했을 때 모두 컴파일 에러 발생!
  • 만약 값을 더하거나 빼는 것도 할 수 없게 하고 싶다면 List.of를 작성하여 수정할 수 없는 리스트(unmodifiable list)로 만들면 된다.
import java.util.List;

public class Sample {
    public static void main(String[] args) {
        final List<String> a = List.of("a", "b");
        a.add("c");  // UnsupportedOperationException 발생
    }
}

 

 

 

 

 

 

 


제어문 

if 문 ( + else if 문)
if (조건문) {
    <수행할 문장1>;
    <수행할 문장2>;
    ...
} else {
    <수행할 문장A>;
    <수행할 문장B>;
    ...
}

 

  • List 자료형의 contains (해당 아이템 여부 조사) ➡️ 조건문에 많이 활용됨
ArrayList<String> pocket = new ArryList<String>();
pocket.add("paper");
pocket.add("handphone");
pocket.add("money");

if (pocket.contains("money")) {
    System.out.println("택시를 타고 가라");
}else {
    System.out.println("걸어가라");
} 
// 택시를 타고 가라

 

 

 

  • and, or ,not 연산자
연산자 설명
x && y and ( x와 y 모두 참이어야 참)
x || y or ( x와 y 모두 참이어야 참)
! x not x ( x가 거짓이면 참)

 

 

 

  • else if 문
    • 처음 조건에서 거짓이 되고 또 그 거짓에서 참 거짓이 나뉠 때 else if 를 이용
    • else if는 이전 조건문이 거짓일 때 수행됨
    • 마지막 조건의 거짓이 else임
if (조건문) {
    <수행할 문장1> 
    <수행할 문장2>
    ...
}else if (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
}else if (조건문) {
    <수행할 문장1>
    <수행할 문장2>
    ...
...
} else {
   <수행할 문장1>
   <수행할 문장2>
   ... 
}

 

 

 

 

switch / case 문
  • 입력값이 정형화되어 있는 경우 if 문보다는 switch/case 문을 쓰는 것이 코드의 가독성이 좋다.
  • switch/case 문은 if 문으로 변경이 가능하지만 if 문으로 작성된 모든 코드를 switch 문으로 변경할 수는 없다.
switch(입력변수) {
    case 입력값1: ...
         break;
    case 입력값2: ...
         break;
    ...
    default: ...
         break;
}

 

 

 

while 문
  • 조건문이 참이면 문장을 반복실행한다. 
while (조건문) {
    <수행할 문장1>;
    <수행할 문장2>;
    <수행할 문장3>;
    ...
}
  • break, continue
  • 무한 루프 (무한반복)
    • 프로그램에서 자주 사용됨!
    • 조건문 자체가 true이므로 조건문은 항상 참이 된다 -> 수행할 문장이 계속 수행됨
    • Ctrl + C 를 눌러서 빠져나간다.
while (true) {    
    <수행할 문장1>;
    <수행할 문장2>;
    ...
}

 

예제 ) 사용자가 입력한 점수들의 평균을 내는 프로그램

음수를 입력하면 break에 의하여 반복 루프가 종료되게 한다. 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int total=0,count=0, avg=0;
        Scanner scanner = new Scanner(System.in);

        while (true){
            System.out.print("점수를 입력하시오: ");
            int grade = scanner.nextInt();

            if (grade<0)  break;

            total+=grade;
            count++;
            avg=total/count;
        }

        System.out.println("평균은 "+avg);
    }
}

//결과
점수를 입력하시오: 10
점수를 입력하시오: 20
점수를 입력하시오: -1
평균은 15

 

  • do - while 문
    • 조건이 참이면 반복을 계속한다.
do {
	문장1;
    문장2;
    ...
} while (조건)

 

예제 ) 사용자로부터 올바른 월 번호를 입력할 때까지 반복을 계속하는 프로그램

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int month;

        do {
            System.out.print("올바른 월을 입력하시오 [1-12]: ");
            month =scanner.nextInt();
        } while (month<1 || month>12);

        System.out.println("사용자가 입력한 월은 " +month);
    }
}

// 결과
올바른 월을 입력하시오 [1-12]: 31
올바른 월을 입력하시오 [1-12]: 21
올바른 월을 입력하시오 [1-12]: 1
사용자가 입력한 월은 1

 

 

 

 

 

for 문
for (초기치; 조건문; 증가치) {
    ...
}

 

 

  • continue ( for 문으로 돌아가기 )

예제 ) 합격 여부를 알려주는 프로그램

60점 이상인 사람에게는 축하 메시지를 보내고 나머지 사람에게는 아무런 메시지도 전하지 않는 프로그램

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)+"번 학생 축하합니다. 합격입니다.");
}

// 결과
1번 학생 축하합니다. 합격입니다.
3번 학생 축하합니다. 합격입니다.
5번 학생 축하합니다. 합격입니다.

 

 

 

  • 이중 for 문 (중첩반복문)

예제1 ) 구구단

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        for (int x=2; x<10;x++){
            for (int y=1;y<10;y++){
                System.out.print(x*y + " ");
            }
            System.out.println();
        }
    }
}

// 결과
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81

 

- for (초기치)에서 초기치는 초기 변수를 설정하는거임!!

- 웬만한 계산은 System.out.print();에서 설정하기!

- 상위 for문 에서의 System.out.println(); 은 줄을 바꾸어 출력하는 역할을 한다. 

- 상위 for문 : 행

- 하위 for문 : 열 

 


예제2 ) 5*10 사각형 별 출력하는 프로그램

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        for (int x=1; x<6;x++){
            for (int y=1;y<11;y++){
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

// 결과
**********
**********
**********
**********
**********

 

 

 

 

for each 문

 

  • for문은 for each 문으로 변경할 수 있다.
  • 반복 횟수를 명시적으로 주는 것이 불가능
  • 한 단계씩 순차적으로 반복할 때만 사용 가능
// for문 사용
String[] numbers = {"one", "two", "three"};
for(int i=0; i<numbers.length; i++) {
    System.out.println(numbers[i]);
}

// for each문 사용
String[] numbers = {"one", "two", "three"};
for(String number: numbers) {
    System.out.println(number);
}

//결과
one
two
three

 

구조

for (type 변수명: iterate) {
    body-of-loop
}
// 변수명 새로 설정해야함!

 

 

 

기본형 참조형 차이

메모리 값 자체를 저장 객체의 메모리 주소를 저장
null 가능 불가능 가능 (null로 참조 해제 가능)
비교 값 자체를 비교 메모리 주소를 비교 (값 비교는 .equals())
성능 메모리 사용 적음, 빠름 더 많은 메모리 사용, 상대적으로 느림

메서드 정리

String length contains equals substring charAt replaceAll indexOf split
StringBuffer insert toString append substring        
배열  length              
리스트 size contains add get remove      
맵 (HashMap) size containsKey put get remove containsKey keySet  
집합(HashSet)   retainAll add, addAll   remove, removeAll      

 


퀴즈 (3.5 ~4장)

  문제
1
  • 다음 중 HashMap의 특징은?
    a) 순서를 보장한다.
    b) 키가 중복될 수 있다.
    c) null 키를 허용한다.
    d) 동기화되어 있다.
 c
2
  • Map에서 키-값 쌍을 추가할 때 사용하는 메서드는?
    a) put()
    b) add()
    c) insert()
    d) addEntry()
 a
3
  • 다음 코드의 출력 결과는 무엇인가?
    Map<String, Integer> map = new HashMap<>();
    map.put("Java", 8);
    map.put("Python", 3);
    System.out.println(map.get("Java"));

    a) 3
    b) 8
    c) null
    d) Error
 b
4
  • **Map**에 키가 존재하는지 여부를 알 수 있는 메서드는?
    a) get()
    b) isEmpty()
    c) containsValue()
    d) containsKey()
 d
5
  • Set의 주요 특징 중 하나는 무엇인가?
    a) 순서를 유지한다.
    b) 키-값 쌍으로 데이터를 저장한다.
    c) 중복된 요소를 허용하지 않는다.
    d) null 값을 허용하지 않는다.
 c
6
  • 다음 코드의 출력 결과는 무엇인가?
    Set<String> set = new HashSet<>();
    set.add("Java");
    set.add("Java");
    System.out.println(set.size());

    a) 1
    b) 2
    c) 0
    d) Error
 a
7
  • Set에 요소를 추가할 때 사용하는 메서드는?
    a) add()
    b) put()
    c) insert()
    d) append()
 a
8
  • **Java에서 자동 형 변환(implicit casting)이 이루어지는 경우는?
    a) int에서 byte로 변환할 때
    b) float에서 int로 변환할 때
    c) int에서 double로 변환할 때
    d) char에서 int로 변환할 때


 c
9
  • 다음 코드의 출력 결과는 무엇인가?
    double d = 9.78; int i = (int) d; System.out.println(i);

    a) 9
    b) 10
    c) 9.78
    d) Error
 a
10
  • 다음 중 final 키워드의 올바른 사용법이 아닌 것은?
    a) final 변수를 재할당할 수 있다.
    b) final 메서드는 오버라이딩할 수 없다.
    c) final 클래스는 상속할 수 없다.
    d) final 배열의 길이는 고정된다.
 a
11
  • Java에서 기본형 타입을 참조형 타입으로 변환할 때 사용하는 클래스는?
    a) Wrapper
    b) Integer
    c) Float
    d) Object
 a
12
  • 다음 코드의 출력 결과는 무엇인가?
    final int x = 10;
    x = 15; // 이 줄에서 에러 발생
    System.out.println(x);

    a) 10
    b) 15
    c) Error
    d) 0
 c
13 Java의 Set 인터페이스를 사용하는 목적에 대해 서술하시오.  set은 중복되는 요소를 허용하지 않고 순서가 없어 데이터의 순서에 상관없이 처리할 수 있다. 
14 형 변환(타입 캐스팅)의 개념을 설명하고, 자바에서의 자동 형 변환과 수동 형 변환의 차이점을 서술하시오.  형 변환은 변수의 데이터 타입을 다른 데이터 타입으로 변환하는 과정이며 차이점은 작은 데이터에서 큰 데이터로 변환할때는 자동으로 이루어지지만 역은 명시적으로 형 변환 연산자를 사용해야함
15 Java의 final 키워드에 대해 설명하고, final 변수를 사용할 때의 장점을 서술하시오.  재할당이 불가능하며 코드의 안정성을 높이고 의도치않은 변경을 방지한다. 
16 형 변환 시 발생할 수 있는 예외 상황에 대해 설명하고, ClassCastException이 발생하는 경우를 예로 들어 설명하시오. 잘못된 형 변환을 시도할 경우 ClassCastException이 발생할 수 있다.
4-1 다음 코드의 출력 결과는 무엇인가?  a
2 다음 중 if 문의 올바른 사용법은? b
3 다음 중 중첩 if 문의 예는?  a
4 다음 if-else if-else 구조에서 result의 값은 무엇인가?  b
5 다음 if 문에서 논리 오류가 있는 것은?  a
6 다음 코드의 출력 결과는 무엇인가?  c
7 switch 문에서 break 문을 생략하면 어떤 결과가 발생하는가?
a) 컴파일 오류가 발생한다.

b) 해당 case의 코드만 실행된다.
c) 다음 case의 코드도 연속적으로 실행된다.
d) default 블록이 무조건 실행된다.
 c
8 다음 중 switch 문의 올바른 사용 예는?  c
a) switch 문 은 boolean값을 사용할 수 없음
b)day라는 변수 정의 되어있지 않음
d) switch문은 float또는 double같은 실수형 값을 사용할 수 없
9 다음 코드의 출력 결과는 무엇인가?  a
10 다음 중 switch 문에서 사용할 수 없는 자료형은?

a) int
b) String
c) double
d) char
 c
11 다음 코드의 출력 결과는 무엇인가? a
12 다음 중 무한 루프를 생성하는 for 문의 예는? b,d
13 다음 코드의 출력 결과는 무엇인가?
break는 아예 그 조건문이 끝나는 거임!!!
14 다음 중 for 문을 사용하여 1부터 10까지의 합을 구하는 올바른 코드는? a,c
15 다음 코드의 출력 결과는 무엇인가? b
16 다음 코드의 출력 결과는 무엇인가? a
17 다음 중 무한 루프를 생성하는 while 문의 예는? a
18 다음 코드의 출력 결과는 무엇인가? b
19 다음 중 while 문을 사용하여 1부터 10까지의 홀수를 출력하는 올바른 코드는? d
20 다음 코드의 출력 결과는 무엇인가? b
21 다음 코드의 출력 결과는 무엇인가? a
22 다음 중 for-each 문을 사용하는 이유로 옳지 않은 것은?
a) 배열이나 컬렉션의 모든 요소를 간편하게 순회하기 위해
b) 인덱스 관리를 자동으로 해주기 위해
c) 요소를 수정할 수 있기 위해
d) 코드의 가독성을 높이기 위해

c
23 다음 코드의 출력 결과는 무엇인가? a
24 다음 중 for-each 문을 사용하여 리스트의 모든 요소를 출력하는 올바른 코드는? d
리스트 요소가 String이지만, Object 타입으로도 받을 수 있다. 
25 다음 코드의 출력 결과는 무엇인가? b

 

** continue는 반복문(예: for, while)에서 해당 반복의 나머지 부분을 건너뛰고, 바로 다음 반복을 실행하도록 하는 제어문이다 **

 

 

코테

 

3.5장

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

 

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

 

4장

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

 

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

반응형