자바 if문
목차
자바 if문은 조건문입니다. 조건문이란 조건에 따라 각각 다른 문장을 선택할 수 있는 프로그램의 흐름을 제어하는 문장입니다.
조건문은 일반적인 언어로 표현할 수 있습니다.
비가 온다라는 사실이 있습니다.(명제라고 함)
비가 오면 A를 하고 비가 안오면 B를 한다. 이것은 훌륭한 조건문의 예입니다.
비가오면 집에 있는다. 비가 안오면 쇼핑을 간다.
비가오면 우산을 가지고 나간다. 비가 안오면 그냥 나간다.
코드로 만들어 보겠습니다.
if문
if문은 조건식이 참이면 블록의 코드를 실행하고 거짓이면 실행하지 않습니다.
== 연산자는 ‘같다’입니다. = 는 할당임에 주의합니다.
public static void main(String[] args) { boolean rain = true; if(rain == true){ System.out.println("우산을 들고 나간다"); } if(rain == false){ System.out.println("그냥 나간다"); } }
rain 이라는 명제에 대한 값은 true 아니면 false 입니다. 명제의 결과가 참이냐 거짓이냐에 따라 결과가 차이날 수 밖에 없습니다.
두가지 갈래에서 선택을 해야 하는 것이죠.
if조건문을 사용함으로써 1차원적 흐름을 탈피하고 결과의 다양성을 만들어 낼 수 있습니다.
if-else문
if else 문은 한쪽이 참이면 나머지는 거짓임을 활용한 방법입니다.
위에서는 if문을 두번 썼습니다. 이것도 가능하지만 if와 else를 묶는다면 훨씬 관리하기 편하고 가독성이 좋습니다. 이 둘이 서로 묶여있다는 것을 알 수 있기 때문입니다.
public static void main(String[] args) { int score = 92; if(score > 90){ System.out.println("합격입니다"); }else{ System.out.println("불합격입니다"); } }
이번에는 숫자의 비교를 했습니다. A > B 는 A는 B보다 크다입니다. 크면? true 참 값을 반환합니다. if (true)와 같습니다. else 는 자동으로 실행되지 않습니다.
플로우차트(flow chart)라는 것을 들어본 적이 있다면 개념잡기가 어렵지 않습니다.
위의 흐름도를 보면 명확하게 알 수 있습니다. 흐름이 시작에서 종료로 가는 도중에 조건식의 결과값에 따라 흐름이 달라집니다. 이를 흐름을 제어한다고 해서 제어문이라고 합니다.
if-else문 자체는 어렵지 않을 것 입니다. 대부분의 언어에 내장하고 있는 조건식입니다. 자바의 문법은 C의 전통을 따랐습니다.
if-else 문을 사용해야 하는 경우는 이분법적 결론이 나는 것들 예를 들어 동물이 암컷과 수컷이다 나눌 때 사용할 수 있고 나이로도 30세 미만과 30세 이상 같이 반으로 딱 자를 수 있는 경우에 사용합니다.
if-else if-else문
이분법적인 흐름제어는 물론 쓸만합니다. 이것이 원초적인 논리회로의 원리기도 하지요.
그런데 세상 문제가 그렇게 간단하지 않아서 하나의 조건에 만족할 때 다수의 그렇지 않은 결과가 나오는 경우가 있습니다. 이럴 때는 if-else if-else문을 연달아서 사용할 수 있습니다.
public static void main(String[] args) { int score = 82; if(score > 90){ System.out.println("A등급"); }else if(score > 80){ System.out.println("B등급"); } else if(score > 70) { System.out.println("C등급"); }else{ System.out.println("F등급"); } }
학점 score 에 따라 등급을 나누었습니다. A부터C까지가 70점대에서 90점대까지.
그 이하는 F등급을 줍니다.
이 if-else 연속 체인은 위에서 부터 검사를 하다가 어느 한개라도 해당되면 종료하고 나머지 else 문은 실행하지 않습니다.
흐름도를 그리면 위와 같이 복잡해집니다만… 학습시간도 중요하므로 너무 구애받을 필요는 없습니다. 흐름을 따라 어디서 어디로 가는지 정도 파악하고 있으면 충분합니다.
나중에 좀더 복잡한 코드를 구현할 때 그려보면 구조를 클리어하게 볼 수 있습니다.
if문만 사용했을 때는 하나의 if문이 끝나면 참과 거짓에 상관없이 Zero 부터 다시 검사하지만 if-else if-else문의 경우 하나의 조건식이 참으로 판명되면 다른 조건식 즉 아래의 조건식은 실행하지 않습니다. 이 차이는 혼동하지 않도록 주의합니다.
이렇게 조건식을 1,2,3 … n개로 늘릴 수 있으나 이렇게 많이 늘리는 방식은 좋지 않은데요. 조건식이 추가될 수록 가독성이 떨어지기 때문입니다. 때문에 다른 제어문 하나가 더 준비되있습니다.
switch-case문
스위치-케이스문입니다. 동작 원리는 if-else if-else 문과 비슷합니다. 그러나 가독성 면에서 차이가 있습니다.
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("pick a color : "); int pickColor = sc.nextInt(); switch (pickColor){ case 0: System.out.println("you picked Red"); break; case 1: System.out.println("you picked Green"); break; case 2: System.out.println("you picked Blue"); break; default: System.out.println("no such color"); break; } } [실행창] pick a color : 2 you picked Blue
pickColor 에 정수를 입력받아서 case 문으로 선택했습니다. pickColor 의 값을 case 다음의 정수와 비교하여 해당하는 값의 블록을 실행합니다. 이 때 break가 없으면 다음의 case문을 실행시킵니다.
break 문으로 다음 문장의 실행여부를 결정할 수 있다는 부분이 다른 점 입니다. 또 default 문은 if-else의 else(아무 조건식도 참이 아닌 경우)와 같습니다. 이 경우는 다음에 나올 문장이 없으니까 break를 사용할지 말지 결정해야합니다.
스위치케이스 문은 사용자에게 번호로 메뉴를 보여주고 고르도록 하는 것과 같습니다.
사실 지금은 이런 방식 보다는 콜렉션 클래스에서 배울 매핑방식의 자료형(해쉬 테이블)을 사용하는 경우가 많아져서 스위치-케이스문을 잘 사용하지는 않습니다만,
어쨋든 이런 제어문이 있다는 정도는 알면 도움이 될 겁니다.
스위치-케이스문도 C언어 시절부터 있던 제어문이라 현대의 언어에서 이런 문법은 삭제하는 경우도 있습니다.
파이썬에는 아예 if-else if-else 문과 혼동을 줄 것 같은 스위치-케이스문은 제외시키고 대신 dictionary 자료형(이것도 해쉬맵처럼 매핑 방식임)을 사용합니다.
사용해보면 스위치 문법보다 간략하고 직관적으로 클리어 해서 스위치-케이스문을 사용할 생각은 안듭니다.
자바에서도 스위치-케이스문을 대체하는 방식이 여러가지가 있는데요. 이는 파이썬보다는 조금 복잡해서 객체지향 프로그래밍을 배운 후에 알게됩니다.
요약
이번 포스팅에서는 자바 if문을 비롯한 자바의 흐름 제어문에 대해서 알아봤습니다. 다소 디테일한 부분은 생략하고 전체를 본 것이니까요. 제어문부터 알고리즘의 시작이라고 생각하고 연습 하시길 바랍니다.
외부참조문서
The Java™ Tutorials (oracle.com) 자바 if문
Java If문 … Else (w3schools.com)
자바 튜토리얼 (4-1) 조건문(자바 if문) (tistory.com)