반응형

제어문

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();
}

 

반응형

+ Recent posts