내일배움캠프/TIL

JAVA 입문 _ 김영한의 자바 입문 강의 - Day 5[조건문2]

austindynasty 2024. 10. 20. 23:00

1. 조건문

1) switch문

    예제

당신은 회원 등급에 따라 다른 쿠폰을 발급하는 프로그램을 작성해야 한다. 

이 프로그램은 int grade 라는 변수를 사용하며, 회원등급(grade)에 따라 다음의 쿠폰을 발행해야 한다.

1등급 : 쿠폰 1000 / 2등급 : 쿠폰 2000 / 3등급 : 쿠폰 3000 / 그 외 쿠폰 500

각 쿠폰이 할당된 후에는 "발급받은 쿠폰" + 쿠폰값을 출력해야 한다. 

<if문 사용>

public static void main(String[] args) {
        int grade = 2;

        int coupon;
        if (grade == 1) {
            coupon = 1000;
        } else if (grade == 2) {
            coupon = 2000;
        } else if (grade == 3) {
            coupon = 3000;
        }
        else {
            coupon = 500;
        }
        System.out.println("발급받은 쿠폰 " + coupon);
    }
}

 

<switch문 사용> : 선택된 데이터 반환 

public class Switch3 {
    public static void main(String[] args) {
        int grade = 2;

        int coupon = switch (grade) {
            case 1 -> 1000;
            case 2 -> 2000;
            case 3 -> 3000;
            default -> 500;
        } ;
        System.out.println("발급받은 쿠폰 " + coupon);
    }
}

 

2. 삼항연산자 : 조건, 참_표현식, 가짓_표현식 이렇게 항이 3개이다. 특정 조건에 따라 결과가 나오기 때문에 조건 연산자라고도 한다. 

    public static void main(String[] args) {
        int age = 18;
        String status;
        if ( age >= 18) {
            status = "성인";
        } else {
            status = "미성년자";
        }
        System.out.println("age = " + age + " status = " + status);
    } 
}

-> if문을 이용하면 참과 거짓에 따라 status 변수 값이 달라진다.

    public static void main(String[] args) {
        int age = 18;
        String status = ( age >= 18) ? "성인" : "미성년자"; 
        System.out.println("age = " + age + " status = " + status);
    }
} // 실행결과 : age = 18 status = 미성년자

-> 위 예제처럼 참과 거짓에 따라 특정한 값을 구하는 경우 삼항연산자 또는 조건연산자 라고 불리는 ? : 연산자를 사용할 수 있다. 

- 조건을 만족하면 참_표현식 만족하지 않으면 거짓_표현식이 실행된다. if문처럼 코드블럭을 넣을 수 없고 단순한 표현식만 넣을 수 있다. 

- 단순히 참과 거짓에 따라 특정 값을 구하는 상황에서는 삼항연산자를 사용해 간결하게 코드를 작성할 수 있다. 

 

3. 문제 풀이

1) 학점 계산

 다음과 같은 기준을 따라 학생의 점수를 기반으로 학점을 출력하는 프로그램을 작성하세요. 점수는 변수 int score로 지정하세요. 

90점 이상 : "A"

80점 이상 90점 미만 : "B"

70점 이상 80점 미만 : "C"

60점 이상 70점 미만 : "D"

60점 미만 : "F"

public class ScoreEx1 {

    public static void main(String[] args) {
        int score = 75;

        if (score >= 90) {
            System.out.println("학점 : A ");
        } else if ( 80 <= score && score < 90 ) {
            System.out.println("학점 : B " );
        } else if ( 70 <= score && score < 80 ) {
            System.out.println("학점 : C " );
        } else if ( 60 <= score && score < 70 ) {
            System.out.println("학점 : D " );
        } else {
            System.out.println("학점 : F ");
        }
    }
}

실행결과 " 학점 : C " ( score는 임의의 값으로 초기화함 ) 

-> 범위의 기준이 나와있길래 단순히 전에 배웠던 &&를 활용해 문제를 풀었다. 하지만 정답에서는 범위를 좀 더 단순화해 풀었다. 

public class ScoreEx1 {

    public static void main(String[] args) {
        int score = 75;

        if (score >= 90) {
            System.out.println("학점 : A");
        } else if (score >= 80) {
            System.out.println("학점 : B");
        } else if (score >= 70) {
            System.out.println("학점 : C");
        } else if (score >= 60) {
            System.out.println("학점 : D");
        } else {
            System.out.println("학점 : F");
        }
    }
}

