Programming Language/JAVA

[JAVA]제어문

Untitled_Blue 2023. 4. 27. 23:04
반응형

안녕하세요. 이번에는 제어문입니다.

- 제어문

제어문이란 프로그램의 처리 로직(순서)를 정의하기 위한 문법이다. 크게 선택 제어문과 반복 제어문으로 나뉘어진다.

제어문 종류 도식화

먼저 조건 제어문은 조건의 성립 여부에 따라 프로그램 실행 로직을 제어하는 문법이다. 예를 들어 아이디와 비밀번호를 입력해서 로그인을 하는데 만약 아이디와 비밀번호가 데이터베이스 저장된 정보와 일치하다면 로그인에 성공하고 그렇지 않으면 로그인 실패라는 메세지와 함께 다시 입력하도록 유도할 것이다. 이렇게 조건 제어문은 설정해둔 조건을 전제로 프로그램 실행을 제어하는 문법이다.

다음으로 반복 제어문은 일정한 조건이나 횟수만큼 프로그램의 기능 및 출력문 등을 반복하는 문법이다. 예를 들어 현재 있는 데이터들을 모두 화면에 보여줘야 한다면 데이터의 총 갯수만큼 출력문을 반복해야 할 것이다. 이런 상황에서 for문과 같은 반복 제어문을 사용해야 된다.

 

- 조건 제어문

조건 제어문은 크게 if-else, else if, swtich문이 있다.

package classes;

public class Main {
	public static void main(String[] args) {
		int a = 10;
		
		if (a > 5) {
			System.out.println("This is true...");
		}
		else {
			System.out.println("This is false...");
		}
	}
}

먼저 if문에 대한 설명이다. 우선 해당 순서도 그림은 상단 소스코드에 대한 알고리즘 순서도이다. 소스코드 실행 결과는 a > 5 조건에서 a의 값은 10이기 때문에 This is true...가 출력된다는 점을 확인할 수 있다.

만약 괄호 안에 있는 조건이 성립되면 if문 내에 있는 출력문이 나올 것이며 그렇지 않다면 어느 조건에도 성립되지 않을 때 구현되는 else문 내에 있는 출력문이 나올 것이다.

다음으로 추가된 버전인 else-if문에 대해 알아보도록 한다.

 

 

 

 

 

    

package classes;

public class Main {
	public static void main(String[] args) {
		int a = 10;
		
		if (a > 11) {
			System.out.println("a > 11 Yes");
		}
		else if (a < 0) {
			System.out.println("a < 0 Yes");
		}
		else if (a % 2 == 0) {
			System.out.println("a & 2 == 0 Yes");
		}
		else {
			System.out.println("Nobody true...");
		}
	}
}

해당 순서도 그림은 상단 소스코드에 대한 알고리즘 순서도이다.

실행 결과는 조건 a % 2 == 0이 성립되므로 a % 2 == 0 Yes가 출력된다.

왜냐하면 10에서 2를 나눠서 나오는 몫은 5이고 나머지는 0이기 때문이다.

(%은 나머지를 구하는 연산자이다.)

 

3개의 조건을 모두 성립하지 않는다면 else문의 출력문이 나오는 것도 확인 가능하다. else 자체가 어느 것도 성립하지 않았다는 점을 보여주기 위한 존재이기 때문이다. 이처럼 단순 if문과 다르게 else if 문을 통해 2개 이상의 조건을 설정해서 제어문을 작성할 수 있다는 점을 확인할 수 있다.

 

 

 

 

 

 

    

package classes;

public class Main {
	public static void main(String[] args) {
		int score = 2;
		
		switch (score) {
		case 1 : 
			System.out.println("Level 1");
			break;
		
		case 2 : 
			System.out.println("Level 2");
			break;
			
		case 3 :
			System.out.println("Level 3");
			break;
			
		default:
			System.out.println("No Data");
			break;
		}
	}
}

switch문은 마치 스위치 내지 리모콘처럼 정형화된 값을 기반으로 작동하는 제어문이라고 볼 수 있다.

else if문에 비하면 상대적으로 간결함을 확인할 수 있으며 그만큼 유지보수나 프로그램 실행 속도 면에서도 유리하다.

swtich문 순서도 도식화

이처럼 위칫값을 기반으로 조건 검사를 진행하고 일치하는 위칫값이 없으면 default로 이동해서 프로그램 실행을 제어할 수 있다. 이 때 break를 쓰는 것을 추천한다. 만약 생략할 경우 일치하는 하나의 조건을 출력하고 그 뒤에 있는 조건에 대한 출력문도 같이 나오기 때문이다. 이러한 이유로 break를 사용하여 해당되는 조건에 대한 구문만 실행될 수 있도록 유도하는 것이 좋다.

