Java

조건문

'비교 수업'에서 비교 연산의 결과로 참(true)이나 거짓(false)을 얻을 수 있다고 배웠다. 불린은 조건문에서 핵심적인 역할을 담당하는데 이 불린 값을 기준으로 실행 흐름을 제어하기 때문이다.

조건문

조건문이란 주어진 조건에 따라서 애플리케이션을 다르게 동작하도록 하는 것으로 프로그래밍의 핵심 중의 하나라고 할 수 있다.

조건문의 문법

프로그래밍에서 문(文, Statements)은 문법적인 완결성을 가진 하나의 완제품이라고 할 수 있다. if문, for문, while문등이 여기에 해당한다. 절(節마디절, clause)은 문(statements)를 구성하고 있는 부품이라고 할 수 있다. 곧 배우게 된다. 물론 이러한 문법적인 개념은 이해를 돕기 위한 것일 뿐 암기해야 할 것은 전혀 아니다.

if

조건문은 if로 시작한다. 아래 그림을 보자. if 뒤의 괄호를 if절이라고 부르고, 중괄호가 감싸고 있는 구간을 then 절이라고 부르겠다. 조건문에서는 if 절의 값이 true일 때 then 절이 실행된다. if 절이 false이면 then 절은 실행되지 않는다.

아래 예제의 실행결과는 'result : true'다. if 뒤에 True가 왔기 때문이다. 아래의 실행 결과는 화면에 result : true를 출력한다. (실행)

package org.opentutorials.javatutorials.condition;

public class Condition1Demo {

    public static void main(String[] args) {
		if(true){
			System.out.println("result : true");
		}
	}

}

다음 예제는 아무것도 출력하지 않을 것이다. if절이 false이기 때문이다.

if(false){
	System.out.println("result : true");
}   

다음 예제를 보자. 결과는 12345를 출력할 것이다. (실행)

package org.opentutorials.javatutorials.condition;

public class Condition2Demo {

    public static void main(String[] args) {
		if (true) {
			System.out.println(1);
			System.out.println(2);
			System.out.println(3);
			System.out.println(4);
		}
		System.out.println(5);
	}

}

다음 예제를 실행해보자. 결과는 5만 출력될 것이다. (실행)

if(false){
	System.out.println(1);
	System.out.println(2);
	System.out.println(3);
	System.out.println(4);
}
System.out.println(5);

else

if만으로는 좀 더 복잡한 상황을 처리하는데 부족하다. 아래의 그림처럼 if-else절은 if 절의 값이 true일 때 then절이 실행되고, false일 때 else절이 실행된다.

아래 예제를 보자. 결과는 1이다. (실행)

package org.opentutorials.javatutorials.condition;

public class Condition3Demo {

    public static void main(String[] args) {
		if (true) {
			System.out.println(1);
		} else {
			System.out.println(2);
		}

	}

}

다음 예제의 결과는 2다. (실행)

if(false){
	System.out.println(1);
} else {
	System.out.println(2);
}

else if

else if절을 이용하면 조건문의 흐름을 좀 더 자유롭게 제어할 수 있다. if절의 값이 true라면 then절이 실행된다. false라면 else if절로 제어가 넘어간다. else if절의 값이 true라면 else if then절이 실행된다. false라면 else 절이 실행된다. else if절은 여러 개가 복수로 등장할 수 있고, else절은 생략이 가능하다. else 절이 else if 절보다 먼저 등장할 수는 없다.

아래 예제를 보자. 결과는 2다. (실행)

package org.opentutorials.javatutorials.condition;

public class ElseDemo {

    public static void main(String[] args) {
		if (false) {
			System.out.println(1);
		} else if (true) {
			System.out.println(2);
		} else if (true) {
			System.out.println(3);
		} else {
			System.out.println(4);
		}

	}

}

다음 예제의 결과는 3이다. (실행)

if(false){
	System.out.println(1);
} else if(false) {
	System.out.println(2);
} else if(true) {
	System.out.println(3);
} else {
	System.out.println(4);
}

