Java Study #4

allzeroyou·2022년 1월 28일
0

Java

목록 보기
4/14
post-thumbnail

4장 제어문과 제어 키워드

1. 제어문

기본적으로 프로그램은 소스코드를 차례대로 1줄씩 처리한다. 이때 제어문은 '프로그램의 처리 순서를 바꾸는 것'이다.
자바에는 5개의 제어문(선택제어문 2개, 반복제어문 3개)과 2개의 제어키워드가 있다.

1-1. if 선택 제어문

if 문은 조건식에 따라 실행문의 실행 여부를 결정하는 선택 제어문이다. 기본적인 문법 구조는 크게 3가지 유형이 있다.

  • 유형 1 if 단일 구문
    조건식 1개, 중괄호 1개가 있는 구조
    조건식 = true일 때 중괄호 안을 실행
package ifSingle;

public class ifSingle {
	public static void main(String[] args) {
		if(5  > 3)
			System.out.println("출력"); // 참
		
		int a = 3;
		
		if(a == 3) 
			System.out.println("출력3"); // 참
		
		boolean b = false;
		
		if(b) 
			System.out.println("출력4"); // 거짓
	}
}

  • 유형 2 if-else 구문
    조건식 1개, 중괄호 2개가 있는 구조
    if 구문의 조건식이 true 일 때 if 구문의 중괄호 실행
    조건식이 false 일 때 else 구문의 중괄호 실행
package ifelse;

public class ifelse {
	public static void main(String[] args)
	{
		if(5 > 3)
			System.out.println("if문이 실행");
		else
			System.out.println("else문이 실행");
		int a = 5, b = 0;
		if(a > 5)
		{
			b = 10;
		} else {
			b = 20;
		}
		System.out.println(b);
		//삼항 연산자로 변환
		a = 5; b = 0;
		b = (a > 5)? 10 : 20;
		System.out.println(b);
	}
}

  • 유형3 if-else if-else 구문
    N개의 조건식과 N + 1의 중괄호가 있는 구조
    if-else if-else 구조이며, 처음으로 조건식이 true가 나오는 중괄호 블록을 만나면 해당 블록의 중괄호를 실행하고 if 문 탈출.
        int a = 85;
        if(a >= 90) {
            System.out.println("A학점");
        }
        else if(a >= 80) {
            System.out.println("B학점");
        }
        else if(a >= 70) {
            System.out.println("C학점");
        }
        else {
            System.out.println("F학점");
        }

1-2. switch 선택 제어문

switch문은 switch()()의 들어갈 변숫값에 따라 특정 위치로 이동해 구문을 실행하는 선택 제어문이다.
점프할 수 있는 위치는 case 값 :으로 설정한다. switch 문의 맨 아래에는 defalut :구문도 있는데 일치하는 값이 없을때는 default 문이 실행된다.(생략 가능)

	int a = 2;
	
	switch(a) {
	case 1:
		System.out.println("A");
	case 2:
		System.out.println("B");
	case 3:
		System.out.println("C");
	default:
		System.out.println("D");
	}

a 값이 2이므로 switch 문case 2:로 실행순서를 이동시킨 후 프로그램 실행 순서대로 1줄씩 실행.
그럼 switch 문도 if문 처럼 하나의 실행문만 실행하게 할 수 없을까?

제어키워드 중 하나인 break를 사용한다. break문은 if 문을 제외한 가장 가까운 중괄호를 탈출!

	switch(a) {
	case 1:
		System.out.println("A");
        break;
	case 2:
		System.out.println("B");
		break;
	case 3:
		System.out.println("C");
        break;
	default:
		System.out.println("D");
		}

if 문과 switch 문의 차이점은
if 문은 조건식에서 다양한 비교 연산자, 논리 연산자를 사용할 수 있고 switch 문은 정수, 문자, 문자열만 사용할 수 있다는 점이다.
성능에서의 차이점은, .if문은 순서대로 조건식을 검사하기에 첫번째 조건식의 실행문 출력과 나머지 조건식의 실행문 출력 사이에 속도 차이가 발생할 ㅅ수 있다. 반면 switch 문을 사용할 때는 동일하게 한 번만의 점프만을 수행한 후 실행되므로 모든 출력 속도가 동일하다는 장점이 있다. 그러나 수백만 개의 데이터를 처리하는 상황이 아니라면 어느 것을 사용해도 상관없다.

1-3.for 반복 제어문

for문은 실행 구문을 반복적으로 수행하는 반복 제어문
반복 횟수가 정해져있을때 많이 사용

package forSyntax;