package classes;

public class Main {
	public static void main(String[] args) {
		int month = 8;
		
		switch (month) {
		case 11: case 12: case 1: case 2:
			System.out.println("Winter");
			break;
			
		case 3: case 4: case 5:
			System.out.println("Spring");
			break;
			
		case 6: case 7: case 8:
			System.out.println("Summer");
			break;
			
		case 9: case 10:
			System.out.println("Fall");
			break;
			
		default:
			System.out.println("No Data");
			break;
		}
	}
}

다음과 같이 case 옆에 case를 붙이는 방식으로 조건을 한 묶음의 구문에 두 가지 이상의 조건을 설정할 수도 있다.

여담으로 default는 생략 가능하다. 하단은 break가 없을 때 출력되는 예시 코드와 실행 결과이다.

package classes;

public class Main {
	public static void main(String[] args) {
		int month = 5;
		
		switch (month) {
		case 11: case 12: case 1: case 2:
			System.out.println("Winter");
			
		case 3: case 4: case 5:
			System.out.println("Spring");
			
		case 6: case 7: case 8:
			System.out.println("Summer");
			
		case 9: case 10:
			System.out.println("Fall");
			
		default:
			System.out.println("No Data");
		}
	}
}

다음과 같이 break문을 제거하고 실행한 결과는 좌측과 같이 나온다.

이전에 break문을 사용했을 때는 해당 조건에 대한 구문만 실행되고 끝났지만 사용하지 않은 현재는 조건에 대한 구문을 시작으로 그 다음부터의 구문도 조건이 성립되지 않음에도 같이 출력하고 있다.

그러므로, 조건에 대한 구문만 실행하고 다른 부분의 실행을 원치 않는다면 break문을 사용함으로써 제어를 할 수 있다.

 

 

- 반복 제어문

반복 제어문은 크게 for, while, do-while 문으로 구성되어 있다.

먼저 for문은 실행 구문을 반복적으로 수행하는 제어문이다. 이때 for문 내에서 반복 횟수를 정해둔다.

for문의 기본 구조

for문 실행구조는 다음과 같다. 먼저 초기식을 설정해야 하는데 이는 시작점을 설정하는 것이라고 볼 수 있다.

그 다음으로는 언제까지 얼마나 반복할 건지를 조건식을 통해 범위를 설정해야 한다. 이후 초기식에서 조건식으로 반복하는 과정을 증가 또는 감소 아니면 얼만큼 어떤 방식으로 증감할 건지에 대한 증감식을 작성해야 한다.

이들을 통해 실행 구문이 반복적으로 실행될 수 있다. 순서는 다음과 같다.

초기식 -> 조건식 -> 실행 구문 -> 구문 실행 종료 -> 증감식 .. 이러한 방식으로 조건의 끝까지 반복한다.

여기서 조건식을 생략하게 되면 (세미콜론은 꼭 있어야 한다) while문처럼 무한 반복하는 것을 볼 수 있을 것이다.

package classes;

public class Main {
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			System.out.println("For Repeat !");
		}
	}
}

해당 소스 코드를 실행해보면 다음과 같이 반복 문장을 5번 반복하는 것을 확인할 수 있다.

0부터 4까지 총 5번을 반복한 후에 i = 5가 되면서 i < 5 조건에 부합하지 않으므로 자동으로

반복문을 끝내는 것까지 확인할 수 있다.

 

 

 

 

   

package classes;

public class Main {
	public static void main(String[] args) {
		for (int i = 0; ; i++) {
			System.out.println("For Repeat !");
		}
	}
}

for문에서 조건식을 생략한 결과

만일 반복 횟수를 지정하는 역할인 조건식을 생략하게 된다면 다음과 같이 실행 구문이 무한 반복하는 것을 볼 수 있다.

하지만, 무한 반복되는 만큼 제어가 필요하기에 조건을 만족했을 때 반복을 중단하는 break문을 삽입한다.

package classes;

public class Main {
	public static void main(String[] args) {
		for (int i = 0; ; i++) {
			if (i > 10) {
				break;
			}
			System.out.println("For Repeat !");
		}
	}
}

무한반복문 내 break문 설정 시 출력 화면

