본문 바로가기

프로그래밍 언어 기초/JAVA

Chapter 3. 제어문

3.1. 제어문이란?

 자바의 변수와 연산자를 공부했겠다. 이제는 조금 더 고급(?) 기술을 배워보도록 하죠. 프로그래밍 언어에서 우리가 작성한 모든 코드(명령어)들은 기본적으로 작성한 순서대로 위에서 아래로 컴퓨터가 읽어들이게 됩니다. 이런식으로 코드(명령어)의 흐름이 이동하는 것을 순차적이라고 표현합니다. 그러나 개발자가 때로는 프로그램 코드(명령어)들의 흐름을 바꿔야할 때가 있을 수도 있겠죠. 길을 지나다가 갈림길을 만나면 우리가 왼쪽 또는 오른쪽으로 가는 것을 "선택"할 수 있는 것처럼 컴퓨터에게도 이 경우에는 A라는 작업을 해주고 저 경우에는 B라는 작업을 해줘 라는 명령을 하려면 프로그래밍 언어의 선형적인 흐름을 조금 바꾸어야 할 때가 많을 것 같습니다.

 

 그래서 이 때 사용할 수 있는 것이 바로 제어문입니다! 이름부터 멋지죠? 제어문은 이름에서 알 수 있듯이 선형적인 프로그램 명령어의 흐름을 개발자가 원하는 대로 제어할 수 있게 해줍니다. 단, 이런 제어를 위해서는 일종의 기준점이 필요한데요. 이 경우에는 A를 하고, 저 경우에는 B를 하려면 A를 하는 경우는 어떤 건지  B를 하는 경우는 또 어떤 건지 "판단"이 필요하겠죠? 이 때 유용하게 사용하는 자료형이 바로 boolean 입니다. true 또는 false로 결과가 두 종류 이기 때문에 애매함이 없죠. 그래서 제어문에서는 주로 boolean 값을 기준으로 코드의 흐름을 조절하게 됩니다.

 

그런데, 세상 모든 일이 한번에 끝나기만 하는건 아니죠? 때로는 여러번의 반복된 작업을 통해서 결과를 판단해야할 때도 있을 것 같습니다. 가령 설문조사를 한 결과를 통해 결과를 도출해보려고 하는데 단 하나의 조사 결과로 모든 결과를 판단하는 것은 조금 무리가 있겠죠? 아무래도 모든 조사 결과를 확인해서 결과나 경향을 판단해보아야 할 것 같습니다. 그런데 이런 작업은 너무나도 귀찮단 말이죠. 이처럼 동일한 작업을 하나의 명령으로 여러번 할 수 있도록 하는 것이 바로 반복문입니다. 이러한 반복문도 제어문의 일종으로 동일한 코드를 여러번 수행시킬 수 있습니다. 

 

마지막으로 '동네 마트에가서 두부 한 모를 사오고 전달해줘, 그 다음은 마음대로 해' 와 같은 명령을 수행하려면 어떻게 해야할까요? 일단 열심히 코드를 작성해서 두부를 한모를 사오는 것은 시켰는데.. 다음은 어쩌지..? 컴퓨터한테 작업이 완전히 끝났음을 어떻게 알려주지..? 라는 고민이 들 때 사용할 수 있는 것이 바로 분기문입니다. 대표적으로 break와 return이 있죠. 이 두가지 분기문은 정말 중요하고 또 자주 쓰이니 잘 알아두는 것이 좋겠습니다.

 

프로그래밍에서는 이와 같은 명령어의 흐름들을 "제어 구조"고 일컫습니다.

 

① if, if-else, if-else if-else, swtich 문을 이용한 조건문

② for, while을 이용한 반복문

③ go to, return, break, continue 를 이용한 분기문

 

제어구조는 위와 같이 크게 세 가지로 나눌 수 있습니다.

 

3. 2. 조건문

