제어문
Java에서 코드는 위에서 아래 순으로 읽고 실행된다. 모든 일을 순차적으로 실행할 수 있다면 아무런 상관이 없겠지만, 어떤 코드를 반복해야 될 수도 있고 어떤 코드는 건너뛰는 등의 순서를 변경해야 되는 일이 발생한다. 이 때, 제어문을 사용하여 코드 실행 흐름을 제어할 수 있다.이러한 제어문은 선택문(if-then, if-then-else, switch)과, 반복문(for, while, do-while), 분기문(break, continue, return)으로 나뉜다.
선택문(Decision-making Statement)
if-then
if-then 문은 가장 기본적인 제어문중 하나로 지정한 조건이 만족할 시에 지정한 블록({}) 안에 있는 코드가 실행된다.
if(조건식) { // 한 줄일 경우 {} 생략 가능
조건이 참일 경우 실행되는 코드;
}
만약 if-then문 안에 코드가 한 줄이라면 {}은 생략이 가능하다.
if-then-else
기본적인 if-then 문에서는 참일 경우만 실행이 됬다면, if-then-else 문은 거짓일 때도 실행할 수 있다.
즉, 조건식이 참일 경우와 거짓일 경우의 실행되는 코드들을 나눌 수 있다는 것이다.
if(조건식) {
참일 경우;
} else {
거짓일 경우;
}
이렇게 조건이 하나만 존재 할 수 있지만, 여러가지의 조건을 사용해야 할 경우가 생길 수 있다.(예 - 학점)
이 때는 else if()를 사용하여 또 다른 조건식을 사용할 수 있다.
switch
switch 문은 if-then과 if-then-else 문과 다르게 변수에 대해 평가를 하고 이를 분기할 수 있다.
평가 당하는 변수는 원시형 타입(int, byte, char...)일 수 있고, Enum형 혹은 String, Wrapper(Integer, Byte, Character...) 클래스도 가능하다.
switch(변수) {
case 값 A:
변수가 값 A에 해당하는 경우;
break;
case 값 B; 변수가 값 B에 해당하는 경우;
break;
default: 어떠한 값에도 해당하지 않는 경우;
break;
}
위 예시는 다음과 같이 if-then-else 문으로 변경도 가능하다.
if(변수 == 값 A) {
변수가 값 A에 해당하는 경우;
}else if(변수 == 값 B) {
변수가 값 B에 해당하는 경우;
}else {
어떠한 값에도 해당하지 않는 경우;
}
반복문(Looping Statement)
어떠한 코드가 반복적으로 사용 될 때 사용되는 구문이다.
for
프로그래머가 설정한 조건이 만족 될 때까지 지정한 코드 블럭이 계속해서 수행된다.
카운팅을 할 수도 있겠지만, 배열 혹은 컬렉션 안에 저장되어 있는 값을 순회 할 때도 많이 사용된다.
for(초기식; 조건식; 증감식) {
반복 될 코드;
}
JDK 5.0 이상부터 배열 혹은 컬렉션의 순회시에 다음과 같이 조금 더 향상된 for 문을 사용할 수 있다.
for(타입 변수명 : 배열/컬렉션) {
반복 될 코드;
}
foreach 스타일 for문
: 어떤 컬렉션이든 순회할 수 있음
Effetive java - item 46 : for문보다는 for-each를 사용하라
for-each문은 반복자나 인덱스 변수를 제거해 오류 가능성을 줄인다
int[] nums = {1,2,3,4,5};
for (int num : nums) {
System.out.println(num);
}
while
특정 조건이 참일 경우에 지정한 코드 블럭이 계속해서 수행되는 구문이다.
while(조건식) {
조건식이 참일 경우 반복되는 코드;
}
조건식이 항상 참일 경우에는 계속해서 해당 코드들이 실행되므로 다음 명령들을 수행할 수 없는 상태가 된다.
따라서 조건식을 잘 유의해서 사용해야 된다.
do-while
while 문이 조건식을 먼저 판별하고 코드를 수행했다면, do-while 문은 먼저 코드블럭을 수행하고 조건을 판별한다.
do {
조건식이 참일 경우 반복되는 코드;
}while(조건식);
분기문(Branching Statement)
조건문에서 프로그래머의 의도에 의해 중간 흐름을 바꿀 수 있는 구문
break
break 문은 두가지 케이스로 나뉘는데, 이는 라벨링이 된 것과 안된 것이다.
먼저 라벨링이 되지 않는 break 문은 switch 문, 반복문에서 사용될 수 있으며, 해당 구문을 만났을 때 가장 가까운 조건문을 종료한다.
for(int i = 0; i <= 10; i++) {
if(i == 5) break;
System.out.println(i);
} // 출력 // 1 // 2 // 3 // 4
다음과 같은 예시가 존재할 때, i가 5가 되면 반복문을 종료하고 다음 코드로 진행하게 된다.
라벨링이 된 break 문은 똑같이 break를 만나면 제어문이 종료되지만, 해당 라벨링이 된 제어문 자체가 종료된다.
즉, 가장 가까운 제어문뿐만 아니라 자신이 표시한 위치안의 제어문을 종료하는 것이다.
int findIt = 10;
search:
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j< arr[i].length; j++) {
if(arr[i][j] == findIt) {
break search;
}
}
}
위의 예시에서는 arr의 값이 10일 경우, search: 안에 있는 두개의 for 문 모두 종료된다.
continue
continue 문은 반복문 안에서 사용되며, 조건에 해당할 경우에만 반복문을 건너뛴다.
continue 문도 break 문과 똑같이 라벨링이 된 경우와 안된 경우가 존재하고 똑같은 메커니즘으로 동작한다.
for(int i = 0; i <= 10; i++) {
if(i == 5) continue; System.out.println(i);
}
// 출력 // 1 // 2 // 3 // 4 // 6 // 7 // 8 // 9 // 10
위의 예제에서는 i가 5일 경우에만 가장 가까운 반복문의 끝으로 건너뛴다.
int findIt = 10;
search:
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j< arr[i].length; j++) {
if(arr[i][j] == findIt) {
continue search;
}
}
}
위의 예제의 경우, arr의 값이 10일 경우, search: 의 가장 바깥 for 문의 끝으로 건너뛰게 된다.
return
return 문은 현재 메소드를 종료시키고 해당 메소드를 호출한 위치로 돌아간다.
이 또한 메소드의 타입에 의해 뒤에 값이 올 수 있고 안올 수 있다.
int getAge(String name) {
if(name == "jongnan") return 28;
System.out.println("존재하지 않는 사람!");
return -1;
}
위의 예제는 메소드의 타입이 int 이므로 반환 값을 지정해주어야 한다.
void pringAge(String name) {
if(name == "jongnan") {
System.out.println("28");
return;
}
System.out.println("존재하지 않는 사람!");
return;
}
Enumeration
- 초기 Collection만 지원
- Snap-shot : 원본과 달리 사본을 남겨처리. 다른 처리가 발생하면 오류 가능성 생김
- hasMoreElements(), nextElement()
Vector<Integer> vector = new Vector<>(Arrays.asList(1,2,3));
Enumeration elements = vector.elements();
while (elements.hasMoreElements()) {
int e = (int)elements.nextElement();
System.out.println(e);
}
Iterator
- 모든 Collection 지원
- enumeration에 비해 빠르다.
- hasNext(), next(), remove()
Iterator<Integer> iterator = Arrays.asList(1, 2, 3).iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
}
'Java > Java 기본 및 이론' 카테고리의 다른 글
자바 상속 (0) | 2021.03.07 |
---|---|
[Java] 자바 클래스 와 객체 및 키워드 (0) | 2021.01.17 |
[Java] junit5 설명 및 기본 사용 - junit4 와 5 비교 (0) | 2021.01.11 |
[Java] 자바의 연산자 (0) | 2021.01.07 |
[Java] 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법 (0) | 2021.01.03 |