다음과 같이 무한반복되는 for문 안에 if문을 통한 조건식을 설정하고 내부에 break문을 삽입했다. 이를 실행하면 구문이 10번 반복된 후에 i > 10이라는 조건이 충족되면 해당 반복문을 빠져나오는 것을 확인할 수 있다.

while문의 기본 구성

while문은 중괄호 안에 실행 구문을 반복적으로 실행하는 제어문이며 () 안 조건이 true라는 한에서 반복하는 제어문이다.

만일 조건이 false이면 조건에 부합하지 않으므로 반복문을 빠져나오면서 반복을 종료한다.

package classes;

public class Main {
	public static void main(String[] args) {
		while (true) {
			System.out.println("WHILE REPART");
		}
	}
}

다음과 같은 코드를 실행하면 WHILE REPART라는 문장이 무한으로 출력되는 것을 확인할 수 있다.

하지만 이렇게 끝도 없이 반복하다 보면 실제 프로그램 사용자 입장에서나 컴퓨터 입장에서나 좋지 않다.

 

package classes;

public class Main {
	public static void main(String[] args) {
		int k = 0;
		
		while (true) {
			if (k > 15) {
				break;
			}
			System.out.println("WHILE REPART");
			k++;
		}
	}
}

이런 식으로 while (true) 문 내에 if와 break문을 통해 일정 횟수만 반복할 수 있도록 반복 횟수를 제어할 수 있다는 점을 확인할 수 있다.

 

소스 코드에서 k의 초기값은 0이며 반복문 내에는 if문을 통해 k가 15보다 크면 반복문을 나오도록 하고 만약 아닐 시에는 구문을 실행하고 실행한 정도를 증감 연산자를 통해 체크하도록 구현한 점을 확인할 수 있다.

 

 

다음으로는 do-while문이 있는데 실행 과정은 기존 while문과 차이가 거의 없으나 조건 검사를 먼저 하고 안하고의 차이점을 볼 수 있다. while문은 조건을 먼저 검사한 후 반복문을 실행하는 반면 do-while문은 do안에 실행 구문을 구현하며 일단 최소 한 번의 실행을 진행한 후 조건을 검사한다.

 

+ 반복문의 중첩 구현

package classes;

public class Main {
	public static void main(String[] args) {
		for (int i = 1; i <= 9; i++) {
			for (int j = 2; j <= 9; j++) {
				System.out.print(j + " X " + i + " = " + (i * j) + "\t");
			}
			System.out.println(" ");
		}
	}
}

이중 for문을 사용하여 구구단 구현한 화면

다음과 같이 반복문 안에 반복문을 구현하는 방식으로 구구단을 실행하였다.

실행 순서는 간단히 요약하자면 외부 반복문을 먼저 한 번 시작하고 내부 반복문은 2부터 9까지 총 9번을 반복한 후 외부 반복문으로 빠져나오고 다시 내부 반복문을 구현하는 방식으로 진행된다. 이는 외부 반복문의 조건식이 충족될 때까지 반복된다. 이처럼 제어문을 이중으로 시작해서 원하는 만큼 중복할 수 있다는 점을 확인할 수 있다.

 

- 제어 키워드

제어 키워드는 반복문과 같은 제어문의 실행 과정에서 중간 제어를 담당하는 키워드이다. 

먼저 break는 반복문에서 특정 조건이 충족되었을 때 제어문을 빠져나오는 데 사용되는 데 쓰인다.

반면 continue는 주로 반복 과정에서 특정 구문을 건너뛰는데 사용되는 키워드다.

package classes;

public class Main {
	public static void main(String[] args) {
		int i = 0;
		
		while (i < 10) {
			if (i == 5) {
				i++;
				continue;
			}
			System.out.print(i + " ");
			i++;
		}
	}
}

continue 실행 결과

소스코드에서 while문 안에 if문이 있는데 이는 만약 i의 값이 5이면 i의 값을 증가시키고 continue문을 통해 건너뛰고 while문의 조건식을 체크한다는 의미이다. 실행 결과도 5에서 건너뛴 만큼 5를 제외한 나머지 숫자가 출력된 점을 볼 수 있다.

 

package classes;

public class Main {
	public static void main(String[] args) {
		int i = 0;
		
		while (i < 10) {
			if (i == 5) {
				break;
			}
			System.out.print(i + " ");
			i++;
		}
	}
}

만약 continue을 break로 바꿔서 실행한다면 4까지만 출력되는 점을 확인할 수 있다.

 

다음 글은 배열에 대한 글입니다.

반응형