들어가며
특정 조건이 만족될 때에만
실행하고픈 문장이 있다면
if 키워드를 사용하면 된다.
그리고 2개의 문장 중
조건에 따라
하나만 실행하고 싶다면
거기에 else를 더 추가하면
된다.
if 문과 if ~ else 문
if 문과 if ~ else 문이
제공하는 기능을
스스로 파악할 수 있도록
예제를 하나 제시하겠다.
public class temp {
public static void main(String[] args){
int n1 = 5;
int n2 = 7;
// if 문
if (n1 < n2){
System.out.println("n1 < n2 is true");
}
// if ~ else 문
if (n1 == n2){
System.out.println("n1 == n2 is true");
}
else{
System.out.println("n1 == n2 is false");
}
}
}
/*
출력 결과
n1 < n2 is true
n1 == n2 is false
*/
위 예제에서 보인 if 문의
기본 골격은 다음과 같다.
먼저 키워드 if의 오른편에
위치한 소괄호를 보자.
이 부분에 true 또는 false가
오게 되어 있다.
(물론 true 또는 false를
반환하는 연산이 오게 된다.)
이 위치에 true가 오면
이어서 등장하는
중괄호의 내부가 실행되고,
false가 등장하면 이 부분을
건너뛰게 된다.
그리고 if ~ else 문의 기본
골격은 다음과 같다.
이는 if 문의 뒤에 else를
붙인 구조이다.
위의 if ~ else 문은 if 절과
else 절로 나뉜다.
그리고 if의 오른편에 위치한
소괄호에 true가 오면 if 절이,
false가 오면 else 절이
실행되는 구조이다.
그럼 다시 예제를 보자.
예제에서 등장한 if 문은
다음과 같다.
조건이 true이면,
즉, n1이 n2보다 작으면
이어서 등장하는
중괄호에 감싸인 내용이
실행된다.
하지만 조건이 false이면
중괄호 내부는 실행되지
않는다.
if (n1 < n2){
// n1 < n2 이면 실행되는 문장
System.out.println("n1 < n2 is true");
}
다음은 예제에서 등장한
if ~ else 문이다.
이 경우 n1과 n2가 같다면
이어서 등장하는
중괄호가 실행된다.
반면 n1과 n2가 같지
않다면,
즉 조건이 false라면,
키워드 else에 이어서
등장하는 중괄호가
실행된다.
if (n1 == n2){
// n1 == n2 이면 실행되는 문장
System.out.println("n1 == n2 is true");
}
else{
// n1 != n2 이면 실행되는 문장
System.out.println("n1 == n2 is false");
}
이번에는 예제에서 등장한
if 문을
다음과 같이 수정해보자.
이전과 달리 경계를 구분하는
중괄호를 생략하였다.
if (n1 < n2)
System.out.println("n1 < n2 is true");
마찬가지로 중괄호를
생략하여
예제의 if ~ else 문을
다음과 같이 수정해보자.
if (n1 == n2)
System.out.println("n1 == n2 is true");
else
System.out.println("n1 == n2 is false");
이렇듯 경계를 구분하는 중괄호를
생략할 수 있는 이유는
if 문, 그리고 if 절과 else절에
속한 문장이 하나이기 때문이다.
if 문, 그리고 if 절과 else 절에 속한 문장이
하나인 경우에는 중괄호의 생략이 가능하다.
끝으로 if ~ else문도 라인(Line) 수에
상관없이
하나의 문장으로 인식됨을
기억하자.
if 문과 if ~ else 문은 코드의 길이가 길어도
하나의 문장으로서 인식된다.
이렇듯 코드에서 문장의 수를
결정짓는 요소는
코드의 라인 수가 아니다.
if ~ else if ~ else 문
여러 문장 중에서 조건에 따라
하나의 문장만 실행하고 싶다면
다음과 같은 구조의 문장을
구성하면 된다.
(문장 중간에 얼마든지 else if를
추가할 수 있다.)
맨 위의 if 문에서부터 조건을
검사하며 내려온다.
그러다가 조건이 true인
부분을 만나면
해당 부분에 속한 문장을
실행하고
나머지는 건너뛰게 된다.
관련해서 다음 예제를 보자.
public class temp {
public static void main(String[] args){
int num = 120;
if (num < 0) // 먼저 검사
System.out.println("0 미만");
else if (num < 100) // 위 조건이 만족되지 않으면 여기서 다시 검사
System.out.println("0 이상 100 미만");
else // 아무 것도 만족되지 않으면 else에 속한 문장 실행
System.out.println("100 이상");
}
}
/*
출력 결과
100 이상
*/
조건 검사는 위에서 아래로
진행이 된다.
그리고 영역별로 실행할 문장이
둘 이상일 경우
다음과 같이 중괄호로 해당
영역을 묶어주면 된다.
if (num < 0){
System.out.println("0 미만");
}
else if (num < 100){
System.out.println("0 이상 100 미만");
}
else {
System.out.println("100 이상");
}
다만 위 예제에서는 조건에
따라
실행할 문장이 하나이기에
중괄호를 생략하였다.
if ~ else if ~ else 문은 if ~ else 문을 중첩시킨 결과이다.
앞서 보인 예제의 if ~ else if ~ else 문은
다음과 같이 if ~ else 문으로
구현할 수 있다.
물론 이 둘은 같은 결과를
보인다.
if (num < 0){
System.out.println("0 미만");
}
else {
if (num < 100)
System.out.println("0 이상 100 미만");
else
System.out.println("100 이상");
}
그런데 if 절과 else 절에 속한
문장이 하나인 경우에는
중괄호를 생략할 수 있으므로
위의 문장은 다음과 같이
쓸 수 있다.
(다시 언급하지만 if ~ else 문은
여러 줄에 걸쳐 있어도 하나의
문장으로 인식된다.)
if (num < 0)
System.out.println("0 미만");
else
if (num < 100)
System.out.println("0 이상 100 미만");
else
System.out.println("100 이상");
그리고 위 문장의 간격 및 행을
조절하여
가독성을 다듬은 결과는
다음과 같다.
물론 간격과 행의 조절은
코드의 내용에
아무런 영향을 미치지 않는다.
if (num < 0)
System.out.println("0 미만");
else if (num < 100)
System.out.println("0 이상 100 미만");
else
System.out.println("100 이상");
이를 통해 알 수 있는 사실
하나는 다음과 같다.
if ~ else if ~ else 문은 사실
if ~ else 문을 중첩시킨 결과이다.
그러나 편의상 if ~ else if ~ else 문은
별도의 문장으로 인식하고
코드를 작성해도 문제가
되지 않는다.
실제로 그렇게 인식하고
있는 경우도 많다.
if ~ else 문과 유사한 성격의 조건 연산자
조건 연산자는 피연산자가
3개인 연산자이다.
이러한 조건 연산자는 간단한
if ~ else 문을 대체하는 용도로
주로 사용된다.
일단 예제를 통해서 조건 연산자의
구성과 동작의 결과를 확인하자.
public class temp {
public static void main(String[] args){
int num1 = 50;
int num2 = 100;
int big, diff;
// 조건 연산자 사용
big = (num1 < num2) ? num1 : num2;
System.out.println("큰 수: " + big);
diff = (num2 < num1) ? (num1 - num2) : (num2 - num1);
System.out.println("절댓값: " + diff);
}
}
/*
큰 수: 50
절댓값: 50
*/
위 예제에서 조건 연산자가
등장한 부분은
다음 구조를 지닌다.
2개의 기호 '?'와 ':'가 하나의
연산자를 이루는 구조다 보니
조금 어색할 수 있다.
그러나 복잡한 구조는 아니며,
다음 2가지로 연산의 방식을
정리할 수 있다.
- 기호 ? 의 왼편이 true이면 기호 : 의 왼편에 있는 수가 반환된다.
- 기호 ? 의 왼편이 false이면 기호 : 의 오른편에 있는 수가 반환된다.
물론 기호 ? 의 왼편에 true나 false를
직접 입력하지는 않는다.
true 또는 false를 반환하는
연산이 등장하는 것이
일반적이다.
그럼 다시 예제 8행을 보자.
big = (num1 < num2) ? num1 : num2;
이 상황에서 num1의 값이
num2보다 크면,
즉 조건이 true이면,
num1이 반환된다.
그리고 num1이 반환된다는
것은
위의 문장이 다음과 같이
정리됨을 의미한다.
(조건 연산자와 그 피연산자들은
모두 사라지고 num1만 남는다.)
big = num1;
이어서 예제의 다음 문장을 보자.
diff = (num2 < num1) ? (num1 - num2) : (num2 - num1);
이렇듯 값이 와야 할 위치에
연산이 올 수도 있다.
그리고 비교 연산자는 연산자의
우선순위가 낮은 편이다.
(끝에서 2번째에 위치한다.)
때문에 예제에서 위의 문장은
다음과 같이
연산이 완료된 상태에서
조건 연산을 진행하게 된다.
diff = (num2 < num1) ? -50 : 50;
참고 및 출처
|