ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3. 자바 조건문 (1) if-else
    자바(Java) 강의 2019. 3. 6. 14:45

     이번 포스트에서는 자바의 조건문 if-else에 대해서 이야기 해 보도록 한다.

    예상 독자

    목표

    • 조건문 ( Conditional Statement )
    • if{}
    • if{} else{}
    • if{} else if{} else{}
    • 연습하기

    조건문 ( Conditional Statement )

     프로그래밍 언어를 공부 할 때 하면 좋은 질문들이 몇 가지 있다. 그중 하나가 "이 문법은 왜 필요할까?"이다. 모든 자료형과 문법과 자료구조와 알고리즘은 인간이 해결하고자 하는 문제를 해결하도록 설계되어있다. 왜냐면 컴퓨터라는 것 자체가 인간 문제를 더 쉽게 풀기 위해 만들어낸 장치이기 때문이다. 조건문을 이용하면 조건에 따라서 어떤 코드를 실행시킬지 결정 할 수 있다. 이 문법은 왜 필요할까? 대부분의 비즈니스 로직이 '선택'을 기반으로 하기 때문이다. 생각 해 보자. 예를들어 로그인기능이라고 치자. 아이디와 비밀번호가 맞으면? 로그인한다. 이를 체계화 하면 아래와 같을 것이다.

    만약 ( 아이디와 비밀번호가 가입 당시의 아이디/비밀번호와 같다) 면 { 로그인한다. }

    이렇게 컴퓨터로 해결하고자 하는 비즈니스 요구사항 중에 조건에 따라 실행 해야하는 기능들이 많으므로 대부분의 고급언어는 조건문을 지원한다. 

    잠깐! 이번 포스트는 boolean과 논리식을 반드시 알아야 하므로 boolean과 boolean expression을 모른다면 2. 자바 변수와 자료형 (2) boolean를 반드시 선행하길 바란다.

    if{}

    위의 예를 다시 사용 해 보자. "만약 아이디와 비밀번호가 가입 당시의 아이디/비밀번호와 같다면, 로그인을 한다."를 코드로 써보면 아래와 같을 것이다.

    만약 ( 아이디와 비밀번호가 가입 당시의 아이디/비밀번호와 같다 )
    {
    로그인을 한다
    }

    이를 일반화 시키면 아래와 같을 것이다. 

    만약 ( 조건이 참이라 )
    {
    //이 부분을 실행하라.
    }

    이를 영어로 번역해보자.

    if ( condition ) {
    // execute this logic
    }

    자바의 조건문은 위와 같이. if ( 참 또는 거짓을 리턴하는 조건 ) { // 조건이 맞을 시 실행 할 로직 부분  }으로 구성된다. 즉 괄호 안의 조건이 참이면, 중괄호 내부를 실행하라라는 뜻이다. 이 때, 이 괄호안의 '조건'에 들어가는게 바로 boolean expression(논리식)이다. 중괄호는 바깥 부분의 로직과 if내부의 로직을 나누는 역할을 한다. 예를 들어 여러분이 아침 7시 전에 일어나면 아침을 먹고 운동을 한다고 치자.

    public class Main {
    public static void main(String[] args) {
    int time = 7;
    if( time <= 7 ) {
    System.out.println("아침먹고 운동하기.");
    }
    }
    } 실행 결과: 아침먹고 운동하기.

    위의 코드는 어떻게 동작하는가? 그렇다 time(기상시간)이 7보다 작거나 같으면 { } 중괄호 안의 System.out.println을 실행한다. 이번엔 time에 9을 넣어보자.

    public class Main {
    public static void main(String[] args) {
    int time = 9;
    if( time <= 7 ) {
    System.out.println("아침먹고 운동하기.");
    }
    }
    } 실행 결과:

    실행 해 보면 아무 것도 출력되지 않는 것을 확인 할 수 있다. 아래와 같은 코드를 실행 시켜보자.

    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("기상 시간: ");

    int time = scan.nextInt();
    if ( time <= 7 ) {
    System.out.println("아침먹고 운동하기.");
    }
    }
    } 실행 결과: 기상 시간: 7 아침먹고 운동하기.

    Scanner는 터미널 인풋을 받도록 도와주는 녀석인데, 지금은 그냥 복사/붙여넣기 해서 사용하면 된다. 이부분은 이후에 클래스에서 다시 설명하도록 하겠다. 실행 후 '기상 시간:' 이렇게 뜨면 여기에 원하는 값을 넣어 보자. 그리고 넣은 값에 따라 if문 내부가 실행되는지 안되는지 확인 해 보자.

    if{} else{}

    세상에 모든 비즈니스 로직이 if로 해결 가능하다면 얼마나 좋겠는가. 인간은 항상 '대안'을 마련한다. 예를들어 만약 아침 7시 전에 일어나면 아침먹고 운동한다. 그렇지 않으면 시리얼을 먹는다. 바로 이 대안을 'else'를 이용해 구현 할 수 있다.

    만약 ( 7시에 일어나 )
    {
    아침 밥을 먹자.
    }
    그게 아니면
    {
    시리얼을 먹자.
    }

    이를 일반화 하면 다음과 같을 것이다.


    만약 ( 조건이 참이 )
    {
    // 이 부분을 실행하라
    }
    그게 아니면
    {
    // 이 부분을 실행하라
    }

    자 얘를 이제 그대로 영어로 번역만 하면 자바 문법이 된다.

    if ( 조건이 참 ) {
    // execute this
    } else {
    // execute this
    }

    위에서 사용했던 time으로 한번 실습 해 보자.

    public class Main {
    public static void main(String[] args) {
    int time = 9;
    if( time <= 7 ) {
    System.out.println("아침먹고 운동하기.");
    } else {
    System.out.println("시리얼이라도 먹자..");
    }
    }
    } 실행 결과: 시리얼이라도 먹자..

    실행 해 보면 time이 7보다 크므로 else 부분의 중괄호 내부가 실행 되는 것을 확인 할 수 있다.

    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("기상 시간: ");

    int time = scan.nextInt();
    if( time <= 7 ) {
    System.out.println("아침먹고 운동하기.");
    } else {
    System.out.println("시리얼이라도 먹자..");
    }
    }
    } 실행 결과: 기상 시간: 11 시리얼이라도 먹자..

    마찬가지로 콘솔에서 인풋을 받아 실행시켜보자. 11을 넣었더니 else 부분이 실행되는 것을 확인 할 수 있다.

    if{} else if{} else{}

    if-else를 했지만 이 마저도 만족스럽지 않다! 나는 아침에 7시에 전에 일어나면 아침먹고 운동하고, 8시 전에 일어나면 시리얼먹고 운동하고, 그 이후에 일어나면 시리얼만 먹는다고 쳐보자. 이 로직을 if와 else로만 구현한다면 이렇게 될 것이다.

    if ( 7시 전에 일어난다면 ) {
    아침먹고 운동하기.
    } else {
    if ( 8시 전에 일어난다면 ) {
    시리얼 먹고 운동하기.
    } else {
    시리얼 먹기.
    }
    }

    딱 봐도 복잡하지 않는가? else 안에 또 if-else가 있는 구조이다. 이런 상황이 반복되니 else안에 또 if-else를 넣지 말고 else-if라는 녀석을 만들자! 라고 생각해 고안 해 낸 것이 else-if이다. else-if로 위를 구현하면 다음과 같을 것이다.

    if ( 7시 전에 일어난다면 ) {
    아침먹고 운동하기.
    } else if ( 8시 전에 일어난다면 ) {
    시리얼 먹고 운동하기.
    } else {
    시리얼 먹기.
    }

    엄청 깨끗한건 아니지만 적어도 이전의 예보다는 낫지 않은가? 이제 실제 코드로 실습을 해 보자.


    public class Main {
    public static void main(String[] args) {
    int time = 7;
    if ( time <= 7 ) {
    System.out.println("아침먹고 운동하기.");
    } else if (time <= 8) {
    System.out.println("시리얼 먹고 운동하기.");
    } else {
    System.out.println("시리얼이라도 먹자..");
    }
    }
    } 실행 결과: 아침먹고 운동하기.

    이제 time에 8을 넣고 실행 해 보라, 9를 넣고 실행 해 보라. 해당 조건에 맞는 코드 블록이 실행되는지 확인하라.

    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("기상 시간: ");
    int time = scan.nextInt();
    if ( time <= 7 ) {
    System.out.println("아침먹고 운동하기.");
    } else if ( time <= 8 ) {
    System.out.println("시리얼 먹고 운동하기.");
    } else {
    System.out.println("시리얼이라도 먹자..");
    }
    }
    } 실행 결과: 기상 시간: 8 시리얼 먹고 운동하기.

    이제 콘솔에서 인풋을 받아 실행 해 보자. 인풋으로 여러가지 값을 넣어 조건에 맞는 코드 블록이 실행되는지 확인하라. 

    else if는 꼭 하나여야 할 필요는 없다. 여러개의 else if를 추가적으로 넣을 수 있다. 아래를 보자.

    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("기상 시간: ");

    int time = scan.nextInt();
    if ( time <= 7 ) {
    System.out.println("아침먹고 운동하기.");
    } else if ( time <= 8 ) {
    System.out.println("시리얼 먹고 운동하기.");
    } else if ( time <= 9 ) {
    System.out.println("시리얼이라도 먹자..");
    } else {
    System.out.println("가는길에 뭐라도 사자..");
    }
    }
    }

    위 처럼 else-if는 꼭 하나여야 할 필요는 없다. 위 처럼 여러개의 else if를 구현 할 수 있다. 또 else를 원하지 않는다면 else를 뺄 수도 있다.

    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("기상 시간: ");

    int time = scan.nextInt();
    if ( time <= 7 ) {
    System.out.println("아침먹고 운동하기.");
    } else if ( time <= 8 ) {
    System.out.println("시리얼 먹고 운동하기.");
    } else if ( time <= 9 ) {
    System.out.println("시리얼이라도 먹자..");
    }
    }
    } 실행 결과: 기상 시간: 8 시리얼 먹고 운동하기.

    한 if문 에서 else-if와 else는 반드시 필요하지 않되 else-if는 여러개가 가능하고 else는 하나만 사용 가능하다. 위를 실행시켰다면 질문이 생겼을 것이다. 질문이 없다면 if, else if부분을 다시 자세히 보자. 무엇이 이상한가? 우리는 기상 시간에 8을 넣었고 결과로 '시리억 먹고 운동하기.'를 받았다. 이상하지 않은가? 8은 8보다 작거나 같지만 9보다도 작거나 같다! 왜 8 <= 9인데 '시리얼이라도 먹자..'는 실행되지 않았나??? 

    그것은 바로 if/ if else/ else 블록은 해당되는 블록 하나만 실행하고 나머지는 실행하지 않기 때문이다. 그렇다면 어느 블록을 실행 시킬지는 누가 결정하나? 그건 그냥 위에서 부터 아래로 검사하며 내려오다가 조건이 맞는부분이 있으면 실행하고 끝낸다라고 생각하면 된다. 예를들어 기상 시간에 8이 들어왔다. 첫번째 if문을 검사한다. 8은 7보다 작거나 같은가? 거짓이므로 다음 else if로 내려간다 8은 8보다 작거나 같은가? 그렇다. 그러므로 이 else if에 해당하는 블록인 "시리얼 먹고 운동하기."를 실행 시킨 후 나머지는 시도도 하지 않고 넘어가는 것이다. (그림 참조)

    연습하기

    이제 조건을 좀 더 복잡하게 해 보자. 기상 시간 뿐만 아니라 피로도까지 고려 해 보자. 피로도는 10을 기준으로 아침 7시 전에 일어나고, 피로도가 5 이하이면 아침먹고 운동을 하도록 하자 어떻게 짜야겠는가? 그렇다. 논리식에서 배웠던 &&를 이용해 짜면 된다. int타입의 피로도변수 int tiredness를 선언하고 값을 4로 설정 하고 실행 결과를 확인 해 보자.

    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("기상 시간: ");

    int time = scan.nextInt();
    int tiredness = 4;
    if ( (time <= 7) && (tiredness < 5) ) {
    System.out.println("아침먹고 운동하기.");
    }
    }
    } 기상 시간: 7 아침먹고 운동하기.

    아래의 논리식은 time <= 7이 참'이고' tiredness < 5도 참 이여야 if의 내부를 수행한다.

    (time <= 7) && (tiredness < 5)

    연습 문제 1 : 이제 else if와 else부분을 혼자 짜 보자. else if에서는 기상 시간(time)이 8 이하이고, 피로도(tiredness)가 3보다 크고 7보다 작거나 같을 때로 지정 해 보자. 예를들어 time이 6이고 tiredness가 6이면 else if부분이 실행 되어야 한다.

    연습 문제 2: yourHeight이라는 변수의 값을 인풋으로 받아와 여러분의 키보다 크면 "나보다 키가 크다.", 여러분의 키와 같으면 "나와 키가 같다.", 여러분의 키보다 작으면 "나보다 키가 작다."를 출력하는 프로그램을 작성해라.

    힌트: Scanner를 이용해 yourHeight변수 값을 인풋으로 받아오는 로직

    Scanner scan = new Scanner(System.in);
    System.out.print("너의 키: ");

    int yourHeight = scan.nextInt();

     원래 이 포스트에서 조건문 3개를 전부 같이 하려고 했는데 너무 길어질 것 같아 이 포스트에서는 if-else만 소개하도록 했다. 다음 포스트에서는 자바가 제공하는 또 다른 조건문인 switch case에 대해 알아보도록 한다.


    다음 포스트 : 3. 자바 조건문 (2) switch-case

    댓글

f.software engineer @ All Right Reserved