본문 바로가기
Java/Java Basic

[Java Basic] 5. 조건식 - if, else, switch

by Rosmary 2022. 6. 27.
728x90
반응형

 

 

 

프로그래밍 언어에서 조건 식은 분기가 필요한 부분에서 사용된다. 예를 들어, 프로그램에 정보를 입력하는 사용자의 성별을 '남', '여'로 구분하거나, 입력한 자택 전화번호를 통해 지역번호와 거주하는 행정 구역을 확인하는 등의 작업에서 말이다. 다른 프로그래밍 언어를 접해보았다면 문법적인 차이만 있을 뿐 사용하는데 큰 어려움이 없다. 하지만 처음 프로그래밍을 접하는 분들이라면... 조건식 예제를 많이 작성해보고 작성한 코드가 어떤 논리로 동작하는지 확인하면서 학습하는 것이 좋다. 컴퓨터에 숙달되지 않은 인간의 논리로는 은근히 우리가 원하는대로 컴퓨터를 일 시키기 힘들다.

 

각설하고.. 조건식에 대해서 알아보자.

 

 

1. Java 조건식 분기에 사용되는 문법의 종류 - if문, switch문

 

Java의 조건식 분기에 사용하는 문법은 크게 if문과 switch문으로 나뉜다. 여기서 if 문은 if, if-else, if-else if로 나뉜다. if의 뜻을 아신다면 감이 오겠지만 if는 특정 조건에 대한 가정을 진행하고 이 가정이 참인 경우 코드를 수행하는 문법이다. switch도 if와 유사하게 분기를 수행하는 문법이나, 특정 조건이 아니라 리터럴 값을 판단하여 코드 분기가 나뉜다는 차이점이 있다. 

 

참고로 switch 문은 최근 프로그래밍 입문으로 많이 사용하는 Python에서 제공하지 않는 문법이다. 예전 포스팅에서도 잠깐 언급했듯이 Java는 C언어로부터 파생된 언어라 C의 문법 구조를 많이 가지고 있기 때문이다. switch 문을 사용하는 이유는 if문에서 분기가 여러 번 진행될 경우에 발생하는 연산 시간을 획기적으로 감소시킬 수 있기 때문이다.

 

 

2. if문

 

if 문을 사용하여 조건에 따른 코드 분기를 할 때, if문은 아래와 같이 사용한다.

 

if (조건식)

{

     조건식이 참일 경우 수행할 코드 작성

}

 

if문의 파생문인 if-else와 if-else if 역시 if문과 동일한 구조로 코드가 작성되는데 자세한 내용은 아래의 상세 내용과 예시를 통해 알아보자.

 

 

(1) if 문

 

대학에서 시험을 보았다고 가정하자. 90점이 넘으면 A학점이, 80점이 넘으면 B 학점, 70점 이상 C 학점, 나머지는 F를 준다고 해보자. 만약 필자의 시험 점수가 95점이라면 필자는 A 학점을 받게 된다. 90점이 넘는 상황을 판단하기 위한 조건문은 아래와 같이 작성할 수 있다.

 

 

하지만 조건은 90점 이상인 상황만 코드로 작성되어 있기 때문에 90점 미만에 대해서는 학점을 산정할 수 없다는 문제가 있다.

 

85점일 때 콘솔에 결과가 출력되지 않은 것을 확인하자

 

만약 if 문을 사용하여 아래와 같이 코드를 작성하면 어떻게 될까?

 

 

필자가 얻은 점수인 95점은 위에 작성한 if 문 중 상위 3개가 조건에 만족하기 때문에 하나의 학점이 아니라 A, B, C 세 개의 학점이 동시에 출력된다.

 

 

따라서 if 문으로 필자가 원하는 프로그램을 만들려면 아래와 같이 코드를 수정해야 한다.

 

 

하지만 if 문으로만 작성하게 될 경우, 조건식 연산과정이 많아 프로그램이 느려질 수 밖에 없다. 위의 예시를 보면 득점 점수가 70점 미만일 경우 무려 8개의 조건식을 계산해야 한다. 

 

- 90점 이상인 경우

- 90점 미만인 경우

- 80점 이상인 경우

- 90점 미만, 80점 이상인 경우의 && 연산

- 80점 미만인 경우

- 70점 이상인 경우

- 80점 미만, 70점 이상인 경우의 && 연산 

- 70 점 미만인 경우

 

if 문만 사용하면, 그리고 조금 더 복잡한 조건에 대해 나타내야 한다면, 조건식 연산으로 인한 부하가 심해질 수 밖에 없다. 이 때문에 if 문에서는 if-else 라는 별도의 문법을 제공한다.

 

 

(2) if-else 

 

if-else 문은 크게 어려운 내용이 아니다. if의 조건에 맞지 않는 상황은 if 내 중괄호가 아닌 else 내 중괄호에서 처리하는 문법이다. 

 

if (조건식)

{

    조건식이 참인 경우 실행할 코드

}

else

{

    조건식이 거짓인 경우 실행할 코드

}

 

위의 예시를 if-else 문으로 바꾸면 아래와 같이 나타낼 수 있다.

 

85점인 경우 B 학점이 제대로 출력되는 것이 확인된다.

 

if 문이 최대 8개의 조건식을 연산해야하는 것에 비해, if-else문은 최대 3개의 조건식만 연산하기 때문에 프로그램 실행 시 연산 부하가 매우 감소하게 된다. 하지만, if-else 문은 위와 같이 중첩되어 사용되는 경우 코드의 가독성이 떨어져 향후 수정이 필요한 경우 코드 내용을 파악하기가 어렵다는 단점이 있다. 가독성 문제 해결을 위해 대부분의 프로그래밍 언어는 if-else외에도 if-else if라는 문법도 제공한다.

 

 

