-
[Java] 자바 기본 제어문 - 선택문, 반복문Java/Java 기본 및 이론 2021. 1. 11. 12:45
제어문
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