-> 이미 위 if문에서 nn점 이상인 경우를 확인하고 내려왔기 때문에 &&을 사용해 양쪽 구간을 확인할 필요가 없다는 것이 범위를 간결화 할 수 있는 이유였다. if문에서는 해당 조건이 만족되지 않을 때 다음 조건으로 넘어가므로 위 조건에서 이미 확인한 것은 중복으로 확인하지 않도록 주의해야겠다.

 

2) 거리에 따른 운송 수단 선택

 다음 주어진 거리에 따라 가장 적합한 운송수단을 선택하는 프로그램을 작성하세요. 거리는 변수 int distance로 지정하세요. 

거리 1km 이하 : "도보" (dis <= 1)

거리 10km 이하 : "자전거" ( 1< dis <=10)

거리 100km 이하 : "자동차" ( 10 < dis <= 100 )

거리 100km 초과 : "비행기" ( dis > 100 )

public class DistanceEx {
    public static void main(String[] args) {
        int distance = 9;

        if ( distance <= 1 ) {
            System.out.println("도보");
        } else if ( distance <= 10 ) {
            System.out.println("자전거");
        } else if ( distance <= 100) {
            System.out.println("자동차");
        } else {
            System.out.println("비행기");
        }
    }
}

-> 이번엔 풀이와 똑같이 풀어냈다! if문에서 범위를 특정할 때 위 조건과 반복되지 않게끔 표현하는 법을 깨우쳤다.

 

3) 환율 계산하기

 특정 금액을 미국 달러에서 한국 원으로 변환하는 프로그램을 작성하세요. 환율은 1달러 당 1300원이라고 가정합니다. 금액은 변수 int dollar로 지정하고 해당 변수를 기반으로 한국 원으로의 환전 금액을 출력하세요. 

달러가 0미만 : "잘못된 금액입니다."

달러가 0일 때 : "환전할 금액이 없습니다."

달러가 0초과일 때 : "환전금액은 (계산된 원화 금액)원 입니다."

public class ExchangeEx {
    public static void main(String[] args) {
        int dollar = 33;

        if ( dollar < 0) {
            System.out.println("잘못된 금액입니다.");
        } else if ( dollar == 0 ) {
            System.out.println("환전할 금액이 없습니다.");
        } else {
            int won = dollar * 1300;
            System.out.println("환전금액은 " + won + "원 입니다.");
        }
    }
}

-> 해설과 똑같이 풀었다. else에서 새로운 변수를 선언한 것은 처음이라 오류가 날 거라고 생각했는데 상관 없는 거였나보다.. 비교 연산자에서 하마터면 = 등호를 하나만 넣을 뻔했는데 가까스로 기억해내 == 를 사용할 수 있었다! 

 

4) 평점에 따른 영화 추천하기

 요청한 평점 이상의 영화를 찾아 추천하는 프로그램을 작성하세요. if문을 활용하고 평점 변수는 double rating을 사용하세요. 

인턴 : 평점 9

포레스트 검프 : 평점 8

원령공주 : 평점 6

public class MovieRateEx1 {
    public static void main(String[] args) {

        double rating = 7.5;

        if (rating <= 9) {
            System.out.println(" '인턴'을 추천합니다.");
        }
        if (rating <= 8) {
            System.out.println(" '포레스트 검프'를 추천합니다.");
        }
        if (rating <= 7) {
            System.out.println(" '원령공주'를 추천합니다.");
        }
    }
}

-> 주어진 평점 이상의 영화를 모두 추천해야 하기 때문에 else if 를 사용하지 않고 독립된 if문을 나열해봤다. 임의의 수 7.5점을 넣어 실행한 결과 인턴과 포레스트 검프 두 개 모두 추천되었다. 해설을 보니 정답! 여담으로 인턴과 포레스트 검프는 정말 재밌다. 나중에 내가 본 영화들에 평점을 매겨 좋게 봤던 영화들을 추천해주는 프로그램을 작성해보면 재밌을 듯하다!

 

5) 학점에 따른 성취도 출력하기

 String grade 라는 문자열을 만들고, 학점에 따라 성취도를 출력하는 프로그램을 작성하세요. Switch문을 사용하세요. 

"A" : "탁월한 성과입니다!"

"B" : "좋은 성과입니다."

"C" : "준수한 성과입니다."

"D" : "분발하세요."

"F" : "낙점입니다."

나머지 : "잘못된 학점입니다."

