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. DkHeadsj
    감사합니다.
  2. GoldPenguin
    감사합니다.
  3. Eric
    Java에서는 if문의 패러미터가 상수일수는 없나봐요?
    C에서는 if (1) { printf("true\n"); } 하면 출력이 되는데요..
  4. 정문경
    잘봤습니당
  5. num09
    2017/11/22
  6. zugi
    완료.!
  7. 11월 6일



  8. 쎄쌀
    그렇네요 다시 보니 첫 번째 else if로 넘어 간뒤에 거기서 끝나는군요
    대화보기
    • 초보
      오타 맞는거 같아요. 근데 if else 문이라 val=2 일때는 먼저 System.out.println("two"); 가 실행되고 다음 else if 로 넘어 가지 않습니다. 따라서 two three 둘다 출력이 되지 않고 two 만 출력됩니다.
      대화보기
      • 쎄쌀
        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");
        }

        여기서 마지막 else if(val ==3){ 이게 되어야 three를 출력하지 않나요? 저 코드 그대로 있으면 2만 들어가면 two three 다 출력될 거 같은데요 ?^^
      • ywChoi
        감사합니다!
      • yoon88
        완료
      • 가나다
        댓글에 입력하신 코드상에서
        첫 번째 wrong을 "잘못된 비밀번호입니다"
        두 번째 wrong을 "잘못된 아이디입니다" 라고 하시면 됩니다.

        else를 두번 쓴 이유는, if가 두번이기 때문입니다.

        외부의 id를 체크 할 때의 else, 그리고 내부의 password를 체크할 때의 else 로 두번이지요.
        도움이 되셨길 바랍니다. :)
        대화보기
        • 정은비
          아래의 예문을 아이디를 잘못입력했을때는 "잘못된 아이디입니다", 비밀번호를 잘못입력했을때는"잘못된 비밀번호입니다" 라는 값을 출력할수 있게 만들고 싶은데 이때는 else if로 어떻게 코딩해야 하나요??
          else if를 사용하는게 맞는지요???

          + else는 한번만 사용가능하다고 했는데, 아래는 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");
          }
          }
          }
        • 박찬울
          switch 문에서 사용 가능한 데이터 타입 중에서 'enum'은 'Enum' 으로 표현하지 않더라도 문제가 없는 것일지 궁금합니다.
        • 우럭이
          우럭이는맛있어 ㅗㅗㅗㅗ
        • Jung SuHyun
          수강 완료했습니다. 감사합니다.
        • 미림_likelion
          수강 완료했습니다. 감사합니다.
        • 고현우
          입력.....
        • 박영빈
          제가 기억하기로는 .euqlas 는 문자를 사용할때 쓰이는것으로 알고있구요
          == 연산자는 숫자를 사용할때만 사용합니다.

          이게 맞는건가 ... ㅎㅎ 제가 기억나는대로 답변드렸습니다.!!
          대화보기
          • 감사합니다
          • J_Project
            감사합니다
          • 170315
            감사합니다.
          • 김인섭
            감사합니다.^^
          • 다뎀바라
            질문 드립니다.

            이클립스 실행할 경우
            Run메뉴 -> Run Configrations메뉴 -> (x)=Arguments 탭 -> program arguments의 텍스트입력박스에 인자값 넣기 -> Apply버튼 -> Run버튼
            위와 같이 하였는데도 불구하고 아무런 반응이 나오지 않아 질문드립니다.
            ㅜㅜ
          • 내이름은이한샘
            동영상 잘 봤습니다! 감사합니다.!
          • 개발자입문30살
            아.......이해 너무 잘됩니다... .감사합니다!!!!ㅜㅜㅜㅜ
          • 히키
            조건문중첩에서 .equals() 대신에 == 을 사용하면 안되나요?
          • 12.10완료
          • Ryan.L
            감사합니다.
          • ljn425
            switch문이 재미있네요.감사합니다.
          • 정명호
            감사합니다
          • Sadak
            478번째 시청자 입니다.^^
            좀 더 빨리 이고잉을 만나지 못한게 아쉽네요^^
            좀 더 많이 홍보 되었으면 좋겠습니다.
          • Joon Lee
            아 재밌다
          • Sea YoungOh
            도스창에서 실행하는것은 안해봤고 이해만 하고(했다고 믿고...) 넘어갑니다.
            늘 좋은강의 고맙습니다.
          • 핫칠리
            LoginDemo 예제를 이클립스로 실행하면 오류가 발생됩니다. 그 이유는 배열의 인자값이 입력이 안되서입니다. 이클립스에서 인자값을 설정할 수 있는데요. 그 방법은 다음과 같습니다.
            Run메뉴 -> Run Configrations메뉴 -> (x)=Arguments 탭 -> program arguments의 텍스트입력박스에 인자값 넣기 -> Apply버튼 -> Run버튼
          • 감사합니다!
          • SK Kim
            조건부로 변수도 사용 가능합니다. (이전글중 변수는 조건부에 사용 못한다고 해서 확인)
          • JustStudy
            고맙습니다
          • bkbong9
            조건문 이해하는데 정말 큰 도움되네요
          • somnium
            감사합니다~
          • yskioi
            배우고 갑니다
          • 택이
            자바스크립트 살짝 배웠는데도 비슷한 내용이 많네요
          • Devani0310
            감사합니다
          • 감사합니다
          • 찐똥구리구리
            break를 안써서 만들면 더 편한 경우도 있을거 같아요 ㅎㅎ 깜짝 놀랐습니다. 그렇게 실행되서...좋은 강의 감사합니다...
          • 오빠는다르다
            감사합니다!!!!
          • Alexa
            오타 문제인 것 같습니다.
            대화보기
            • 박첩구드
              감사합니다!
            • 농부
              감사합니다. 너무 잘배우고 있습니다.
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기