조건문은 조건문 속 "조건"에 따라 내부 문장(코드, 명령어)을 실행할 지 결정하게 됩니다. 이 때 조건의 기준이 되는 자료형이 boolean 이고 swtich문을 제외하고는 if문은 모두 기본적으로 boolean 값을 기준으로 내부 문장의 실행여부를 결정합니다. 무조건 boolean 자료형의 데이터 뿐만아니라 연산중 비교연산이 있었죠? 비교 연산은 결과적으로 boolean 값을 연산하기 때문에 비교 연산 또한 조건문에 사용될 수 있습니다.

 

3.2.1. if 문

if문은 크게 세가지 형태로 나누어 사용할 수 있습니다.

 

① 단일 if문

- 조건을 만족할 때만 특정 작업을 수행하고자 할 경우에 사용합니다. (아닌 경우 아무것도 X)

		int X = 13;
		
		if(X > 10) {
			System.out.println("X는 10보다 큽니다.");
		}
		
		// result
		// X는 10보다 큽니다.

 

 

② if-else 문

- 조건을 만족하면 특정 작업을 하거나 안하게 할 경우

		int X = 13;
		
		if(X > 10) {
			System.out.println("X는 10보다 큽니다.");
		}else {
			System.out.println("X는 10보다 작거나 같습니다");
		}
		
		// result
		// X는 10보다 큽니다.

 

③ if-else if-else

- 조건이 여러가지여서 ~ 중에 하나와 같은 조건으로 나뉘는 경우

		int X = 16;
		
		if(X > 20) {
			System.out.println("X는 20보다 큽니다.");
		}else if( X > 15) {
			System.out.println("X는 15보다 큽니다.");
		}else {
			System.out.println("X는 15보다 작거나 같습니다");
		}
		
		// result
		// X는 15보다 큽니다.

 

 

3.2.2. switch 문

- if-else if-else 처럼 ~ 중에 하나를 고르는 데 특화된 제어문입니다.

- if문과 다르게 조건에는 변수가 들어가게 되는데, 이 때 가능한 변수의 자료형은 byte, short, char, int만 가능합니다.

- 구조의 유사성 때문에 if-else if-else문과 서로 바꾸어 쓸 수 있지만, 모든 경우에 가능하진 않습니다.

- switch문은 if문과 다르게 조건의 끝에 분기문인 break나 return이 꼭 필요합니다. break나 return 없이 조건만 작성했다면, 처음 만족하는 조건부터 끝까지 모든 명령어가 수행됩니다.

 

switch문에 break를 전부 잘 작성한 경우

		int X = 13;
		
		switch(X) {
			case 5:
				System.out.println("5 이군요!");
				break;
			case 10:
				System.out.println("10 이군요!");
				break;
			case 13:
				System.out.println("13 이군요!");
				break;
			case 16:
				System.out.println("16 이군요!");
				break;
			default: // 위 조건중 아무것도 해당사항이 없을 때, if문의 else와 같은 역할
				System.out.println("아무 조건에도 해당되지 않네요...");
				break;
		}
		
		// result
		// 13 이군요!

 

swtich 문에 break가 없는 경우

		int X = 13;
		
		switch(X) {
			case 5:
				System.out.println("5 이군요!");
				break;
			case 10:
				System.out.println("10 이군요!");
				break;
			case 13:
				System.out.println("13 이군요!");
			case 16:
				System.out.println("16 이군요!");
			default: // 위 조건중 아무것도 해당사항이 없을 때, if문의 else와 같은 역할
				System.out.println("아무 조건에도 해당되지 않네요...");
		}
		
		// result
		// 13 이군요!
		// 16 이군요!
		// 아무 조건에도 해당되지 않네요...

 

 

3. 3. 반복문

반복문은 조건문 속 "조건"이 만족할 때까지 또는 만족하지 않을 때까지 동일한 작업을 반복하여 수행하는 문장입니다.

 

3.3.1. for문

for문은 크게 두 가지로로 나눌 수 있습니다.

① for문

for문의 기본 형식

		for(int i = 0; i < 5 ; i++) {
			System.out.println(i+"가 출력됩니다...");						
		}
		
		// result
		// 0가 출력됩니다...
		// 1가 출력됩니다...
		// 2가 출력됩니다...
		// 3가 출력됩니다...
		// 4가 출력됩니다...

 

 

