제어문
- 프로그램의 흐름을 바꾸는 역할을 하는 문장을 의미한다.
- 제어문에는 조건문과 반복문이 있다.
조건문 - if, switch
- 조건문은 조건식과 문장을 포함하는 블럭{ }으로 구성되어 있으며, 조건식의 연산결과에 따라 실행할 문장이 달라져서 프로그램의 실행흐름을 변경할 수 있다.
- 조건문은 if문과 swithch문, 두 가지가 있으며 주로 if문이 많이 사용된다.
- 처리할 경우의 수가 많을 때는 switch문이 효과적이지만, switch문은 if문에 비해 제약이 많다.
if문
자바에서 if문의 구조는 다음과 같다.
if (조건식) {
// 조건식이 참(true)일 때 수행될 문장들을 적는다.
}
블럭{ }
중괄호를 이용해서 여러 문장을 하나의 단위로 묶는 것을 의미한다.
블럭의 끝엔 세미콜론(;)을 붙이지 않는다.
블럭 내의 문장들을 탭으로 들여쓰기를 해서 블럭 안에 속한 문장이라는 것을 알려주는 것이 좋다.
블럭을 시작을 의미하는 '{'의 위치는 아래와 같이 두 가지 스타일이 있는데, 본인의 취향에 따라 선택해서 사용하면 된다. 1번의 경우는 라인 수가 짧아진다는 장점이 있고, 2번의 경우는 블럭의 시작과 끝을 찾기 쉽다는 장점이 있다.
1)
if (조건식) {
...
}
2)
if (조건식)
{
...
}
블럭 내의 문장이 하나일 땐 중괄호를 생략할 수 있지만, 가능하면 생략하지 않고 사용하는 것이 바람직하다. 나중에 새로운 문장들이 추가되면 중괄호로 문장들을 감싸줘야 하는데, 이를 까먹기 쉽기 때문이다.
1)
if (score > 60)
System.out.println("합격입니다.") // OK
2)
if (score > 60) System.out.println("합격입니다.") // OK
3)
if (score > 60)
System.out.println("합격입니다.") // 문장1 if문에 속함
System.out.println("축하드립니다.") // 문장2 if문에 속하지 않음
if-else문
자바 if-els문의 구조는 다음과 같으며, if-else문 역시 블럭 내 문장이 하나뿐인 경우 중괄호를 생략할 수 있다.
if (조건식) {
// 조건식이 참일 때 수행될 문장들을 적는다.
} else {
// 조건식이 거짓일 때 수행될 문장들을 적는다.
}
if-else if문
처리해야할 경우의 수가 셋 이상인 경우 사용된다.
자바 if-else if문의 구조는 다음과 같다.
if (조건식1) {
// 조건식1의 결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식2) {
// 조건식2의 결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식3) {
// 조건식3의 결과가 참일 때 수행될 문장들을 적는다.
} else { // 마지막은 보통 else블럭으로 끝나며, else 블럭은 생략가능하다.
// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
}
switch문
- 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하다.
- 처리할 경우의 수가 많은 경우엔 if문보다 switch문이 좋다.
- 제약조건이 존재한다.
switch문은 다음의 흐름과 구조를 가진다.
- 조건식을 계산한다.
- 조건식의 결과와 일치하는 case문으로 이동한다.
- 이후의 문장들을 수행한다.
- break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나간다.
switch (조건식) {
case 값1 :
// 조건식의 결과가 값1과 같을 경우 수행될 문장들
break;
case 값2 :
// 조건식의 결과가 값2와 같을 경우 수행될 문장들
break;
...
default :
// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
}
switch문의 제약조건
switch문은 다음과 같은 제약조건을 가진다.
- switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
- case문의 값은 정수/상수만 가능하며, 중복되지 않아야 한다.
public static void main(String[] args) {
int nu, result;
final int ONE = 1;
...
switch (result) {
case '1': // OK. 문자 상수 (정수 상수 49와 동일)
case ONE: // OK. 정수 상수
case "YES": // OK. 문자열 상수. JDK 1.7부터 허용
case num: // 에러. 변수는 불가
case 1.0: // 에러. 실수도 불가
...
}
}
반복문 - for, while, do-while
- 어떤 작업이 반복적으로 수행되도록 할 떄 사용된다.
- 반복문의 종류엔 for문, while문, do-while문이 있다.
- do-while문에 속한 문장은 최소한 한 번은 수행된다.
for문
for문은 초기화, 조건식, 증감식, 블록 4부분으로 이루어진다.
조건식이 참(true)인 동안 블럭 내의 문장들을 반복하다가 거짓이 되면 반복문을 벗어난다.
for (초기화;조건식;증감식) {
// 조건식이 참일 때 수행될 문장들을 적는다.
}
초기화
반복문에 사용될 변수를 초기화하는 부분이며 처음에 한 번만 수행된다.
보통 변수 하나로 for문을 제어하지만, 둘 이상의 변수가 필요할 때는 아래와 같이 콤마를 구분자로 변수를 초기화하면 된다(이때, 두 변수의 타입은 같아야 한다).
for(int i=1; i<=10; i++) { ... } // 변수 i의 값을 1로 초기화한다.
for(int i=1, j=0; i<=10; i++) { ... } // int타입의 변수 i와 j를 선언하고 초기화한다.
조건식
조건식의 값이 참이면 반복을 계속하고, 거짓이면 반복을 중단한다.
for(int i=1; i<=10; i++) { ... } // i <= 10인 동안 블럭 내 문장들을 반복
증감식
반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다.
매 반복마다 변수의 값이 증감식에 의해 점진적으로 변하다가 결국 조건식이 거짓이 되면 for문을 벗어난다.
주로 연산자 '++'이 사용되지만, 다음과 같이 다양한 연산자들로 증감식을 작성할 수 있다.
for(int i=1; i<=10; i++) { ... } // 1부터 10까지 1씩 증가
for(int i=10; i>=1; i--) { ... } // 10부터 1까지 1씩 감소
for(int i=1; i<=10; i+=2) { ... } // 1부터 10까지 2씩 증가
for(int i=1; i<=10; i*=3) { ... } // 1부터 10까지 3배씩 증가
중간식도 쉼표를 이용해 두 문자 이상을 하나로 연결해서 쓸 수 있다.
for (int i=1, j=10; i<= 10; i++, j--) { ... }
이 세 가지 요소는 필요한 경우 생략할 수 있으며, 모두 생략하는 것도 가능하다. 조건식이 생략된 경우, 참으로 간주되어 무한 반복문이 된다.
for (;;) { ... } // 초기화, 조건식, 증감식 모두 생략. 조건식은 참이 된다.
while문
- 조건식과 블럭만으로 이루어져있다.
- 조건식이 참(true)인 동안, 즉 조건식이 거짓이 될 때까지 블럭 내의 문장을 반복한다.
- for문과 달리 while문의 조건식은 생략할 수 없다. 만약 생략하게 된다면 에러가 발생한다.
while문은 다음의 흐름과 구조를 가진다.
- 조건식이 참이면 블럭 안으로 들어가고, 거짓이면 while문을 벗어난다.
- 블럭의 문장을 수행하고 다시 조건식으로 돌아간다.
while (조건식) {
// 조건식의 연산결과가 참인 동안 반복될 문장들을 적는다.
}
do-while문
- while문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블럭의 순서를 바꿔놓은 것이다.
- 블럭을 먼저 수행한 후에 조건식을 평가한다.
- 블럭 내 문장들이 최소한 한 번은 수행될 것을 보장한다.
do {
// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.
} while (조건식); <- 끝에 ';'을 잊지 않도록 주의!
break문
- 자신이 포함된 가장 가까운 반복문을 벗어난다.
- 주로 if문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 한다.
continue문
- 반복문 내에서만 사용이 가능하며, 반복 도중 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.
- for문의 경우 증감식으로 이동하며, do-while문의 경우 조건식으로 이동한다.
- 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점에서 break문과 다르다.
- 전체 반복 중에 특정조건을 만족하는 경우를 제외하고자 할 때 사용된다.
이름 붙은 반복문
- break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 벗어날 수 없다.
- 이때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해줌으로써 하나 이상의 바놉ㄱ문을 벗어나거나 반복을 건너뛸 수 있다.
...
Loop1 : for(int i=2; i<=9; i++) {
for(int j=1; j <= 9; j++) {
if(j==5) break Loop1;
if(j==3) continue Loop1;
}
...
}
참고
자바의 정석(남궁성 저)
'프로그래밍 언어 > Java + Kotlin' 카테고리의 다른 글
[Java] 스터디 6주차: 상속 (0) | 2021.07.07 |
---|---|
[Java] 스터디 5주차: 클래스 (0) | 2021.07.07 |
[Java] 스터디 3주차: 연산자 (0) | 2021.06.23 |
[Java] 스터디 2주차: 자바 데이터 타입, 변수 그리고 배열 (0) | 2021.05.27 |
[Java] 스터디 1주차: JVM은 무엇이며, 자바 프로그램은 어떻게 실행되는가 (0) | 2021.05.20 |