카테고리 없음

[혼공자] 2주차 (혼공학습단 12기)

chaemin07 2024. 7. 9. 14:55

혼공학습단 12기는 7/01일부터 8/18일까지 진행하는 스터디 활동입니다.

 

★ 이번주 공부할 내용

# 진도 기본 숙제(필수) 추가 숙제(선택)
2주차
(7/8 ~ 7/14)
Chapter 04 ~ 05 p.142 직접 해보는 손코딩(switch문) 실행 후 결과 화면 캡쳐하기 p.202 05-2 확인 문제 6번 풀고 정리하기

 

🙋‍♂️Q&A: 신용권 저자님의 네이버 카페
💻유튜브 강의: 👉전체 강의 목록

 

혼자 공부하는 자바(개정판)

『혼자 공부하는 자바』가 더욱 풍성한 내용을 담아 돌아왔습니다! 개정판은 기존의 자바 8 & 11 버전은 물론, 최신 버전인 자바 21까지 다룹니다. 자바 21 버전의 강화된 언어 기능을 담은 총 260개

www.youtube.com

이번주 공부할 내용

·  Chaper 04 조건문과 반복문

·  Chaper 05 참조 타입

파트입니다!!

 

■ 기본 숙제

 

Switch구문을 이용한 주사위 번호 뽑기 코드

Switch문 소스 코드

public class SwitchExample {
    public static void main(String[] args) {
        // 주사위 번호 하나 뽑기
        int num = (int) (Math.random() * 6) + 1;
        switch (num) {
            case 1:
                System.out.println("1번이 나왔습니다.");
                break;
            case 2:
                System.out.println("2번이 나왔습니다.");
                break;
            case 3:
                System.out.println("3번이 나왔습니다.");
                break;
            case 4:
                System.out.println("4번이 나왔습니다.");
                break;
            case 5:
                System.out.println("5번이 나왔습니다.");
                break;
            default:
                System.out.println("6번이 나왔습니다.");
                break;
        }

    }
}

<실행 결과>

1번
2번
3번
4번
5번
6번

과제 코드는 기존의 if/else if 문을 Switch구문으로 수정한 코드입니다

조건문이라는 같은 역할을 수행한 다곤 하지만 어떤 차이가 있을까? 성능면에서 차이가 존재할까?

라는 의문점이 들었습니다!!

 

if구문의 경우는 먼저 처리할 조건들을 앞단에 배치하여 "&&" 또는 '&' 연산자를 이용하여

빠르게 조건문의 처리할 수 있다고 생각합니다

switch구문의 경우 해당하는 case가 존재하는지에 대한 체크과정이 모든 case에서 필요하다고 생각해서 

if문이 더 빠르다고 생각했지만

 

검색을 해보니

switch구문의 시간 복잡도는 O(1), 

if-else구문의 시간 복잡도는 O(n)으로

일반적으로는 swtich문의 속도가 더 빠르나 조건문의 분기수에 따라 if문이 더 빠를 수도 있다고 합니다

참고

 

[자바 최적화 연구] if와 switch 조건문 연산 속도 비교 (int) | YeopBox

안녕하세요! 상큼한놈 입니다. 프로그램을 제작하다 보면 가끔은 사용 용도가 중복되는 코드가 많습니다. 무심코 개발 시에 한 가지 방법만 고집하여 프로그래밍하면 개발자는 편할지 몰라도

yeopbox.com

 

How is String in switch statement more efficient than corresponding if-else statement?

Java documentation says The Java compiler generates generally more efficient bytecode from switch statements that use String objects than from chained if-then-else statements. AFAIK even Strin...

stackoverflow.com

 

■ 추가 숙제

p.202 05-2 확인 문제 6번 풀고 정리하기

 

#6. 키보드로부터 학생 수와 각 학생들의 점수를 입력받아서, 최고 점수 및 평균 점수를 구하는 프로그램을 작성하는 문제입니다.

 

각 switch문의 예상 결과에 맞춰 코드를 작성해야 합니다

· case 1은 학생 수를 입력

→ 스캐너 클래스 사용

·  case 2는 입력받은 학생 수만큼 배열을 할당하고 배열의 각 요소마다 학생의 점수를 저장합니다

→ 배열 생성, 각 요소에 점수 저장

·  case 3은 학생들의 점수를 출력합니다

→ for문을 이용한 배열 출력

·  case 4는 학생들의 최고 점수와 평균 점수를 출력합니다

→ 최고 점수와 평균 점수 출력, sum변수를 int로 받는다면 소수점이 절사되어 값이 작아집니다

double형식으로 변수를 만들고 강제형변환을 사용!!

·  case 5는 프로그램을 종료합니다

→ flag인 run변수를 false

import java.util.Scanner;

public class Chapter5_Exam06 {
    public static void main(String[] args) {
        boolean run = true;
        int studentNum=0;
        int [] scores =null;
        Scanner scanner = new Scanner(System.in);
        while (run) {
            System.out.println("-------------------------------------------------");
            System.out.println("1.학생수 | 2.점수입력 | 3.점수리스트 | 4.분석 | 5.종료");
            System.out.println("-------------------------------------------------");
            System.out.print("선택>");

            int selectNo = Integer.parseInt(scanner.nextLine());
            if (selectNo == 1) {
                System.out.print("학생수>");
                studentNum = Integer.parseInt(scanner.nextLine());
            } else if (selectNo == 2) {
                scores = new int[studentNum];
                for (int i = 0; i < studentNum; i++) {
                    System.out.print("score["+i+']'+'>');
                    scores[i] = Integer.parseInt(scanner.nextLine());
                }
            } else if (selectNo == 3) {
                for (int i = 0; i < studentNum; i++) {
                    System.out.println("score["+i+']'+"> "+scores[i] );
                }
            } else if (selectNo == 4) {
                double sum=0;
                int max_score=-1;
                for (int score : scores) {
                    if (score > max_score) {
                        max_score = score;
                    }
                    sum+=score;
                }
                System.out.println("최고 점수: " + max_score);
                System.out.println("평균 점수: "+sum/studentNum);
            } else if (selectNo == 5) {
                run = false;
            }
            
        }
        System.out.println("프로그램 종료");
    }
}

이번주도 공부하시느라 다들 수고가 많으십니다!!

같이 파이팅 해요!!!!

다같이 화이팅입니다!