public class ForSyntax {
	public static void main(String[] args)
	{
		//for 문 기본 구조
		int a;
		for(a = 0; a < 3; a++)
			System.out.print(a+" ");
		System.out.println();
		
		for(int i = 0; i < 3; i++)
			System.out.print(i+ " ");
		System.out.println();
		
		for(int i = 0; i < 100; i++)
			System.out.print(i+ " ");
		System.out.println();
		
		for(int i= 0; i > 0; i--)
			System.out.print(i + " ");
		System.out.println();
		
		for(int i = 0, j = 0 ; i < 10; i++, j++)
			System.out.print(i+j+" ");
		System.out.println();
		
		System.out.println();
		
		for(int i = 0; ; i++) {
			if(i > 10) {
				break;
			}
			System.out.print(i+" ");
		}
		System.out.print("무한 루프 탈출");
		
	}
}

1-4. while 반복 제어문

중괄호 안의 실행구문을 반복적으로 실행하는 반복 제어문으로 소괄호 안의 조건식이 true이면 반복 실행.

  • 일반적으로 while문은 반복 횟수를 정하지 않고 특정 조건까지 반복하고자 할 때 주로 사용.
    예를 들어, 자연수를 더해 합계가 100보다 커지는 숫자와 합계를 알고 싶을 때 while문 사용.
{
int num = 0, sum = 0;
	
while(sum < 100) {
	sum += num;
	num ++;
}
System.out.println((num-1) + "까지의 합 = " + sum);
		
}

  • while문의 실행 순서는 먼저 조건식을 검사하고 조건식이 true일 때 중괄호 안의 실행 구문을 실행
    이후 닫힌 중괄호를 만나면 다시 조건식을 검사하며, 이와 같은 과정을 조건식이 거짓이 될 때까지 반복

  • 조건식이 거짓이 되면 while문을 탈출하는데 for문과 마찬가지로 종료되는 시점은 닫힌 중괄호가 아닌 조건식이다.

  • while문과 for문은 초기식, 조건식, 증감식을 모두 포함하고 있어 언제든지 상호 변환 가능

		int a = 0;
		while(a < 10) {
			System.out.print(a + " ");
			a ++;
		}
		System.out.println();
		
		//for문으로 변환
		for(int i = 0; i < 10; i++)
			System.out.print(i+ " ");
		System.out.println();
		
		//for문으로 변환
		for(int i = 10; i > 0 ; i--)
			System.out.print(i+ " ");
		
		//while문으로 만든 무한 루프
		/*
		 while(true)
			System.out.println("무한루프");
		*/
		
		//무한루프탈출
		int c = 0;
		while(true) {
			if(c > 10) {
				break;
			}
			System.out.print(c + " ");
			c++;
		}

1-5. do-while 반복 제어문

while문과 매우 비슷한 반복 제어문
조건식의 검사와 반복 실행의 순서에만 차이가 있음

		초기식;
		do {
			실행 구문;
			증감식;
		} while(조건식);
  • 다른 제어문들과 달리 특이하게 생긴 구조
  • do {...} while(조건식);의 형태로 마지막이 중괄호로 끝나지 않으므로 제어문들 중에 유일하게 세미콜론(;)을 붙어야 함.
  • 초기식과 증감식은 생략가능하나, for문과 while문과의 상관 관계를 잘 이해할 수 있도록 기본 문법 구조에 포함시킴
  • do 구문을 실행한 후 조건식을 검사한다. 조건식이 이면 do 구문을 실행, 거짓이면 제어문 탈출.
  • while문은 조건식을 먼저 검사 => 최소 반복 횟수 0
    do while문은 일단 실행 => 조건식을 검사 => 최소 반복 횟수 1
		int a;
		//while
		a = 0;
		while( a < 0 ) {
			System.out.print(a+ " ");
			a++;
		}
		System.out.println();
		
		//do-while
		a = 0;
		do {
			System.out.print(a+ " ");
			a++;
		}while(a < 0);

초깃값이 a = 0 이므로 처음부터 조건식은 a < 0은 false.
이때 while문은 중괄호 안으로 진입할 수 없어 한 번도 실행되지 않으나 반면, do-while문일 때 일단 한 번은 실행한 후 조건식을 검사하므로 한번은 실행됨.
마치 do - while문은 while문보다 1회 더 실행된다고 착각할 수 있으나 절대 그렇지 않음.

		int a;
		//while
		a = 0;
		while( a < 10 ) {
			System.out.print(a+ " ");
			a++;
		}
		System.out.println();
		
		//do-while
		a = 0;
		do {
			System.out.print(a+ " ");
			a++;
		}while(a < 10);

