Web/Java

[Java] 제어문

목차 (클릭시 해당 목차로 이동)


     

     

     

    선택문 (조건문)


     

    if문


     

    구성

    if (조건식) {
    	// 조건식이 참(true)일 때 수행될 문장들을 적는다.
    }

     

     

    if 다음에 괄호()로 조건식을 쓰고 조건식이 참일때 괄호{}로 수행될 문장들을 적습니다.

     

    이때, (조건식)은 무조건 결과가 true or false 이어야만 합니다.

     

     

    if - else 문


     

    구성

    if (조건식) {
    	// 조건식이 참(true)일 때 수행될 문장들을 적는다.
    } else {
    	// 조건식이 거짓(false)일 때 수행될 문장들을 적는다.
    }

     

    조건식이 true일때 위 블럭{},

    조건식이 false일때 아래 블럭{} 이 수행됩니다.

     

     

    package javastudy.ch4;
    
    public class IfElse {
        public static void main(String[] args) {
            int input = 0;
    
            if (input == 0) {
                System.out.println("0입니다.");
            } else {
                System.out.println("0이 아닙니다.");
            }
        }
    }
    

     

     

     

     

     

    if - else if 문


     

    구성

    if (조건식1) {
    	// 조건식1이 참(true)일 때 수행될 문장들을 적는다.
    } else if (조건식2) {
    	// 조건식2이 참(true)일 때 수행될 문장들을 적는다.
    } else if (조건식3) {
    	// 조건식3이 참(true)일 때 수행될 문장들을 적는다.
    } else { // 마지막은 보통 else블럭으로 끝나며, else블럭은 생략가능하다.
    	// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
    }

     

    package javastudy.ch4;
    
    public class IfElseIf {
        public static void main(String[] args) {
            int score = 86;
            char grade;
    
            if (score >= 90) {
                grade = 'A';
            } else if (score >= 80) {
                grade = 'B';
            } else if (score >= 70) {
                grade = 'C';
            } else {
                grade = 'D';
            }
    
            System.out.println("grade = " + grade);
        }
    }
    

     

     

    1. 결과가 참인 조건식을 만날 때까지 첫 번째 조건식부터 순서대로 검사합니다.
      (첫 번째 조건식은 거짓이므로, 두 번째 조건식으로 넘어갑니다.)
    2. 참인 조건식을 만나면, 해당 블럭{}의 문장들을 수행합니다.
    3. if-else if 문 전체를 빠져나옵니다.

     

    특징

    조건식을 순서대로 검사하기 때문에 80점 이상, 90점 미만인 학생에게 B학점을 주기 위해서 조건식을

    80 <= score && score < 90 으로 적지않아도 됩니다.

     

    이미 조건식 1에서 score >= 90이 false가 나와 조건식 2로 넘어왔기 때문에 score < 90 을 만족하기 때문입니다.

     

     

     

     

     

     

    switch문


     

    if문의 조건식이 많아질수록 else-if를 계속 추가해야하는 상황이 나타납니다.

    그러면 여러 개의 조건식을 계산해야하고 처리시간도 많이 걸립니다.

     

    이런 경우 switch문을 사용하면 좋습니다.

     

     

    구성

     

    switch (조건식) {
        case 값1 :
        	// 조건식의 결과가 값 1과 같을 경우 수행될 문장들
            break;
        case 값2 :
        	// 조건식의 결과가 값 2와 같을 경우 수행될 문장들
            break;
        default :
        	// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
    }

     

    조건식의 결과와 만족하는 case로 이동하며 일치하는 case가 하나도 없을 경우 default문으로 이동합니다.

     

     

    조건식의 결과와 만족하는 case로 이동만 하기 때문에 해당 case부터 차례대로 수행됩니다.

    그래서 조건식에 맞는 해당 case만 실행하고 싶은 경우 break를 추가해 switch문을 빠져나오도록 해야합니다.

     

     

     

    고의적으로 break를 생략하는 경우

     

    회원의 level이 높을때 더 많은 권한을 주기위해 아래와 같이 switch문을 break없이 사용할 수 있습니다.

     

    • level이 3일경우 삭제, 쓰기 읽기 권한 모두 가짐
    • level이 2일경우 쓰기, 읽기 권한 가짐
    • level이 1일경우 읽기 권한 가짐
    switch (level) {
        case 3 : 
        	grantDelete(); // 삭제 권한
        case 2 :
        	grandWrite(); // 쓰기 권한
        case 1 :
        	grandRead(); // 읽기 권한
    }

     

     

     

     

    switch 문을 사용하기 위해선 아래 제약조건을 만족해야 합니다.

     

    switch 문의 제약조건

    1. switch문의 조건식 결과는 정수 또는 문자열이어야한다.
    2. case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.

     

    package javastudy.ch4;
    
    public class Case {
        public static void main(String[] args) {
            int num, result;
            final int ONE = 1;
    
            result = '1';
    
            switch (result) {
                case '1':   // OK. 문자 리터럴 ('1'은 아스키코드로 정수 49)
                case ONE:   // OK. 정수 상수
                case "YES": // OK. 문자열 리터럴. JDK 1.7부터 허용
                case num:   // 에러. 변수는 불가
                case 1.0:   // 에러. 실수도 불가
            }
        }
    }
    

     

     

     

     

     

     

     

    반복문 - for, while, do-while


     

    어떤 작업이 반복적으로 수행되도록 할 때 사용합니다.

     

    for문과 while문은 구조가 비슷하여 어떤 것을 사용해도 좋습니다.

    그러나 for문은 주로 반복횟수를 알고있을 때 사용합니다.

     

    do-while문은 조건에 따라 아예 수행되지 않을 수도 있는 for, while문과 달리 무조건 한번은 실행되는 반복문입니다.

     

     

    for 문


     

    구조

    for(초기화; 조건식; 증감식) {
    	// 반복수행되는 문장
    }

     

    for문은

    1. 초기화
    2. 조건식
    3. 증감식
    4. 블럭{}

    이렇게 4부분으로 이루어져 있습니다.

     

     

     

    초기화

    반복문에 사용될 변수를 초기화하는 부분이며 처음에 한번만 수행됩니다.

     

    둘 이상의 변수가 필요할 때는 콤마','를 구분자로 변수를 초기화 하면 됩니다.

    단, 두 변수의 타입은 같아야 합니다.

    for(int i=1, j=0; i<=10; i++} {...}

     

     

    조건식

    조건식의 값이 참(true)이면 반복을 계속하고, 거짓(false)이면 반복을 중단하고 for문을 벗어납니다.

     

     

     

    증감식

    반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식입니다.

    매 반복마다 변수의 값이 증감식에 의해 점진적으로 변하다가 결국 조건식이 거짓이 되어 for문을 벗어나게 됩니다.

     

    보통 변수의 값을 1씩 증가시키는 연산자 '++'이 증감식에 주로 사용되지만, 다음과 같이 다양한 연산자들도 증감식에 사용이 가능합니다.

    for(int i=1; i<=10; i++} {...}	// 1부터 10까지 1씩 증가
    for(int i=10; i>=1; i--} {...}	// 10부터 1까지 1씩 감소
    for(int i=1; i<=10; i+=2} {...}	// 1부터 10까지 2씩 증가
    for(int i=1; i<=10; i*=3} {...}	// 1부터 10까지 3배씩 증가

     

     

    또한, 증감식도 두 문장 이상을 하나로 연결해서 사용할 수 있습니다.

    for(int i=1, j=10; i<=10; i++, j--} {...}

     

     

     

     

     

    향상된 for문


    JDK 1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 for문의 새로운 문법이 추가되었습니다.

     

    for( 타입 변수명 : 배열 또는 컬렉션) {
    	// 반복할 문장
    }

     

    package javastudy.ch4;
    
    public class EnhancedFor {
        public static void main(String[] args) {
            int[] arr = {10, 20, 30, 40, 50};
    
            // 기존 for문 작성법
            for (int i = 0; i < arr.length; i++) {
                System.out.println("arr[i] = " + arr[i]);
            }
    
            // 향상된 for문 작성법
            for (int tmp : arr) {
                System.out.println("arr[i] = " + tmp);
            }
        }
    }
    

     

     

    단,

    향상된 for문은 일반적인 for문과 달리 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용할 수 있다는 제약이 있습니다.

     

     

     

     

    while 문


    for문에 비해 while문은 구조가 간단합니다.

    조건식과 블럭 {}만으로 이루어져 있습니다.

     

    조건식이 거짓이 될 때까지 블럭 {} 내의 문장을 반복합니다.

    while (조건식) {
    	// 조건식의 연산결과가 참(true)일 동안, 반복될 문장들을 적는다.
    }

     

     

    for문과 while문의 비교

     

    아래의 for문과 while문은 완전히 동일한 코드입니다.

    package javastudy.ch4;
    
    public class While {
        public static void main(String[] args) {
            
            // for문
            for (int i = 1; i < 10; i++) {
                System.out.println("i = " + i);
            }
    
            // 위의 for문과 동일한 while문
            int i = 1;
            while (i <= 10) {
                System.out.println("i = " + i);
                i++;
            }
        }
    }
    

     

     

     

     

     

    do-while문


    while문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블럭{}의 순서를 바꿔놓은 것입니다.

     

    그래서 while문과 반대로 블럭{}을 먼저 수행한 후에 조건식을 평가합니다.

    while문은 조건식의 결과에 따라 블럭{}이 한 번도 수행되지 않을 수 있지만, do-while문은 최소한 한번은 수행될 것을 보장합니다.

     

    많이 사용되지는 않지만 반복적으로 사용자의 입력을 받아서 처리할 때 유용합니다.

    do {
        // 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.
    } while (조건식); // <- 끝에 ';'을 잊지 않도록 주의