다음 예제의 결과는 4다. (실행)

if(false){
	System.out.println(1);
} else if(false) {
	System.out.println(2);
} else if(false) {
	System.out.println(3);
} else {
	System.out.println(4);
}

변수와 비교연산자 그리고 조건문

지금까지 배운 부품들을 결합해서 작은 프로그램을 만들어보자. 예제에서 사용할 부품은 변수, 비교연산자, 조건문이다. 사용자가 입력한 아이디 값을 체크하는 프로그램을 만들어 볼 것이다. ID의 값으로 egoing을 입력해보고, 다른 값도 입력해보자. 

package org.opentutorials.javatutorials.condition;

public class LoginDemo {
    public static void main(String[] args) {
    	String id = args[0];
		if(id.equals("egoing")){
			System.out.println("right");
		} else {
			System.out.println("wrong");
		}
	}
}

위의 프로그램을 실행하기 위해서는 조금 새로운 방법을 사용해야 한다. 파일을 컴파일한 후에 실행할 때 아래와 같이 입력한다.

java LoginDemo egoing

egoing은 Java 앱인 LoginDemo의 입력 값이다. 이 값은 프로그램 내부로 전달된다. 그럼 프로그램에서 이 값을 알아내는 구문은 아래와 같다.

String id = args[0];

우린 아직 배열을 배우지 않았다. 따라서 위의 코드가 무엇인지 정확하게 설명하는 것은 지금 단계에서는 불필요하다. args[0]가 첫 번째 입력 값(egoing)을 의미한다고만 이해하자. 위의 코드는 입력 값을 문자열 타입의 변수 id에 담고 있다.

사용자가 입력한 데이터가 egoing과 같은지 비교할 때는 아래와 같이 id.equals("egoing")이라는 구문을 사용한다. equal은 같다는 의미다. 즉 사용자가 입력한 값(id)가 "egoing"인지를 확인하는 것이다. 그 결과가 true라면 right가 출력되고, false라면 wrong가 출력될 것이다.

