제어문(Control Flow Statement)
제어문이란, 프로그램 실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주는 것
일반적으로 조건식과 실행 구문인 중괄호(블록, { })으로 구성되어 있다.
제어문의 종류
1.
조건문(decision-making statements) : if문, switch문
2.
반복문(looping statements) : for문, while문
3.
분기문(branching statements) : break, continue, return
조건문
조건식의 결과에 따라 블록의 실행 여부가 결정
조건식에는 boolean 변수 혹은 true/false 값을 산출하는 연산식이 들어감
1. if문
•
if문의 조건식이 참일 경우 블록 내의 코드를 실행
if(조건식){
// 조건식이 참일 경우 실행 구문
}
Java
복사
2. if-else문
•
if문의 조건식이 참일 경우 if 블록 내의 코드를 실행
•
if문의 조건식이 거짓일 경우 else 블록 내의 코드를 실행
if(조건식) {
// 조건식이 참일 경우 실행 구문
}else{
// 조건식이 거짓일 경우 실행 구문
}
Java
복사
3. if-else if-else문
•
조건문이 여러 개인 다중 if문
•
앞에서부터 조건을 체크하고, 조건을 만족하지 않는다면 다음 if(else if)문으로 넘어감
•
앞의 모든 조건식이 거짓인 경우 마지막 else 문을 수행
if(조건식 A) {
// 조건식이 참일 경우 실행 구문
}else if (조건식 B){
// A 조건식이 거짓이고, B 조건식이 참일 경우 실행 구문
}else{
// A, B 조건식이 모두 거짓인 경우 실행 구문
}
Java
복사
4. 중첩 if문
•
if 문 블록 내에 또 다른 if문을 사용하는 것
if(조건식 A) {
// 조건식 A가 참일 경우 실행 구문
if(조건식 B) {
// 조건식 A와 B가 참일 경우 실행 구문
}
}
Java
복사
반복문
어떤 작업이 반복적으로 수행되도록 할 때 사용되는 구문
반복문의 종류
1.
for 문 : 반복횟수를 알고 있는 경우에 사용
2.
for - each 문 : 컬렉션과 배열을 처리할 때 사용되는 for문
3.
while문 : 반복 횟수를 모르고, 조건식을 통해 반복하는 경우에 주로 사용
4.
do while문 : while문과 사용 시기가 비슷하나, 반복을 수행하기 전 반드시 실행되어야 할 구문이 있는 경우에 사용
1. for문
•
for(초기식; 조건식 ; 증감식) 의 형태로 사용한다.
•
조건식이 참일 경우 for문 내부를 실행한 후, 다시 돌아와서 증감식을 수행한다.
증감식을 수행한 이후 다시 조건식을 검사하고, 참일 경우 위의 과정을 반복하고, 거짓일 경우 for문을 종료한다.
// 1부터 10까지의 수를 출력
for(int i = 1; i <= 10; i++){
System.out.println(i + " ");
}
Java
복사
2. for - each 문
•
for each는 J2SE 5.0 부터 추가되었다.
•
for each 문은 반복횟수를 명시적으로 주는 것이 불가능하고, 배열/Collections 의 항목 수만큼 실행을 반복하게 된다.
•
반복 변수를 선언하거나, 조건식, 증감식을 사용하지 않는다.
•
자료구조 사용에 대한 추상화를 제공한다.
•
배열의 값을 가져다가 사용할 수만 있고, 수정할 수는 없다. (조회의 목적)
•
루프를 돌릴 객체로는 루프를 돌릴수 있는 형태인 Array나 Collections가 가능하고 Iterable<E>를 상속받은 객체또한 가능하다.
for each 문의 사용과 값의 변화
크기가 2의 Person 타입 p 배열을 선언하고 2개의 Person 객체를 생성, 할당한다.
p 배열에는 그림과 같이 2개의 객체를 가리키는 0x1000, 0x2000 레퍼런스가 할당되어있다.
for each문을 통해 p 배열을 탐색하고, ps에 새로운 Person 객체를 생성하고 할당한다.
하지만 for each문의 ps는 실제 p 배열이 아닌 0x1000 이라는 레퍼런스와 같은 값을 지닌 별도의
참조변수이다.
따라서 new Person() 구문을 사용해서 대입하여도 원본 p 배열에는 변화가 없다.
* 값의 수정이 불가능하다? (ps.age++ 부분)
Reference type을 사용하는 경우 ps로 복사된 값은 단순 value가 아닌
원본 p배열의 Person 객체를 가리키는 레퍼런스와 동일하므로 실제 객체를 가르키게 된다.
따라서 ps.age++ 구문을 사용하면 for each를 사용하는 경우에도 data를 수정할 수 있다.
하지만 이것은 값이 아닌 레퍼런스를 따라가서 원본 객체를 수정하는 것이지 레퍼런스
자체를 수정하는 것은 아니다.
Java
복사
3. while문
•
루프상태 조건이 만족되는 동안 while문 내의 코드가 반복하여 실행된다.
•
반복 횟수가 고정되지 않은 경우 주로 사용된다.
•
입력 제어 루프라고도 부른다.
while(condition){
// condition이 참인 경우 수행되는 문장
}
Java
복사
4. do while문
•
기본적인 동작 원리는 while문과 동일하다.
•
하지만 do while문은 루프를 먼저 한 번 실행한 후에 조건식을 검사한다.
do{
// 기본적으로 최소 한번은 수행되는 문장
// 이후 condition이 참인 경우 수행되는 문장
}while(condition);
Java
복사
분기문
분기문이란, 프로그램 의 흐름을 순차적으로 수행하다가 다른 곳으로 조건에 의해, 또는 어떠한 이유에서 흐름을 이동시키는 구문
break
•
for문, while문, do~while문 등 반복 Loop나 switch~case문을 빠져 나오는 데 사용하는 구문
•
한번에 가장 가까운 하나의 Loop를 벗어날 때 사용된다.
continue
•
for문, while문, do~while문의 조건부로 제어를 옮기는 데 사용하는 구문
•
지정된 반복문의 다음번 루프의 내용을 실행하도록 시도하는 명령문
•
continue는 현재 진행 중인 루프를 중단하고 다음 루프로 건너뛰어 진행하도록 하는 구문
return
•
메소드를 종료하면서 메소드의 리턴 값을 보내고 싶을 때 사용
•
메소드 안에서 사용하는 분기문으로 현재 수행 중인 메소드를 종료시키고, 메소드를 호출한 수행문의 위치로 분기 이동함
•
메소드의 리턴 값이 data 형인 메소드라면, 반드시 return 뒤에 data형 값을 적어야 함
•
리턴 값이 void인 메소드라면 return만 쓰면 됨
label
•
분기문에서 label을 활용하여 break와 continue의 흐름 제어를 기존의 가장 가까운 loop가 아닌, 원하는 label을 붙인 곳으로 변경할 수 있다.
•
원하는 반복문의 위치에 label : 반복문 의 형태로 선언을 한 후, break/continue 뒤에 제어를 이동할 label의 이름을 적어준다.
int count = 0;
outer : for(int i = 0 ; i < 10 ; i++) {
for(int j = 0; j < 10; j++) {
System.out.print(count++ + " ");
if(count == 11) break outer;
}
}
Java
복사