변숫값을 하나씩 따져 보자. 1회 이상 반복될 때는 while문과 do-while문은 동일한 결과가 나타남.
정리: while문 0번, 1번, 2번, 3번 ... 반복
do-while문 1번, 1번, 2번, 3번... 반복
while문이 0번 반복될때만 차이가 있고 1 회 이상에선 동일. 절대로 do-while문이 한 번 더 실행되는 것이 아님!

1-6. 제어문의 중복

5개의 제어문을 봤다. 각 제어문 내부에는 또 다른 제어문을 포함할 수 있는데 예를 들어 if문 내부에 if문, switch문 안에 for문, for문 내부에 for 문 등 제어문을 얼마든지 중복해 사용 가능.

int value1 = 5;
		int value2 = 3;
		
		if(value1 > 5) {
			if(value2 < 2) 
				System.out.println("실행1");
			else
				System.out.println("실행2");
		} else {
			System.out.println("실행3");
		}
		System.out.println();
		
		//switch-for 중복
		int value3 = 2;
		
		switch(value3) {
		case 1:
			for(int k = 0; k < 10; k++) {
				System.out.print(k + " ");
			}break;
		case 2:
			for(int k = 10; k > 0; k--) {
				System.out.print(k+ " ");
			}break;
		}
		System.out.println();
		System.out.println();
		
		//for-for-if 중복
		for(int i =0; i<3; i++) { //3회 반복
			for(int j =0; j<5; j++) { // 5회 반
				System.out.println(i + " "+ j);
				if( i == j ) {
					System.out.println("i = j");
				}
			}
		}
		

2. 제어 키워드

2-1. break 제어 키워드

break 문은 if문을 제외한 가장 가까운 중괄호({})를 탈출 하는 제어 키워드

		for(int i=0; i<10; i++) {
			System.out.println(i); // i= 0일때 한번 출력
			break;
		}

  • break를 이용한 탈출은 if문을 제외한 가장 가까운 중괄호 하나라는 것.
  • 따라서 이중 중복 for문 내에서 break을 사용할 때 안쪽 for문만 탈출.
for(int i=0; i<10; i++) {
			for(int j=0; j<10; j++) {
				if(j == 3)
					break;
				System.out.println(i + ", "+ j);				
			}
		}

j값이 3이 되어 break를 만나면 탈출하는 반복문은 안쪽의 for문임.
그러나 탈출 이후에도 바깥쪽 for 문 내부에 있으므로 i 값에 따른 반복은 여전히 유효!
즉, i=0,1,2,...9 그리고 j=0,1,2 일 때 출력이 모두 이뤄짐.

  • break 으로 다중 반복문을 한 번에 탈출하는 자바의 공식적인 방법은 break + Label(레이블) 문법임.
  • break 다음에 레이블을 지정하면 여러개의 다중 반복문을 한번에 탈출 가능!
    -레이블 명은 개발자가 임의로 지을 수 있고 레이블 다음에는 반드시 콜론(:)을 표시해야!
		out:
		for(int i=0; i<10; i++) {
			for(int j=0; j<10; j++) {
				if(j == 3)
					break out;
				System.out.println(i + ", "+ j);				
			}
		}

break out은 out 레이블이 달린 바깥쪽 for문을 탈출하라는 의미. 3회의 출력까지만 실행.

2-2. continue 제어 키워드

  • 반복 제어문의 닫힌 중괄호 역할
  • 반복 제어문은 조건식이 true가 돼 실행 구문을 실행한 후 닫힌 중괄호를 만나면 다시 다음 반복을 위해 증감식을 수행하거나(for문) 조건식을 검사(while문)
  • 즉, 반복문 실행 도중 continue를 만나면 실행해야 하는 코드가 남아있더라도 마치 닫힌 중괄호를 만난것 처럼 다음 반복을 위해 증감식을 수행하거나 조건식을 검색한다.
  • 따라서 continue는 주로 반복 과정에서 특정 구문을 실행하지 않고 건너뛰고자 할 때 사용!
		for(int i = 0; i< 10; i++) {
			if(i == 5) {
				continue;
			}
			System.out.println(i); //0,1.2,3,4,6,7,8,9
		}

i=5 일때는 continue가 실행되어 출력 코드가 실행되지 않음.
따라서 i=5 일때를 제외하고 9번의 출력 실행.

📕 참고문헌) Do it! 자바 완전 정복!

profile
모든 건 zero 부터, 차근차근 헛둘헛둘

0개의 댓글