제어문이라는 것은 모든 프로그래밍 언어에서 사용되는 것으로 쉽게 말해 일련의 조건을 주어 프로그램의 동작을 제어하는 것이라고 볼 수 있습니다. 그렇다면 이 제어문에 대해 자세히 알아보도록 하겠습니다.
1. if
if라는 것의 영어적 의미는 '만약 ~라면'이라는 뜻으로 보통 가정을 세울 때 사용합니다. 이는 프로그래밍에서도 마찬가지로 괄호 안의 내용이 참이면 아래의 조건을 실행하라는 의미로 사용됩니다. 형식은 아래와 같이 사용할 수 있습니다.
- if( 조건1 ){
내용;
} else if( 조건2 ){
내용;
} else
내용;
위의 형식에서 만약에 조건1에서 false값이 나온다면 조건2로 넘어가게 될 것입니다. 조건2도 false값이 나온다면 마지막 디폴트인 else 부분으로 넘어가게 될 것입니다. 이처럼 'if'와 'else if'를 함께 사용하는 것은 만약 위의 조건이 거짓이라면 아래의 조건으로 넘어가라는 의미가 됩니다. 그렇다면 아래를 보도록 하겠습니다.
- if( 조건1 ) {
내용;
}
if( 조건2) {
내용;
}
프로그래밍이 처음인 사람들은 위와 같은 실수를 종종 일으키곤 합니다. 위의 형식은 앞서 배웠던 'if-else if' 형식과는 다른 형식입니다. 이는 if문이 2개인 것이므로 조건1에서 true 값이 나온다고 해서 조건2를 수행하지 않는 것이 아닌 것이 됩니다.
또한 C에서는 if문에서 괄호 사이에 0혹은 1을 넣어도 잘 작동했던 경험이 있을 것입니다. 하지만 자바에서는 숫자를 논리형 조건식으로 인식하지 않기 때문에 'true'혹은 'false'를 넣어주어야 합니다. ( true = 무조건 실행, false = 무조건 생략 )
2. if 문의 예제
이번에는 if 문의 예제로서 2개의 수를 입력받아 더 큰 수를 출력하는 프로그램을 작성해보도록 하겠습니다.
import java.io.*;
public class Round06_Ex01 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int first = 0, second = 0;
System.out.println("첫번째 수 : ");
first = Integer.parseInt(in.readLine());
System.out.println("두번째 수 : ");
second = Integer.parseInt(in.readLine());
if(first > second) {
System.out.println("첫번째 수("+first+")");
System.out.println("가 두번째 수("+second+")");
System.out.println("보다 큽니다");
} else {
System.out.println("첫번째 수("+first+")");
System.out.println("가 두번째 수("+second+")");
System.out.println("보다 작습니다");
}
}
}
위의 코드는 간단한 코드이므로 별다른 설명은 필요하지 않을 것 같습니다. 그렇다면 이번에는 3개의 수를 입력받아 내림차순으로 정렬하는 코드를 작성해보도록 하겠습니다.
import java.io.*;
public class Round06_Ex02 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int first = 0, second = 0, third = 0;
int tmp = 0;
System.out.println("첫번째 수 : ");
first = Integer.parseInt(in.readLine());
System.out.println("두번째 수 : ");
second = Integer.parseInt(in.readLine());
System.out.println("세번째 수 : ");
third = Integer.parseInt(in.readLine());
if(second >= first && second >= third) {
tmp = first;
first = second;
second = tmp;
} else if(third >= first && third >= second) {
tmp = first;
first = third;
third = tmp;
}
if(third >= second) {
tmp = second;
second = third;
third = tmp;
}
System.out.println();
System.out.println(first + " >= " + second + " >= " + third);
}
}
위의 코드에서 자세히 볼 부분은 first 변수와 second 변수의 값을 서로 바꾸는 방식입니다. 저렇게 임시 변수를 생성하지 않고 바로 first = second, second = first로 바꾸면 되지 않냐는 생각을 할 수 있는데 만약 이렇게 한다면 first에 second의 값이 들어간 후 second에 first의 값을 넣으려 할 때에는 first에 이미 second 값이 들어있으므로 second = second인 셈이 되는 것입니다. 때문에 임시 변수를 생성하여 원래 있던 값을 따로 저장해놓은 후 하나의 값을 바꾼 후 다른 변수에 임시 변수의 값을 넣어주는 것입니다.
3. switch ~ case ~ break
if 문은 위에서부터 모든 조건을 수행해보고 참과 거짓을 가려야 하기 때문에 값이 true인 조건을 찾을 때까지의 시간이 다소 오래 걸릴 수 있습니다. 이렇게 시간이 늘어날수록 속도는 현저히 느려지기 때문에 이를 대체하기 위해 switch ~ case 라는 것이 나왔습니다. 이 switch-case문은 조건을 하나씩 비교하는 것이 아닌 말 그대로 여러 케이스 중 조건과 맞는 케이스를 찾아 바로 실행하는 방식입니다. 형식은 아래와 같이 사용할 수 있습니다.
- switch( ) { // 괄호 안에는 byte, short, int, char 자료형의 값( 굳이 변수나 숫자가 아니어도 상관 X )
case 값1 : 내용; break; // 내용은 굳이 하나가 아닌 '내용; 내용;' 식으로 여러 내용을 사용 가능
case 값2 : 내용; break;
case 값n : 내용; break;
default : 내용; // 어떠한 case에도 조건이 맞지 않을 경우 자동실행
}
switch-case에서 조심해야 할 점은 특별한 경우가 아닌이상 각 case에는 break;를 작성해주어야 한다는 것입니다. 만약 이 break;를 써주지 않으면 조건에 맞는 case의 내용을 실행하고 이후에 멈추지 않고 계속해서내려가면서 아래의 case를 실행하게 될 것입니다. 결론적으로는 원하는 case만을 실행하는 것이 아닌 조건에 맞는 case부터 break;를 만날 때까지 모든 case의 내용이 실행된다는 것입니다. 반대로 이러한 점을 응용하는 것도 가능합니다. 만약 여러 개의 case에 해당하지만 하나의 내용으로 묶고 싶을 때는 아래와 같이 사용할 수 있습니다.
- switch( ){
case n : case n-1 : 내용; break;
default : 내용;
}
만약 위와 같이 코딩을 하게 되면 switch문에서 괄호에 n이 들어가든 n-1이 들어가든 같은 내용이 실행될 것입니다.
4. switch ~ case ~ break 의 예제
이번에는 주민등록번호 뒷자리 7개 중 첫번째 자리를 입력받아 태어난 연도와 성별을 출력하는 프로그램을 작성해보도록 하겠습니다.
import java.io.*;
public class Round06_Ex03 {
public static void main(String[] args) throws IOException {
System.out.println("주민번호 7번째 자리");
int x = System.in.read()-48;
int year = 0;
String sex = "";
switch(x) {
case 9 : case 0 : year = 1800; break;
case 1 : case 2 : year = 1900; break;
case 3 : case 4 : year = 2000; break;
default : System.out.println("잘못 입력");
}
sex = x%2 == 0 ? "여성" : "남성";
System.out.print("당신의 나이는" + year + "년대생");
System.out.println(sex + "입니다");
}
}
위의 코드를 살펴보면 앞서 언급했던 여러 개의 case를 하나의 내용으로 묶는 방법이 사용되었습니다. 그렇다면 또 다른 코드를 작성해보도록 하겠습니다.
import java.io.*;
public class Round06_Ex04 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int num1 = 0, num2 = 0, tot = 0;
char ch = 0;
System.out.println("첫번째 수 : ");
num1 = Integer.parseInt(in.readLine());
System.out.println("연산자(+, -, *, /, %) : ");
ch = (char)System.in.read();
System.in.read();
System.in.read();
System.out.println("두번째 수 : ");
num2 = Integer.parseInt(in.readLine());
switch(ch) {
case '+' : tot = num1 + num2; break;
case '-' : tot = num1 - num2; break;
case '*' : tot = num1 * num2; break;
case '/' : tot = num1 / num2; break;
case '%' : tot = num1 % num2; break;
default : System.out.println("잘못된 연산자");
}
System.out.println();
System.out.println(num1 + " " + num2 + " = " + tot);
}
}
이 코드는 두 수와 연산자를 입력받아서 계산을 수행하는 프로그램입니다. 이번에도 별다른 내용은 없으므로 넘어가도록 하겠습니다.
'프로그래밍 > JAVA' 카테고리의 다른 글
자바 제어문 - 문제 (0) | 2019.04.19 |
---|---|
제어문 - 2 ( for, while, do-while ) (0) | 2019.04.17 |
자바 연산자 - 문제 (0) | 2019.04.16 |
자바 연산자 - 2 (0) | 2019.04.15 |
자바 연산자 - 1 (0) | 2019.04.14 |