본문 바로가기

JAVA

[ 김영한의 자바 입문 ] 섹션 4. 조건문

 

이 포스트는 인프런 "김영한의 자바 입문" 섹션 4 강의를 바탕으로 작성하였습니다 :) 

https://inf.run/2zsZz

 

[지금 무료] 김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음 강의 - 인프런

프로그래밍에 처음 입문하는 분들을 위한 자바 강의입니다. 코드를 따라하면서 손쉽게 자바를 배울 수 있습니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 자바 입문[사진][임베

www.inflearn.com

 


 

01. if문1 - if,else

 

 

조건문은

특정 조건에 따라서 다른 코드를 실행하는 문장이다.

크게 if문과 switch문으로 나눌 수 있는데, 우선 if문부터 살펴보자.

 

 

If문은

특정 조건이 참인지 확인하고, 그 조건이 참(true)일 경우 특정 코드 블록을 실행한다.

if (condition) {
    // 조건이 침일 때 실행되는 코드
}

 

여기서 "코드 블록"이란

{ } (중괄호) 사이에 있는 코드를 의미한다.

 

 

# If1

package cond;

public class If1 {
    public static void main(String[] args) {
        int age = 20; //사용자 나이

        if (age >= 18) {
            System.out.println("성인입니다");
        }

        if (age < 18) {
            System.out.println("미성년자입니다");
        }
    }
}

 

성인입니다

 

age = 20 이기 때문에 처음 if문에서 참이 되어 이에 해당하는 코드 블록이 출력된다.

 

 

 

 

else문은

if문에서 만족하는 조건이 없을 때 실행되는 코드를 제공한다.

if (condition) {
    // 조건이 참일 때 실행되는 코드
} else {
    // 만족하는 조건이 없을 때 실행되는 코드
}

 

 

# If2

package cond;

public class If2 {
    public static void main(String[] args) {
        int age = 20;

        if (age >= 18) {
            System.out.println("성인입니다"); //참일 때 실행
        } else {
            System.out.println("미성년자입니다"); //만족하는 조건이 없을 때 실행
        }
    }
}

 

 

 

 

 

 

 

 

02. if문2 - else if

 

 

아래 코드와 같이 조건문에 무조건 if문만을 사용한다면 크게 2가지 문제점이 나타난다.

package cond;

public class If3_1 {
    public static void main (String[] args) {
        int age = 14 ;
        
        if(age <= 7) { //~7: 미취학
            System.out.println("미취학");
        }
        if(age >=8 && age <= 13) { //8~13: 초등학생
            System.out.println("초등학생");
        if(age >=14 && age <=16) { //14~16 : 중학생
            System.out.println("중학생");
        if(age >=17 && age <=19) { //17~19 : 고등학생
            System.out.println("고등학생");
        if(age >= 20) { //20~: 성인
            System.out.println("성인");
        }
    }
}

 

첫번째로, 불필요한 조건 검사를 해야한다.

이미 조건을 만족해도 불필요한 다음 조건을 계속 검사해야 한다.

 

 

두번째로, 코드의 효율성이 떨어진다.

" age = 14 " 로 선언한 age는 초등학생을 체크하는 조건인 if ( age >= 8 && age <= 13 ) 를 통해

이미 초등학생 이상이라는 사실을 알 수 있다.

그럼에도 불구하고 다음 줄에 있는 age >= 14 라는 줄은 이미 앞의 age <=13 이라는 조건과 관련이 있기에,

결과적으로 조건을 중복 체크한 것이 된다. 

 

 

 

 

 

이런 if만을 사용한 코드에 else if 를 사용하면

불필요한 조건 검사를 피하고 코드의 효율성을 향상시킬 수 있다.

 

 

else if 문은

if문의 조건이 거짓일 때 다음 조건을 검사하는 문장이다.

앞선 if문이 참이라면 else if 를 실행하지 않는다.

if (condition1) {
    // 조건 1이 참일 때 실행되는 코드
} else if (condition2) {
    // 조건 1이 거짓이고, 조건2가 참일 때 실행되는 코드
} else if (condition3) {
    // 조건2가 거짓이고, 조건3이 참일 때 실행되는 코드
} else {
    // 모든 조건이 거짓일 때 실행되는 코드
}

 

 

# If3

package cond;

public class If3 {
    public static void main(String[] args) {
        int age = 23;

        if (age <= 7) {
            System.out.println("미취학");
        } else if (8 <= age && age <= 13) {
            System.out.println("초등학생");
        } else if (14 <= age && age <= 16) {
            System.out.println("중학생");
        } else if (17 <= age && age <= 19) {
            System.out.println("고등학생");
        } else {
            System.out.println("성인");
        }
    }
}

 

특정 조건이 만족하면 해당 코드를 실행하고 if문 전체를 빠져나온다.

특정 조건을 만족하지 않으면 다음 조건을 검사한다.

 

순서대로 맞는 조건을 찾아보고,

맞는 조건이 있으면 딱 1개만 실행이 된다.

 

 

 

 

 

03. if문3 - if문과 else if문 

 

if문에 else if를 함께 사용하는 것은 "서로 연관된 조건"일 때 사용한다.

 

하지만 서로 관련이 없는 독립 조건이면,

아래와 같이 else if를 사용하지 않고 if문을 각각 따로 사용해야 한다.

if (condition1) {
    // 작업1 수행
}
if (condition2) {
    // 작업2 수행
}

 

예시의 조건들은 둘 중 하나만 수행되는 것이 아니라, 조건이 맞다면 둘다 수행될 수 있다.

 

 

 

# If5

package cond;

public class If5 {
    public static void main(String[] args) {
        int price = 10000;
        int discount = 1000;
        int age = 23;

        if (price >= 10000) {
            price = price - discount;
            System.out.println("10000원 이상 구매, 1000원 할인");
        }

        if (age <= 10) {
            price = price - discount;
            System.out.println("나이 10살 이하, 1000원 할인");
        }
    }

}

// 위에 적은 건 내 코드지만, 강의랑 다름.
// 참고해서 다시 적기.. 강의는 할인에 증감을 적용해서 총 금액을 프린트 하게끔  해둠

 

문제에서는 할인받은 금액이 얼마만큼인지를 출력하는 것을 요구했지만,,

나는 할인받아서 총 계산해야 할 돈이 얼마인지를 출력하는 코드를 짰다.

 

package cond;

public class If5_1 {
    public static void main(String[] args){
        int price = 10000; // 아이템 가격
        int age = 10; // 나이
        int discount = 0;
        
        if (price >= 10000){
            discount = discount + 10000;
            System.out.println("10000원 이상 구매, 1000원 할인");
        }
        if (age <= 10){
            discount = discount + 1000;
            System.out.println("어린이 1000원 할인");
        }
        System.out.println("총 할인 금액: " + discount + "원");
    }
}

 

코드를 수정하면 다음과 같다.

가격과 나이에 대한 할인은 연관되어 있지 않기 때문에 독립된 if문으로 조건을 나열한다.

조건이 맞다면 둘 다 실행될 수도 있는 것이다.

 

만약 이 문제에서 else if를 썼다면,

첫 번로 충족하는 조건만 할인이 되고 나머지는 무시된다.

따라서 사용자는 나머지 할인을 놓칠 수 있는 것이다.

 

 

# If6

package cond;

public class If6 {
    public static void main(String[] args) {
        int price = 10000;
        int age = 23;
        int discount = 0;

        if (price >= 10000) {
            discount = discount + 1000;
            System.out.println("10000원 이상 구매, 1000원 할인");
        } else if (age <= 10) {
            discount = discount + 1000;
            System.out.println("어린이 1000원 할인");
        } else {
            System.out.println("할인 없음");
        }
    }
}

// else if와 if의 조건이 둘다 충족이 되는 조건식이더라도, 한번 실행되면 반복문 걍 나옴
// if에 한 번 걸리면 자동적으로 나오게 되어있기에 둘다 중복 반복에서는 적용 x


// if문 안에 조건식을 코드 블럭 없이 2개를 사용한다면 첫 조건식만 if절 안에서 돌아가는 것
// 밑에 있는 조건식은 if절에서 돌아가는 것이 아닌 별개로 작동

//if(true)
//    System.out.println("if문에서 실행됨");
//    System.out.println("if문에서 실행안됨");

// 예시로 들었듯 if문에서 실행안됨을 나타내는 sout은 if절에서 돌아가는 것이 아님

 

 

위 else if 사용 설명에 대한 예시가 바로 If6 코드 내용이다.

 

정리하자면

if문을 각각 사용할지, if와 else if를 함께 묶어서 사용할지는 요구사항에 따라 다르다.

이 차이를 이해하고 적절히 사용하는 것이 중요하다.

 

 

 

 

 

 

04. switch문

 

switch문은 if문을 조금 더 편리하게 사용할 수 있는 기능이다.

 

다만 if문과의 차이점이 있다면,

if문은 비교 연산자를 사용할 수 있지만, switch문은 단순히 값이 같은지만 비교할 수 있다.

 

 

switch문의 기본형은 다음과 같다.

switch (조건식) {
    case value1:
        //조건식의 결과값이 value1일때 실행되는 코드
        break;
    case value2:
        //조건식의 결과값이 value2일때 실행되는 코드
        break;
    default:
        //조건식의 결과값이 위의 어떤 값에도 해당하지 않을 때 실행되는 코드
    }

 

 

# Switch1

package cond;

public class Switch1 {
    public static void main(String[] args) {
        int grade = 2;
        int coupon;
        if (grade == 1) {
            coupon = 2000;
        } else if (grade == 2) {
            coupon = 3000;
        } else {
            coupon = 500;
        }
        System.out.println("발급받을 쿠폰"+ coupon);
    }
}

 

 

 

 

# Switch2

package cond;

public class Switch2 {
    public static void main(String[] args) {
        int grade = 2;
        int coupon;
        switch (grade) {
            case 1:
                coupon = 1000;
                break;
            case 2:
                coupon = 2000;
                break;
            case 3:
                coupon = 3000;
                break;
            default:
                coupon = 500;
        }
        System.out.println("발급받은 쿠폰"+coupon);
    }
}

// if문은 비교 연산자를 사용할 수 있지만,
// switch문은 단순히 값이 같은지만 비교할 수 있음

 

조건식 grade의 결과값이 어떤 case의 값과 일치하면 해당 case의 코드를 실행한다.

즉 grade == 1일 경우, coupon=1000;이 실행된다는 뜻이다.

 

그리고 default는 조건식의 결과값이 모든 case의 값과 일치하지 않을 때 실행된다.

if문의 else와 같으며, 이 default 구문은 선택사항이다.

 

 

# Switch3

package cond;

public class Switch3 {
    public static void main(String[] args) {
        int grade = 2;
        int coupon;
        switch (grade) {
            case 1:
                coupon = 1000;
                break;
            case 2:

            case 3:
                coupon = 3000;
                break;
            default:
                coupon = 500;
                break;
        }
        System.out.println("발급받은 쿠폰" + coupon);
    }

}

// case에 해당되는 조건문? 조건값을 한 줄 안 넣으면,
// 밑에 있는 조건문이 자동적으로 실행된다

// 강의 7분 48초 쯤부터 설명 참고해서 복기할것

 

위 예제와 같이 break문이 없을 경우에는

그 문장 아래에 있는 조건문이 자동적으로 실행된다.

 

case 2:의 경우 break;가 존재하지 않기 때문에 case 3:으로 내려가 조건문이 실행된다.

따라서 이 예제는 '발급받은 쿠폰 3000'이 출력된다.

 

 

# Switch4

package cond;

public class Switch4 {
    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);
    }
}

 

자바 14부터는 새로운 switch문이 도입되었다.

기존 switch문과는

* -> 를 사용
* 선택된 데이터를 반환할 수 있음

 

이라는 차이점이 존재한다.

 

 

 

 

 

 

05. 삼항 연산자

 

 

# CondOp1

package cond;

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


// 근데 파이썬에서 변수 선언할 때는 무조건 0이라도 넣어야 했던거 아닌가?

 

위 예제는 age 조건에 따라 status라는 변수에 문자열 값이 정의되는 코드이다.

자바는 변수를 선언할 때 초기화를 하지 않아도 String status; 라고 변수 선수할 수 있다.

문득 파이썬에서의 변수 초기값 선언이 방식이 헷갈렸는데, 이에 대해 gpt에 물어보았다.

 

 

 

 

파이썬에서의 변수 선언을 정리해보자면 다음과 같다.

   * 파이썬은 자동으로 변수의 데이터 형식을 결정한다.
   * 초기값을 지정하지 않고도 status=" "와 같이 변수를 선언할 수 있다.

 

 

필자가 까먹고 있었던 부분은 초기값 설정을 따옴표로 할 수 있다는 부분이다..

ChatGPT에게 이렇게 도움을 받았다 ..ㅎ

 

https://chat.openai.com/share/3615cf2d-bf43-436d-abe1-9ef3f13babbc

 

ChatGPT

A conversational AI system that listens, learns, and challenges

chat.openai.com

 

 

 

# CondOp2

package cond;

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

    }


// 이거는 switch문 최신 버전 느낌이랑 방법이 비슷한듯?
// 삼항연산자로 칭하는 이유는 항이 3개라서
// 1.age>=18
// 2.성인
// 3.미성년자

// 4분 11초 내용 정리

 

 

 

06. 문제와 풀이 1

 

 

# ScoreEx

package cond.ex;

public class ScoreEx {
    public static void main(String[] args) {
        int score = 85;
        String grade="0";

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


// 지피티한테 물어봤던거 같이 첨부해서 오답 정리할 것

 

String 문자열에 대한 내용 기입할 것 

https://chat.openai.com/share/424ccf4a-6748-4b0d-989e-e1a585352626

 

ChatGPT

A conversational AI system that listens, learns, and challenges

chat.openai.com

 

 

 

 

# DistanceEx

package cond.ex;

public class DistanceEx {
    public static void main(String[] args) {
        int distance = 100;
        String transform="0";

        if (distance <= 1) {
            transform = "도보";
        } else if (distance <= 10) {
            transform = "자전거";
        } else if (distance <= 100) {
            transform = "자동차";
        } else {
            transform = "비행기";
        }
        System.out.println(distance);
        System.out.println(transform+"를 이용하세요.");
    }
}

 

String 문자열 변수 사용할 때 한 번 더 신경쓰게 되었다는 ..

 

 

 

 

 

# ExchangeRateEx

package cond.ex;

public class ExchangeRateEx {
    public static void main(String[] args) {
        int dollar = 10;
        int won = 1300;

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


//0이 int에 속하지 않는다는 것을 생각 못하고 0을 기준으로 3가지 식을 만들었음
// dollar=0을 else if 말고도 표현할 방법이 있다는 것을 생각하지 못했음


// 아 .. 아니다... dollar=0은 변수 선언이 되는 표현이다..
// dollar==0 표현이 맞는 표현임을 .... 멍청했다....

// 복기할 때 정답 코드 5분 53초랑 비교해서 둘다 함께 첨부할 것

 

 

 

 

07. 문제와 풀이 2

 

 

# MovieRateEx

package cond.ex;

public class MovieRateEx {
    public static void main(String[] args) {
        double rating = 7.2;

        if (rating <= 7) {
            System.out.println("'어바웃타임'을 추천합니다.");
            System.out.println("'토이 스토리'를 추천합니다.");
            System.out.println("'고질라'를 추천합니다.");
        } else if (rating <= 8) {
            System.out.println("'어바웃타임'을 추천합니다.");
            System.out.println("'토이 스토리'를 추천합니다.");
        } else if (rating <= 9) {
            System.out.println("'어바웃타임'을 추천합니다.");
        }
    }
}


// 파이썬처럼 입력 변수를 받을 때 사용하는 input 기능이 없는걸까?

// 이런 케이스가 중복을 이용한거니까 중복 if문을 사용해야하는군...
// else if 사용이 효율적이지 않은 경우가 이 경우네..

 

 

 

# GradeSwitchEx

package cond.ex;

public class GradeSwitchEx {
    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("잘못된 학점입니다.");

        }
    }
}

 

 

 

# CondOpEx

package cond.ex;

public class CondOpEx {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        int max = (a > b) ? a : b;
        System.out.println("더 큰 숫자는 "+max+"입니다.");
    }
}

 

 

# EvenOddEx

package cond.ex;

public class EvenOddEx {
    public static void main(String[] args) {
        int x = 5;

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