(3) if-else if 문

 

if-else if 문은 맨 처음 if 조건에 해당하지 않는, 즉 거짓인 상황은 else 문으로 넘어가나, else 문 내에 분기 조건이 들어가 있는 경우 else 뒤에 if 문을 추가하여 사용하는 문법이다.

 

 if (조건식1)

{

   조건식 1이 참인 경우 실행할 코드

}

else if (조건식 2)

{

   조건식 1이 거짓인 경우, 그리고 조건식 2가 참인 경우 실행할 코드

}

else

{

    조건식 1, 조건식 2가 모두 참이 아닌 경우 실행할 코드

}

 

if-else if 문은 else if를 계속 추가하여 사용하는 것도 가능하며, 심지어 else 문도 추가가 가능하다. 위의 예시를 if-else if 식으로 변경하면 아래와 같이 나타낼 수 있다.

 

 

if-else 문과 비교해보면 알겠지만, else { if () .... } 문을 단순히 else if ()로 변경한 것이다. 동일한 코드임에도 가독성이 좋아 추후 코드를 수정해야 하는 경우에도 코드의 내용을 쉽게 파악할 수 있다.

 

조건식에 의한 if문 분기는 이것이 끝이다. 추가로 여러 조건을 하나의 if 문에 사용해야 하는 경우, 소괄호 내 여러 조건 식 사이에 논리 연산자 &&(AND)와 ||(OR) 를 사용하면 된다. 연산자에 대한 내용은 이 포스팅을 참고하자.

 

이제 if문이 약간 변형된 형태인, switch 문에 대해 알아보자.

 

 

 

3. switch 문

 

switch 문은 if 문과 달리 조건식으로 분기를 진행하지 않는다. 조건식 대신 정수형 변수 또는 정수형으로 변환 가능한 변수형 타입을 사용하여 분기를 진행한다.

 

한국의 주민등록번호는 생년월일 6자리와 고유번호 7자리로 구성된다. 고유번호 7자리 중 가장 첫 자리는 성별을 나타내는데, 2000년 이전 출생은 1이 남자, 2가 여자, 2000년 이후 출생은 3이 남자, 4가 여자다. 이를 if문으로 나타내면 아래와 같이 나타낼 수 있다.

 

 

문제는, alex가 아닌 breta와 나머지 회원의 성별과 출생 년도를 확인하려면, if 문 내 조건식의 변수명을 전부 일일이 변경해주어야 한다는 것이다. 지금의 조건은 단순히 변수가 특정 값이 아닌지 맞는지만 판단하기 때문에 switch 문으로 변경할 경우 조건으로 사용되는 변수를 단 한 번만 사용하여 코드 작성이 가능하다. 위의 예시를 switch 문으로 변경해보자. switch 문의 사용법은 아래와 같다.

 

switch (조건에 사용할 정수 변수)

{

    case 조건1:  조건1이 참인 경우 수행할 코드

                         break

    case 조건2:  조건2가 참인 경우 수행할 코드

                         break

    case 조건 3:  조건 3이 참인 경우 수행할 코드

                         break

    ...

    default:  조건1, 조건2, 조건3 모두 참이 아닌 경우 수행할 코드

}

 

 

위의 문법에서 조건1, 조건2, 조건3은 조건식이 아니라 반드시 정수, 문자열 또는 정수로 변환 가능한 값이 선언된 변수가 들어가야 한다. 회원 성별 판단 예제를 switch 문으로 변경하면 아래와 같이 나타낼 수 있다.

 

 

alex가 아닌  dorothy의 성별과 출생 년도를 확인해보자. 단순히 switch 문 조건 변수인 alex_gender를 dorothy_gender로만 변경하면 된다.

 

2000년 이후 출생, 여성이라는 결과가 제대로 출력되는 것이 보인다.

 

switch 문 내의 default는 if-else if 문의 else와 동일한 역할을 한다. 모든 조건에 해당하지 않을 경우 default 코드가 수행된다. 위의 예시에서 alien_gender=5는 case의 어떠한 조건에도 일치하지 않으므로 default가 수행된다.

 

 

 

각 case에 있는 break 문은 switch 문을 벗어날 때 사용하는 예약어인데, 이 예약어가 생략된다면 alex_gender가 조건 변수로 들어가는 경우, case 1,2,3,4 및 default의 코드가 모두 수행된다. charles_gender는 값이 일치하는 case3부터 아래의 코드가 모두 수행된다.

 

 

 

switch 문도 if문처럼 중첩하여 사용하는 것이 가능하다. 

 

switch-switch 문 뿐만 아니라 switch-if 문 중첩도 가능하다. 역으로 if-switch 중첩도 가능하고..

 

 

switch 문의 경우, if와 달리 별도의 조건식 연산이 들어가지 않다보니 if 문에 비해 처리 속도가 빠르다. 그럼에도 불구하고 최근에 잘 사용되지 않는 이유는 switch 문의 사용 제약 조건이 많기 때문이다. 조건 변수를 사용해야 하며, 심지어 정수로 변환이 불가능한 자료형에 대해서는 사용할 수 없는 등등 말이다.

 

 


 

다음 포스팅에서는 루프문인 for, while, do-while 문에 대해 알아보려 한다. 

 

 

 

 

Fin.

반응형

댓글