8편. 제어문 (1)
if문
오늘 배우게 될 if문은 조건문에 사용되는 유용한 키워드입니다. 어떤 조건을 만족시킬 때 어떠한 문장을 실행시키고 싶다면 바로 if문을 사용할 수 있습니다. 기본적으로 if문은 다음과 같은 기본 구성을 지닙니다.
if (조건식) {
// 조건식이 참일 경우 실행되는 문장
}
여기서 조건식에는 true이나 false를 반환하는 논리식이 쓰이고, if문 내부는 중괄호 { }를 사용하여 둘러쌉니다. 논리식에는 주로 관계 연산자나 논리 연산자가 사용되는데 이런 연산자가 기억이 나지 않으시면 이곳을 눌러 복습하시기 바랍니다. 이해를 돕기 위해서 이를 순서도(flowchart)로 나타내면 아래와 같을 것입니다.
다음의 예제를 통해 if문을 간단히 살펴보도록 하겠습니다.
public class IfElseExamples {
public static void main(String[] args) {
int num = 60;
if (num > 50) {
System.out.println("num은 50보다 큽니다.");
}
}
}
5~7행에서 if문이 쓰인 것을 확인하실 수 있습니다. 조건식을 살펴보면 num의 값이 60이므로 50보다 크기 때문에 조건식이 참(true)이 되어 if문 안의 문장을 실행합니다. 만약에 num 값이 50보다 작거나 같았다면 if문 안의 문장이 실행되지 않았을 것입니다.
중괄호의 생략
참고로 if문을 사용할 때 위처럼 내부에 문장이 단 하나만 있을 경우에는 중괄호를 생략할 수 있습니다.
if (num > 50)
System.out.println("num은 50보다 큽니다.");
하지만 아래와 같은 경우는 중괄호를 생략하면 안 됩니다. if문 내부에 문장이 하나만 있는 것이 아니기 때문입니다. 만약, 아래와 같이 작성하면 조건식 'num > 50'의 참, 거짓 여부와 상관없이 항상 출력되게 됩니다.
if (num > 50) {
System.out.println("num은 50보다 큽니다.");
System.out.println("num은 50보다 작거나 같지 않습니다.");
}
중괄호를 생략하면 코드가 짧아지지만 오류가 일어나기 쉽습니다. 예를 들어서, 중괄호를 생략한 if문에 문장을 하나 더 추가할 때 중괄호를 붙이는 걸 잊는다면 예기치 못한 결과가 나올 수 있습니다. 실제로도 2014년 애플의 SSL/TLS 프로토콜 구현에도 이와 유사한 문제가 있었습니다.
세미콜론에는 조심하자
if (조건식) 뒤에는 세미콜론(;)을 붙이지 않습니다. 만약 세미콜론을 붙인다면 오류는 발생하지 않지만, if문의 조건식이 참이건 거짓이건 if문 아래에 있는 문장이 항상 실행됩니다. 왜일까요?
아래와 같이 해석되어 조건식을 만족하더라도 빈 문장을 실행하기 때문입니다. 따라서 if문 다음에 오는 문장은 if문과 연결되지 않습니다. 의도적으로 이를 이용하는 프로그래머도 있지만 if문에서는 그런 사용법이 상당히 드뭅니다.
아래의 코드를 실행하면 num이 50보다 큰지 작은지는 상관없이 'num은 50보다 큽니다.'라는 문자열을 출력합니다. 올바른 결과를 출력하려면 if (num > 50) 뒤의 세미콜론을 제거해야 합니다.
public class IfElseExamples {
public static void main(String[] args) {
int num = 40;
if (num > 50);
System.out.println("num은 50보다 큽니다.");
}
}
동등 관계를 따질 때는 =가 아니라 ==을 사용한다
수학에서는 등호(=)를 통해서 서로 같음을 나타내기도 하고, 엑셀 등에서는 실제로 =를 비교 연산자로 사용하기도 해서 헷갈리시는 분들이 종종 있는 것 같습니다. 자바에서는 =가 이미 대입 연산자로 쓰이고 있으므로 ==를 비교 연산자로 사용합니다. 위의 예제에서 조건식을 아래와 같이 수정하면 에러가 발생합니다.
대입 연산자의 결과는 대입된 값이 되므로 결과적으로 if(50)이 되는데 조건식에는 true, false만 올 수 있기 때문에 위와 같은 타입 불일치 에러가 발생하는 것입니다. =를 ==로 수정하면 에러가 발생하지 않습니다.
if~else문
if~else문은 조건식이 참인지 거짓인지에 따라서 실행 흐름이 달라집니다. if문의 조건식이 참이라면 if문 내부의 문장이 실행되고, 거짓이라면 else문 내부의 문장이 실행됩니다. else문에는 조건식이 따로 붙지 않습니다. else문은 if문이나 곧 배울 else if문의 조건식이 모두 거짓일 경우에 실행되는 영역이기 때문입니다.
if (조건식) {
// 조건식이 참일 경우 실행되는 문장
} else {
// 조건식이 거짓일 경우 실행되는 문장
}
이해를 돕기 위해서 이를 순서도(flowchart)로 나타내면 아래와 같을 것입니다.
다음의 예제를 통해 if~else문을 간단히 살펴보도록 하겠습니다.
public class IfElseExamples {
public static void main(String[] args) {
int num = 40;
if (num > 50) {
System.out.println("num은 50보다 큽니다.");
} else {
System.out.println("num은 50보다 크지 않습니다.");
}
}
}
5~9행에서 if~else문이 쓰인 것을 확인하실 수 있습니다. 조건식을 살펴보면 num의 값이 40이므로 50보다 작기 때문에 조건식이 거짓(false)이 되므로 else문 안의 문장을 실행합니다. 만약에 num 값이 50보다 컸다면 if문 안의 문장이 실행되었을 것입니다.
if~else문의 중첩
if~else문의 중첩, 즉 if~else문 내에 if문이나 if~else문을 아래와 같이 삽입할 수 있습니다.
public class IfElseExamples {
public static void main(String[] args) {
int num = 51;
if (num <= 50) {
System.out.println("num은 50보다 같거나 작습니다.");
} else {
if (num > 60) {
System.out.println("num은 60보다 큽니다.");
} else {
System.out.println("num은 50보다 크고 60보다는 같거나 작습니다.");
}
}
}
}
자세히 살펴보면, 7행의 else문 내에 또 한번의 if~else문이 삽입된 것이 보이시나요? 여기서 if~else문이 중첩된 것을 볼 수 있습니다. 변수 num의 값은 51이므로 5행의 조건식을 만족하지 못하고 else문으로 넘어옵니다. 여기서 다시 if문을 만나 num이 60보다 큰지 비교를 하게 되는데, num의 값은 60보다 크지 않으므로 "num은 50보다 크고 60보다는 같거나 작습니다."라는 문자열을 출력하고 중괄호를 빠져나옵니다. 이해가 되셨나요?
else if문
여러 가지 조건에 따라 실행되는 문장이 제각각일 경우에 else if문을 사용합니다. 물론 중첩으로 해결이 가능하나, 조건식이 많을 경우에는 과도한 중첩으로 인해 코드가 복잡해 보이게 됩니다. else if문은 if문과 else문 사이에 쓰이기도 하나 else문이 없을 경우에는 if문 아래서 사용됩니다. 여기서 else if문은 여러 번 등장할 수 있습니다. 기본적인 구조는 아래와 같습니다.
if (조건식1) {
// 조건이 참일때 실행되는 문장
} else if (조건식2) {
// 위의 조건식1을 만족하지 못하고 조건식2를 만족한다면 실행되는 문장
} else if (조건식3) {
// 위의 조건식1과 조건식2를 만족하지 못하고 조건식3을 만족한다면 실행되는 문장
} else {
// 위의 조건들이 모두 거짓일때 실행되는 문장
}
다음의 예제를 통해 if~else if~else문을 간단히 살펴보도록 하겠습니다.
public class IfElseExamples {
public static void main(String[] args) {
int score = 78;
if (score >= 90) {
System.out.println("점수가 90점 이상입니다.");
} else if (score >= 80) {
System.out.println("점수가 80 ~ 89점입니다.");
} else if (score >= 70) {
System.out.println("점수가 70 ~ 79점입니다.");
} else {
System.out.println("점수가 70점 미만입니다.");
}
}
}
5행의 조건식을 살펴보면 score의 값이 90보다 작으므로 조건식이 거짓(false)이 되어 아래의 else if문으로 넘어갑니다. 7행의 조건식에서는 score의 값이 80보다 작으므로 조건식이 거짓(false)이 되어 다시 아래의 else if문으로 넘어갑니다. 9행의 조건식에서 score의 값이 70보다 크거나 같다는 조건을 만족하여 else if문 내의 문장을 실행하고 빠져나옵니다.
'프로그래밍 관련 > 자바' 카테고리의 다른 글
10편. 반복문 (1) (6) | 2012.07.31 |
---|---|
9편. 제어문 (2) (20) | 2012.07.30 |
7편. 연산자 (2) (27) | 2012.07.25 |
6편. 연산자 (1) (19) | 2012.07.25 |
5편. 주석 (14) | 2012.07.22 |