본문 바로가기

WhiteShip Java Study : 자바 처음부터 멀리까지

제어문

선장님과 함께하는 자바 스터디입니다.

자바 스터디 Github

github.com/whiteship/live-study

 

whiteship/live-study

온라인 스터디. Contribute to whiteship/live-study development by creating an account on GitHub.

github.com

나의 Github

github.com/cmg1411/whiteShip_live_study

 

cmg1411/whiteShip_live_study

✍ 자바 스터디할래. Contribute to cmg1411/whiteShip_live_study development by creating an account on GitHub.

github.com

 

 

선택문

선택문은 어떤 조건문의 조건을 검사하여 조건에 맞으면 선택하고, 조건에 맞지 않는 것은 선택하지 않는 일을 한다.
선택받은 조건에 정의된 표현을 실행하고, 선택받지 않은 표현은 실행되지 않는다.
조건문이라고도 한다.

if

  • if (조건식) { ... }
  • 조건식이 참이면 { ... } 구문을 실행한다.
public class IfCondition {
    public static void main(String[] args) {
        if (7 > 5) {
            System.out.println("This Condition is true !");
        }

        if ('a' > 'c') {
            System.out.println("Is this true ?");
        }
    }
}
This Condition is true !

7 은 5 보다 크다. 따라서 다음 정의된 식이 실행된다.

a 는 아스키코드값으로 97 이고, c 는 99 이다. 조건식의 결과값이 false 이므로 구문이 실행되지 않는다.

 

if 구문이 한줄이라면, 굳이 {} 를 쓰지 않고 작성할 수 있지만, 복잡한 코드에서는 중괄호가 가독성을 올려 줄 것이라 생각해 필자는 한줄이라도 중괄호를 쓰고 있다.

 

else if / else

  • else if 는 if 와 함께 쓰인다.
  • 한가지 결정을 내리는 과정에서 검사할 조건식이 여러가지라면 else if 로 연결하여 쓴다.
  • if 와 else if 로 연결된 구문은 위에서 JVM 이 위에서 아래로 실행하면서 처음으로 true 를 반환하는 분기의 식을 실행하고 끝낸다.
  • else 키워드는 위의 if, else if 의 조건들이 모두 false 일때 실행하는 구문을 정의한다. switch 의 default 와 비슷하다고 할 수 있다.
public class IfCondition {
    public static void main(String[] args) {

        char ch = 'a';

        if (ch >= 'a' && ch <= 'z') {
            System.out.println("It is small letter.");
        } else if (ch >= 'A' && ch <= 'Z') {
            System.out.println("It is Capital letter.");
        } else if (ch >= 'ㄱ' && ch <= 'ㅎ') {
            System.out.println("이건 한글이네요.");
        } else {
            System.out.println("It is something else...");
        }
    }
}

위의 조건문들은 ch 변수값에 따라 실행되는 구간이 달라진다.

 

ch = 'a' 이면 It is small letter. 가 출력된다.

ch = 'A' 이면 It is Capitial letter. 가 출력된다.

ch = 'ㅇ'이면 이건 한글이네요. 가 출력된다.

ch 가 알파벳도 아니고 한글 자음도 아니라면, 예를들어 ch = ' ' (공백) 이라면 It is something else.... 가 출력된다.

 

 

Switch

  • switch 는 if / else 보다 가독성이 좋고, 컴파일러가 최적화하기 좋아 속도도 더 빠르다
  • swith (조건이 될 변수) {...} 형식인데, 조건이 될 변수은 int 로 프로모션할 수 있는 값만 가능하다.
  • byte, short, char, int 가 가능하다.
  • Byte, Short, Integer, Character. Enum 객체도 가능하다.
  • {...} 안에서는 case 조건 값 : 구문 ; 형식으로 작성되며, 조건값이 맞으면 구문이 실행된다.
  • if / else 와는 다르게 switch 에 속한 case 중에서 참인 경우를 찾았다 하더라도, 뒤의 조건식을 계속 검사한다.
  • 따라서 break 키워드를 매 case 마다 넣어주는 구현이 자주 쓰인다.
  • default 는 모든 case 문에서 조건이 false 일때 실행되는 구문을 작성한다. 
int score = 75;
char grade;
switch (score/10) {
	case 10:
		grade = 'A';
		break;
	case 9:
	case 8 :
		grade = 'B';
		break;
		default :
	grade = 'F';
}
System.out.println(grade);

결과값은 F 이다.

case 9:

case 8:

이라고 쓴 부분이 있는데, 위에서 언급했듯이 switch 문은 참이라도 계속 검색하고, case 9 는 break 가 없기 때문에 결과적으로 9와 8인 경우 모두 B를 grade 에 넣게 된다.

 

 

 

책을 읽으면서 쌓인 개인적인 견해로는, 복잡한 if 나 switch 문은 사실 가독성에 좋지 않다.
대신 추상화, early return, 함수 나누기 등을 이용하는 것이 가독성이 좋은 코드를 만드는 방법이다.
또, else 구문은 독자가 이해하기 쉽지 않다. 위의 조건을 모두 읽어야 한다. 따라서 else 도 안티패턴의 하나라고 생각한다.

 

 

 