public static void main(String[] args) {
        String grade = "B";

        switch (grade) {
            case "A":
                System.out.println("탁월한 성과입니다!");
                break;
            case "B":
                System.out.println("좋은 성과입니다.");
                break;
            case "C":
                System.out.println("준수한 성과입니다.");
                break;
            case "D":
                System.out.println("분발하세요.");
                break;
            case "F":
                System.out.println("낙점입니다.");
                break;
            default:
                System.out.println("잘못된 학점입니다.");
        }
    }
}

-> switch문을 쓸 때 case에 바로 문자열을 넣을 수 있는 지 몰랐다. String 으로 문자열을 표현하다가 도저히 안돼서 해설을 보니 case와 쌍따옴표를 이용해 바로 switch문을 작성할 수 있는 것을 알아냈다. 아직 배운 것을 응용하는 것이 익숙하지 않은 것 같아서 연습이 많이 필요할 듯하다..

 

6) 더 큰 숫자 찾기

 두 개의 정수 변수 a와 b가 있습니다. a의 값은 10이고, b의 값은 20일 때, 삼항 연산자를 사용해 두 숫자 중 더 큰 숫자를 출력하는 코드를 작성해보세요. 

public class CondOpEx {

    public static void main(String[] args) {
        int a = 10, b = 20;
        int com = (a > b) ? a : b;
        System.out.println("더 큰 숫자는 " + com + " 입니다.");

    }
}

-> 이 문제도 삼항 연산자를 배울 때 String 변수타입을 사용했기 때문에 int 를 사용하지 못했다. 하지만 int 자리에 String이 들어간 것만 빼면 나머지는 똑같이 작성했다! 새로운 것을 배우면 오류가 나더라도 이것저것 활용해 넣어봐야겠다.

 

7) 홀수 짝수 찾기 

 정수 x가 짝수이면 "짝수", 홀수이면 "홀수"를 출력하는 프로그램을 작성하세요. 삼항연산자를 사용하세요.

(힌트 : x % 2 를 사용하면 짝수 홀수를 쉽게 계산할 수 있습니다.)

public class EvenOddEx {

    public static void main(String[] args) {
        int x = 40;

        String result = ( x % 2 == 0 ) ? "짝수":"홀수";
        System.out.println(result);
    }
}

 

 

4. 조건문 총정리 

1) if문

- 특정 조건이 참인지 확인해 해당 코드 블록을 실행. 중괄호를 이용해 블록을 나누어줘야 한다.

- 독립된 각각의 if문을 활용해 여러 개의 조건을 만족해 출력해야 하는 코드를 작성할 수 있다.

- 참인 조건만 실행하지만 불필요한 다른 조건을 중복체크해 효율성이 떨어진다. 

 

2) else문

- if문에서 만족하는 조건이 없을 때 (거짓일 때) 실행되는 코드

- else문에서도 변수를 선언할 수 있다.

 

3) else if문 

- if문을 하나로 묶어 앞선 조건을 만족하지 않으면 if문 전체를 빠져나와 다음 조건을 검사한다. 

- 앞의 조건들을 체크하고 넘어가기 때문에 범위가 중복될 때 좀 더 간결하게 표현할 수 있다. ( 문제풀이 1,2 참고 ) 

 

4) switch문 ( 문제풀이 5 참고 ) 

- 특정 값에 따라 코드를 실행할 때 효과적이다. (어떠한 등급에 따라서 logic을 수행해야 할 때)

- 참 거짓의 결과가 나오는 조건이 아니라 조건식이 특정 case와 같은 지만 체크할 수 있다. (문자나 값이 같을 때만 수행됨)

- break문이 없으면 중단되지 않고 다음 조건의 코드를 실행하니 주의해야한다.

- 새로 변화된 switch 문에서는 -> 가 생겨 좀 더 간결해졌다. (문자열이 이용될 땐 break문이 편하다.)

- 선택된 데이터를 반환할 수 있다. 

 

5) 삼항 연산자 ( 문제풀이 6,7 참고)

- 조건에 따라 값이나 문자열을 대입하고 싶을 때 if문보다 깔끔하게 쓸 수 있다.

- 변수 = (조건) ? 값1 : 값2 → 조건이 참이면 값1, 거짓이면 값2가 선택된다. 

 

 

 

opinion

문제 풀이를 해보니 배운 것을 머릿속에서 가져올 때 속도가 매우 느리고 내가 봤던 형태가 아니면 다른 방식으로 바꾸지 못하는 것을 알았다. 다양한 예제를 풀어보면서 배운 것에 익숙해지고, 그걸 응용하고 적용하는 연습이 많이 필요할 것 같다.