목표
학습할 것
제어문(control flow statements)
- 원하는 결과를 얻기 위해 프로그램의 순차적인 흐름을 제어할 때 사용하는 명령문
- 선택문(조건문), 반복문 등
- 제어문에 속하는 명령문들은 중괄호({})로 둘러싸여 있으며 중괄호 영역을 블록(block)이라고 함
선택문(conditional statements)
- 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문
- if 문
- 조건식의 결과가 참이면 주어진 명령문을 실행하며, 거짓이면 아무것도 실행하지 않음
- 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x = 10;
if(x > 1){// 조건식
System.out.println("x는 1보다 큽니다.");// 조건식의 결과가 참일 때 실행하는 명령문
}
// 중괄호를 기준으로 들여쓰기를 통해 코드의 가독성을 높이는 것을 인덴트(indent)라고 함
- if/else 문
- if 문과 함께 사용하는 else 문은 if 문과 반대로 주어진 조건식의 결과가 거짓이면 주어진 명령어를 실행함
- 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x = 10;
if(x > 1){// 조건식
System.out.println("x는 1보다 큽니다.");// 조건식의 결과가 참일 때 실행하는 명령문
} else {
System.out.println("x는 1보다 작습니다.");// 조건식의 결과가 거짓일 때 실행하는 명령문
}
- if/else 문은 삼항 연산자를 이용해 간결하게 표현할 수 있음
int x = 10;
String answer = x > 1 ? "x는 1보다 큽니다." : "x는 1보다 작습니다.";
System.out.println(answer);
- if/else if/else 문
- 새로운 구문처럼 보이지만 두 개의 if/else 문이 연달아 나오는 형태임
- if/else if/else 문은 조건식을 여러 개 명시할 수 있으므로 중첩된 if문을 좀 더 간결하게 표현 가능
- else if 문은 여러 번 나와도 상관없지만 if 문과 else 문은 단 한 번만 나올 수 있음
- 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x = 9;
if(x > 5){
System.out.println("x는 5보다 큽니다.");
}else if(x > 1){
System.out.println("x는 1보다 큽니다.");
}else {
System.out.println("x는 1보다 작습니다.");
}
- switch 문
- 주어진 조건 값의 결과에 따라 다른 명령을 수행하도록 하는 조건문
- if/else 문보다 가독성이 더 좋으며, 컴파일러가 최적화를 쉽게 할 수 있어 속도 또한 빠른 편임
- 조건 값으로는 int형으로 승격할 수 있는(integer promotion) 값만이 사용될 수 있음 -> 조건 값으로 byte, short, char, int 형의 변수나 리터럴 사용 가능(Wrapper class Byte, Short, Character, Integer도 가능)
- enum 키워드를 사용한 열거체(enumeration type)와 String 클래스의 객체도 사용 가능
- if/else 문보다는 사용할 수 있는 상황이 적음
int x = 10;
switch(x) {
case 10:
System.out.println("x는 10입니다.");
break;
case 5:
System.out.println("x는 5입니다.");
break;
default:
System.out.println("x는 10과 5는 아닙니다.");
break;
}
- default 절은 조건값이 위에 나열된 어떠한 case 절에도 해당되지 않을 때 실행되며 필수는 아님
- default 절은 맨 마지막에 위치하는 것이 일반적이지만 case 절 사이에 위치해도 상관없음
- 각 case 절과 default 절은 반드시 break 키워드를 포함하고 있어야 함
- break 키워드는 switch 문을 빠져나가게 해 주며 선언하지 않을 시 조건에 해당하는 switch 문의 case 절 이후의 모든 case 절이 전부 실행됨
int x = 5;
switch(x) {
case 10:
System.out.println("x는 10입니다.");
case 5:
System.out.println("x는 5입니다.");
default:
System.out.println("x는 10과 5는 아닙니다.");
}
// x는 5입니다.
// x는 10과 5는 아닙니다.
int x = 5;
switch(x) {
case 10:
case 9:
case 8:
case 7:
case 6:
System.out.println("x는 5보다 큽니다.");
break;
case 5:
case 4:
case 3:
case 2:
System.out.println("x는 1보다 큽니다.");
break;
default:
System.out.println("x는 1보다 작습니다.");
break;
}
- 위와 같이 사용하면 여러 개의 case 절을 사용하여 여러 개의 조건 값을 한 번에 검사할 수 있음
반복문
- 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문
- while 문
- 특정 조건을 만족할 때까지 주어진 명령문을 반복 실행함
- 조건식이 참인지를 판단하여 참이면 내부의 명령문을 실행함
- 명령문을 전부 실행하고 다시 조건식으로 돌아와 다시 참인지를 판단하게 됨
- 조건식의 검사를 통해 반복해서 실행되는 반복문을 루프(loop)라고 함
- 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x = 0;
while (x < 5) {
System.out.println("x = " + x);
x++; // 제거시 무한루프 유발
}
System.out.println("최종 x = " + x);
- while 문 내부에 조건식의 결과를 변경하는 명령문이 존재하지 않으면 영원히 반복되는 무한 루프(infinite loop)에 빠질 수 있음
- while 문을 작성할 때는 반드시 거짓을 갖도록 조건식의 결과를 변경하는 명령문을 포함시켜야 함
- do/while 문
- 먼저 루프를 한번 실행한 후에 조건식을 검사함
- 조건식의 결과와 상관없이 무조건 한 번의 루프를 실행
int x = 5;
do {
System.out.println("x = " + x);
x++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨.
}while (x < 5);
System.out.println("최종 x = " + x);
// x = 5
// 최종 x = 6
- for 문
- 자체적으로 초기식, 조건식, 증감식을 모두 포함하는 반복문
- while문보다는 좀 더 간결하게 반복문을 표현할 수 있음
- 초기식, 조건식, 증감식은 각각 생략할 수 있음
- 실행될 명령문이 한 줄 뿐이라면 중괄호를 생략할 수 있음
int x;
for(x = 1;x < 6; x++){
System.out.println("x = " + x);
}
- for 문 안에서만 사용하는 변수를 초기식에 직접 선언할 수 있음
- for 문에서 직접 선언된 변수는 for 문이 종료되면 같이 소멸됨
for(int x = 1;x < 6; x++){
System.out.println("x = " + x);
}
System.out.println("x = " + x);// 에러 발생 -> 선언되지 않은 변수를 참조하려 함
for(int x = 1;x < 6; x++){
System.out.println("x = " + x);
}
- 변수 x라는 이름의 int형 변수를 두 번이나 선언해도 컴파일 오류가 발생하지 않는 이유는 for문이 종료되면 for문의 초기식에서 사용된 변수는 자동으로 소멸하기 때문임
- Enhanced for 문
- JDK 1.5부터 배열과 컬렉션의 모든 요소를 참조하기 위해 새롭게 추가됨
- 배열과 컬렉션 프레임워크에서 유용하게 사용됨
- 명시한 배열이나 컬렉션의 길이만큼 반복되어 실행됨
- 루프마다 각 요소는 명시한 변수의 이름으로 저장되며 명령문에서는 이 변수를 사용하여 각 요소를 참조할 수 있음
List<Integer> integers = List.of(1, 2, 3, 4, 5, 6, 7, 8);
for (Integer integer : integers) {
System.out.println(integer);
}
- Enhanced for 문은 요소를 참조할 때만 사용하는 것이 좋으며 요소의 값을 변경하는 작업에는 적합하지 않음
- Enhanced for 문 내부에서 사용되는 배열 요소는 배열 요소의 복사본이므로 값을 변경해도 원본 배열에는 아무런 영향을 주지 않음