반복문

  • 반복문은 프로그램을 일정 횟수만큼 반복하여 실행하도록 하는 구문이다.
  • 반복문은 크게 네종류가 있다.
  • for
  • 향상된 for
  • while
  • do / while
  • 반복문들에는 break; 키워드를 쓸 수 있다. break; 를 만나면 해당 반복문을 빠져나오게 된다.
  • 이중 반복문에서 break 는 하나의 반복문만 빠져나간다.
  • 반복문들에는 continue 키워드를 쓸 수 있다. continue 를 만나면 실행하고 있는 반복할 식을 그만두고 다음 반복을 계속한다.

for

for 문의 형태와 실행 순서는 아래와 같다.

for (초기화 ; 조건식 ; 증감식) {
	반복할 코드들..
    ..
    ..
}
  1. 초기화 식
  2. 조건 식 검사
  3. 참이면 반복할 코드 실행 / 거짓이면 for 문 종료
  4. 증감식 실행
  5. 조건 식 검사
  6. 참이면 반복할 코드 실행 / 거짓이면 for 문 종료
  7. 증감식 실행
  8. 조건식 검사
  9. ...

초기화, 조건식, 증감식은 필수값이 아니다. 또 정해진 형태가 없다.

즉, 초기화를 하지 않고 기존 변수를 사용해도 되며

조건식을 걸지 않고 반복 코드에서 break 를 하는 방식도 가능하며

증감식에 관용적으로 쓰이는 ++ -- 말고 *2 등 여러가지 표현이 가능하다.

 

public class ForStatement {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 0; i < 10; i++) {
            System.out.print(i + " ");
            sum += i;
        }
        System.out.println(sum);
    }
}

0 부터 9까지 띄워쓰기로 구분하여 출력하고, 마지막에는 수들의 합 45를 출력한다.

 

아래와 같이 코딩하는 사람도 있을 수 있다.

public class ForStatement {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 0; i < 10; i++, sum+=i) {
            System.out.print(i + " ");
        }
        System.out.println(sum);
    }
}

이 경우에는 sum이 55 이다.

for 문의 실행 순서를 가만히 생각해 보면 알 수 있다.

i == 9 일때 반복을 진행하고, 증감식을 실행하면

i++ 에서 i == 10 이 되고, sum에 10 을 더한다.

그 후 조건식에서 조건을 만족하지 않으므로 for 문을 종료하고, sum 은 55 가 나온다.

 

마지막 예제는 그냥 이런 문법이 컴파일타임에 오류를 뱉지 않는 정상적인 문법이다는 것을 보여주고 싶었다.

보통 이렇게 사용하는 경우도 많지도 않고, 이렇게 쓰는 것은 가독성에 좋지 않아서 쓰지 않는 편이 나아 보인다.

 

향상된 for

  • 향상된 for 문은 Java 1.5 버전에 추가되어 사용되어 왔다.
  • 컬렉션이나 배열에서 유용하게 쓰이며 형태는 아래와 같다.
List<Integer> list = new ArrayList<>();
list.add(1);
...

for (int a : list) {
    반복할 구문
}
  • : 기호를 이용하며, 기존의 for 과는 다르게 괄호안의 항목이 2개다.
  • 두번째 항목에는 리스트나 배열 처럼 반복할 대상 객체를 넣는다.
  • 첫번쨰 항목에는 그 객체를 각각 가져올 변수를 선언한다.
  • 위의 예제에서는 list의 각 Integer 항목들을 하나씩 int a 로 가져온다. (오토 언박싱이 일어난다. 성능상으로 좋아보이지 않는다.)
  • 반복구문에서는 a 변수로 각 요소들을 사용하게 된다.
public class ForStatement {
    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
        for (int a : list) {
            System.out.print(a + " ");
        }
    }
}

 

while

  • while 문의 구조는 for 문보다 간단하다.
(초기식)
while(조건식) {
	반복할 식
    ...
    조건식의 결과를 변경하는 식
}
  • 조건식에서 반복을 할지 안할지를 boolean 값 결과로 결정한다.
  • 조건식이 true 면 블록 내의 반복할 식을 수행한다.
  • 반복할 식에는 조건식의 결과를 변경시킬만한 명령이 있어야 한다. 그렇지않으면 무한루프에 빠지고 프로그램에 문제가 생긴다.
public class WhileStatement {
    public static void main(String[] args) {
        int i = 0;
        while (i < 10) {
            System.out.println(i + "번쨰 실행 !");
            i++;
        }
    }
}

0번쨰 실행 !
1번쨰 실행 !
2번쨰 실행 !
3번쨰 실행 !
4번쨰 실행 !
5번쨰 실행 !
6번쨰 실행 !
7번쨰 실행 !
8번쨰 실행 !
9번쨰 실행 !

 

do / while

  •  
  •  
  •  
(초기화식)
do {

반복할 식
조건식의 결과를 반환시키는 명령

} while(조건식);
  • while 과는 다르게 마지막에 세미콜론이 들어간다.
  • 반복할 식을 한번 실행한 후 마지막에 조건을 검사한다.
  • 조건식이 true를 반환하면 반복한다.
  • 사실 잘 쓰이지 않는다.
  • 알고리즘에서 next_permutation 을 구현할때 쓰인다.
public class DoWhile {
    public static void main(String[] args) {

        int i = 4;
        do {
            System.out.println("한번만 실행될 걸 ?");
        } while(i != 4);
    }
}