if(id.equals("egoing")){

조건문의 중첩

위의 예제에서 아이디와 비밀번호를 모두 검증해야 한다면 어떻게 하면 될까? 다음 예제를 보자.

package org.opentutorials.javatutorials.condition;

public class LoginDemo2 {
    public static void main(String[] args) {
		String id = args[0];
		String password = args[1];
		if (id.equals("egoing")) {
			if (password.equals("111111")) {
				System.out.println("right");
			} else {
				System.out.println("wrong");
			}

		} else {
			System.out.println("wrong");
		}
	}
}

이 예제는 입력 값을 두 개 받는다. id와 password를 프로그램 내부로 전달하려면 프로그램을 실행할 때 아래와 같이 차례대로 아이디와 비밀번호를 입력하면 된다.

java LoginDemo2 egoing 111111

if문 안에 다시 if문이 등장했다. 즉 사용자가 입력한 값과 아이디의 값이 일치하는지를 확인한 후에 일치한다면 비밀번호가 일치하는지 확인한 것이다. 이렇게 조건문은 조건문 안에 중첩적으로 사용될 수 있다.

switch 문

조건문의 대표적인 문법은 if문이다. 사용빈도는 적지만 조건이 많다면 switch문이 로직을 보다 명료하게 보여줄 수 있다. 아래의 코드를 보자.

package org.opentutorials.javatutorials.condition;

public class SwitchDemo {

    public static void main(String[] args) {
		
		System.out.println("switch(1)");
		switch(1){
		case 1:
			System.out.println("one");
		case 2:
			System.out.println("two");
		case 3:
			System.out.println("three");
		}
		
		System.out.println("switch(2)");
		switch(2){
		case 1:
			System.out.println("one");
		case 2:
			System.out.println("two");
		case 3:
			System.out.println("three");
		}
		
		System.out.println("switch(3)");
		switch(3){
		case 1:
			System.out.println("one");
		case 2:
			System.out.println("two");
		case 3:
			System.out.println("three");
		}

	}

}

결과는 아래와 같다.

switch(1)
one
two
three
switch(2)
two
three
switch(3)
three

즉 switch 뒤의 괄호에 숫자로 1이 주어지면 case 1에 해당하는 로직 이후의 모든 case들이 실행된다.

아래와 같이 코드를 바꿔보자.

package org.opentutorials.javatutorials.condition;

public class SwitchDemo {

    public static void main(String[] args) {
		
		System.out.println("switch(1)");
		switch(1){
		case 1:
			System.out.println("one");
			break;
		case 2:
			System.out.println("two");
			break;
		case 3:
			System.out.println("three");
			break;
		}
		
		System.out.println("switch(2)");
		switch(2){
		case 1:
			System.out.println("one");
			break;
		case 2:
			System.out.println("two");
			break;
		case 3:
			System.out.println("three");
			break;
		}
		
		System.out.println("switch(3)");
		switch(3){
		case 1:
			System.out.println("one");
			break;
		case 2:
			System.out.println("two");
			break;
		case 3:
			System.out.println("three");
			break;
		}

	}

}

결과는 다음과 같다.

switch(1)
one
switch(2)
two
switch(3)
three

break를 만나면 switch 문의 실행이 즉시 중지된다. 따라서 위의 코드는 아래와 같이 if문으로 변경 할 수 있다.

package org.opentutorials.javatutorials.condition;

public class SwitchDemo2 {

    public static void main(String[] args) {
		
		int val = 1;
		if(val == 1){
			System.out.println("one");
		} else if(val == 2){
			System.out.println("two");
		} else if(val == 2){
			System.out.println("three");
		}

	}

}

 즉 if문과 switch문은 서로 대체 가능한 관계다. 이번에는 default를 알아보자.

package org.opentutorials.javatutorials.condition;

public class SwitchDemo {

    public static void main(String[] args) {
		
		System.out.println("switch(1)");
		switch(1){
		case 1:
			System.out.println("one");
			break;
		case 2:
			System.out.println("two");
			break;
		case 3:
			System.out.println("three");
			break;
		default:
			System.out.println("default");
			break;
		}
		
		System.out.println("switch(2)");
		switch(2){
		case 1:
			System.out.println("one");
			break;
		case 2:
			System.out.println("two");
			break;
		case 3:
			System.out.println("three");
			break;
		default:
			System.out.println("default");
			break;
		}
		
		System.out.println("switch(3)");
		switch(3){
		case 1:
			System.out.println("one");
			break;
		case 2:
			System.out.println("two");
			break;
		case 3:
			System.out.println("three");
			break;
		default:
			System.out.println("default");
			break;
		}
		
		System.out.println("switch(4)");
		switch(4){
		case 1:
			System.out.println("one");
			break;
		case 2:
			System.out.println("two");
			break;
		case 3:
			System.out.println("three");
			break;
		default:
			System.out.println("default");
			break;
		}

	}

}

위의 코드는 각 switch 문에 default:가 이끄는 구문을 추가했다. 그 결과는 아래와 같다.

switch(1)
one
switch(2)
two
switch(3)
three
switch(4)
default

가장 마지막은 default로 끝난다. 즉 주어진 케이스가 없는 경우 default 문이 실행된다는 것을 알 수 있다. 

switch 문을 사용할 때 한가지 주의 할 것은 switch의 조건으로는 몇가지 제한된 데이터 타입만을 사용할 수 있다. byte, short, char, int, enum, String, Character, Byte, Short, Integer

이렇게 해서 제대로 된 프로그램의 꼴을 갖춘 것을 한번 만들어봤다. 조건문까지 왔다면 고지가 얼마 남지 않았다. 조금만 힘내자.

Designed by factor[e] design initiative

댓글

댓글 본문
작성자
비밀번호
  1. doevery
    수강완료
  2. 다나가
    190816 - 수강완료!!!
  3. wulcak
    2019-08-16
  4. 김혜민
    if / if else / switch 를 어떻게 사용하는지 (문법) 숙지하세요.
    switch문에 break;가 생략되면 무슨 일이 벌어지는 숙지하세요.


    if else 가 많은경우 높은 확율로 true가 나올 조건을 먼저 선언해주세요.
    if문과 switch문 중에서 어떤걸로 사용해야 제어문을 잘 쓸수 있는지는 본인의 호불호 차이 입니다. 조건문이라고 꼭 if문만 쓸 필요는 없습니다.

    좋은 강의 감사합니다.
  5. 아롱범
    인자 전달 때문에 명령 프롬프트로 실행하실 경우 기본 클래스를 찾거나 로드할 수 없다는 에러를 보신 분들이 계시다면, 해당 파일이 있는 디렉토리가 아닌 패키지 최상단인 bin 디렉토리에서 해당 파일을 실행시키셔야 합니다. 파이썬 공부하다 자바로 넘어왔는데 저도 한참을 고민했네요 ㅋㅋㅋㅋ 부끄럽습니다 ㅠㅠ
  6. Hyeon-Jun Ha
    완료
  7. 얼그레이
    감사합니다 :) 190630
  8. 6/17시작
    6/18 완료
  9. 이현정
    학습완료했습니다. :)
  10. 쫑마늘
    영상의 콘솔창을 봤을 때 맨 처음에 switch(1) 이라고 나오는 걸 보니 그냥 콘솔창에서 구분하기 위해 넣으신 것 같습니다.
    대화보기
    • 강인덕
      그냥 해당 코딩에 대한 제목을 나타내기위함 같은데요?
      대화보기
      • 목단비국화차
        질문 있습니다.
        switch문 실행 때는 if 문과 다르게
        System.out.println("switch(1)")를 선행해서 실행하시는 이유가 있나요?

        혹시 몰라 위 문장 없이 실행해봤는데
        문제 없이 실행이 되어서요.

        package org.opentutorials.javatutorials.condition;

        public class SwitchDemo {

        public static void main(String[] args) {

        switch(1){
        case 1 :
        System.out.println("one");
        case 2 :
        System.out.println("two");
        case 3 :
        System.out.println("three");
        }
        }

        }
        //result :
        one
        two
        three

        아시는 분 계시면 답변 부탁 드립니다!
        (추측하건데, 단순히 switch (1), (2), (3), (4)간의 결과 값에 구분을 두기 위해 사용한 것이고, 그 이상의 의미는 없을 것 같은데 혹시나 해서 질문 남깁니다)
      • 목단비국화차
        완료
      • 김동현
        감사합니다
      • silver94
        강의 정말 감사합니다
      • 가쥬앙
        감사합니당
        대화보기
        • 라또마니
          감사합니다. 조심히 따라가고 있어요!
        • 떵언이
          Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
          뜨시는 분들은 이 강의의 입력과 출력 동영상에서 cmd 를 이용하는 방법을
          참고하시면 됩니다.

          저 배열의 초기값이 0으로 설정되어있어서 컴파일링 오류가 나는거니까
          실행하실때 배열에 입력을 해주셔야 오류가 안나요
        • 호두
          감사합니다.
        • j-graphy
          2019. 2. 1. 학습 완료
        • 입력값(인풋)을 필요로 하는 문법인데 인풋이 없어서 아웃풋이 나오지 않는 겁니다. 동영상 중에 입력값을 넣는 방법에 대해서 잠깐 지나가듯 표현된 게 있었는데 동영상 위주로 보셔야 해요
          대화보기
          • sw1999
            명령 프롬프트 하실 때 LoginDemo 파일을 저장한 곳을 찾아가서 위에 주소를 cmd에 복사 붙여넣기 하시고 하면 될거에요. cd \복사한주소
          • 5vertime
            감사합니다 덕분에 cmd도 해봤어여 ㅋㅋㅋ
            대화보기
            • 왕 짜중 독고머리...
              명령 프롬프트...좀더 자세한 설명이 필요.
              대화보기
              • 뜨거운 감자
                me too.
                대화보기
                • 전민희
                  2018.10.01 완료!
                  * true, false = Boolean
                  Boolean은 조건문에서 핵심적인 역할
                  - if else 절에서 if가 true일 경우 if절이 실행되고 false일 경우 else가 실행된다.

                  - else if 여러개의 조건이 올 수 있다. true가 한번이라도 발견되면 그 이후의 true는 실행되지 않는다.
                  else는 생략가능.

                  - if문 안에는 또 다른 if문이 들어갈 수 있다.
                • ?
                  대화보기
                  • !
                    대화보기
                    • 1.050845004488096
                      c언어에서 args[0]은 자기 자신
                    • 고구마원숭이
                      9월 16일 일요일
                    • Daydream
                      IDEO 에서 실행하고
                      프로그램 링크를 공유하면 좀더 자세한 진단이 가능할것 같습니다.
                      대화보기
                      • Daydream
                        무엇?
                        대화보기
                        • Daydream
                          감사합니다 오늘도 화이팅 20180910
                        • 최준영
                          what.the.funny.man;

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

                          if("개증".equals("죠크")){
                          System.out.println("어색함의극치");
                          } else {
                          System.out.println("무엇?");
                          }
                          }
                          }
                        • 백선우
                          20180829 수요일 와아아안료~
                        • 이지선
                          2018.08.29 완료~
                        • 진영
                          8/11완료
                        • 감자감자
                          완료
                        • 완료
                        • 제이z
                          강의에서 나오는거랑 똑같이 했는데 계속

                          Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
                          at secondproject/condition.LoginDemo2.main(LoginDemo2.java:7)

                          이런게 떠요.. 도와주세요.. 헬미.. 헬미.. 솜보디 헬미..
                        • 심원준
                          위 강의 보고 실행창에 프로그램 실행해보려고하는데
                          bin디렉토리까지 이동해서 java condition.LoginDemo 실행하는데
                          오류: 기본 클래스 condition.LoginDemo을(를) 찾거나 로드할 수 없습니다.
                          원인: java.lang.ClassNotFoundException: condition.LoginDemo
                          이렇게 뜹니다.
                          실제로 경로대로 이동해보면 LoginDemo.class파일이 있는데 실행이 안되는 이유가 뭘까요? ㅜㅠ
                        • 전민희
                          완료
                        • 멀캠A_Son
                          완료
                        • 이태호
                          6/27
                        • June-young
                          저처럼 조건문 응용 강의보고 한번 명령 프롬프트로 실행해보시려는 분들 중에 강의처럼 디렉토리 설정하는 방법을 모르시는 분들이 혹시라도 계실까봐 댓글로 남겨요!(제 기억으로는 이클립스 ,java 설치하는 강의에서 나왔던 내용인것 같지만.. ㅎㅎ)
                          명령 프롬프트에서 디렉토리 변경하려면 cd+공백+원하는디렉토리 를 입력하면 다음 줄부터는 원하는 디렉토리로 설정되더라고요! 제 경우엔 명령프롬프트를 실행하면
                          C:\Users\hefor> 이렇게 나오는데
                          C:\Users\hefor>cd C:\생활코딩\실습\java_tutorials\bin 으로 입력하니 다음줄 부터
                          C:\생활코딩\실습\java_tutorials\bin> 이렇게 나왔고 그래서 강의대로 입력할 수 있었습니다!
                          (물론 강의에서는 java 파일 저장 위치가 F드라이브로 다르지만 다들 보통 C로 되어있을테니까)
                          C:\Users\hefor>cd C:\생활코딩\실습\java_tutorials\bin>java org.opentutorials.condition.LoginDemo egoing 이렇게 했더니 강의처럼 결과물이 나오더라구요

                          수정사항 있으면 답글 남겨주세요~
                        • ozic
                          감사합니다
                        • Ra Yo
                          감사합니다
                        • 4월 25일 조건문
                        • 송영일
                          2018년04월24일
                        • 박현모
                          감사합니다~
                        버전 관리
                        egoing
                        현재 버전
                        선택 버전
                        graphittie 자세히 보기