② 향상된 for문

- 배열 등 여러개의 값이 모여 있는 변수를 순회하며 조회합니다.

		int[] array = new int[] {1,2,3,4}; // 자바의 배열, chap 4. 배열에서 다룹니다...
        
		for(int i : array) { // 배열에 있는 값을 index 없이 순회하여 출력할 때 용이!
			System.out.println(i);
		}
		
		// result
		// 1
		// 2
		// 3
		// 4

 

 

3.3.2. while 문

while문도 작업을 일단 수행하고 조건을 검사하느냐 조건을 먼저 검사하고 작업을 수행하느냐에 따라 두가지로 나뉩니다.

① while문 

- 조건을 검사후 조건을 만족할때까지

- 조건검사 -> 작업 수행의 반복으로 명령어를 실행합니다.

		int i = 0;
		
		while(i < 5) {
			i++;
			System.out.println("i는 "+i+" 입니다.");
		}
		// result
		// i는 1 입니다.
		// i는 2 입니다.
		// i는 3 입니다.
		// i는 4 입니다.
		// i는 5 입니다.

 

 

② do while문

- 조건과 상관 없이 최초 1회는 무조건 실행한 후, 조건을 검사하면서 조건을 만족할 때까지

- 작업수행 -> 조건검사의 반복으로 명령어를 실행합니다.

		int i = 0;
		
		do {
			i++;
			System.out.println("i는 "+i+" 입니다.");
		}
		while(i > 5);
		
		// result
		// i는 1 입니다.

 

 

3. 4. 분기문

분기문은 반복문 보다도 우선되는 문장으로, 특히 break나 return은 반복문이 조건을 만족을 못했더라도 반복을 종료할 수 있도록 하여 잉여 작업을 하지 않도록 처리할 수 있게 해줍니다.

 

3. 4. 1. break

- 반복문 내부에서 사용 가능하며, 조건을 만족하지 않았더라도 반복을 종료하는 명령어입니다.

- 반복이 종료되었어도 외부의 코드는 순차적으로 수행합니다.

		int x = 0;
		for(int i = 0 ; i < 10 ; i ++) {
			if(i > 5) {
				break;
			}
			x++;
		}
		System.out.println("x : "+x);
		System.out.println("여기도 실행될까요?");
		// result
		// x : 6
		// 여기도 실행될까요?

 

3. 4. 2. return

- 함수 자체를 종료하는 명령어입니다.

- 반복문에서 사용하면 반복을 종료함과 동시에 함수 자체를 종료하여 뒤에 나오는 코드는 수행되지 않습니다.

- 따라서 자바 컴파일러는 return 문 뒤에 작성한 코드가 전혀 실행될 가능성이 없을 경우(무조건 종료 등)

- return 문 뒤에 코드를 작성하면 컴파일 오류를 발생시킵니다.

		int x = 0;
		for(int i = 0 ; i < 10 ; i ++) {
			if(i > 5) {
				System.out.println("x : "+x);
				return;
			}
			x++;
		}
		System.out.println("여기도 실행될까요?");
		// result
		// x : 6

 

return문에 의해 실행될 가능성이 전혀 없는 코드가 검출되면 컴파일러가 자동으로 컴파일 오류를 발생.

 

3. 4. 3. continue

- 반복문 안에서 뒤에 작성된 코드는 건너 뛰고 반복문의 증감식이나 조건 검사를 다시 수행시키는 명령어입니다.

- continue 가 쓰인 곳을 기준으로 뒤에 작성된 코드는 수행되지 않고 스킵합니다.

- 짝수일 경우만 더하기 or 홀수일 경우만 더하기 등의 연산에 응용하기도 합니다.

 

		for(int i = 0 ; i < 10 ; i ++) {
			if(i%2==0) {// 짝수이면,
				continue;				
			}
			System.out.println("i : "+i);			
		}
		
		// result
		// i : 1
		// i : 3
		// i : 5
		// i : 7
		// i : 9