공부/whiteship-java

4주차: 조건문, 반복문

chulphan 2020. 12. 10. 12:52

Whiteship(백기선) 님께서 주최하시는 자바 스터디 참여

[스터디 링크]: github.com/whiteship/live-study

[4주차 링크]: github.com/whiteship/live-study/issues/4

 

 

■ 조건문(Conditional Statement) 이란?

실행문을 조건부로 실행하는 것

¿ 그럼 우리는 왜 조건문을 사용해야할까??

우리의 일상생활에서 조건에 따라 어떤 일을 해야할지 달라질 수 있다

 

예를들어, 날씨가 좋으면 => 산책을 갈 수 있고

             비가 온다면 => 방콕을 할 수 있고 ... 등등

 

프로그램 코드를 작성함에 있어서도 어떠한 조건에 따라 실행할 statement 가 있고

그 조건을 제어하기 위해서 조건문을 사용한다.

 

¿ 조건문의 종류

조건문의 종류는 크게 두 가지가 있다

 

  • if-else
  • switch-case

 

그럼 위 두 가지의 조건문에 대해 알아보자

 

▶ if-else 문

if-else 문은 JAVA에서 가장 기본적으로 사용하는 조건문이다

 

문법은 아래와 같다

 

if (expression) { // expression 의 평가가 true 이면 이 코드블록 안의 내용을 실행한다
    // do something
} else { // if 문 내에 expression 의 평가가 false 이면 이 코드블록 안의 내용을 실행한다
    // do something
}

 

덧붙여서, else-if 문도 존재한다.

 

문법은 아래와 같다.

 

if (expression) {
    // do something
} else if (anotherExpression) { 
    // if문의 expression 이 false이고 anotherExpression이 true이면 
    // 이 부분의 코드블록의 코드들을 실행한다
    // do something
} else {
    // do something
}

 

▶ switch-case 문

 

if-else 문 외에 또 다른 조건문이다.

 

조건을 판단해야 할 변수는 하나인데, 그 안에 조건 판단을 위한 분기가 여러 개 존재할 때에

if-else 문 보다 유용하게 사용할 수 있다.

 

또, 여러 분기를 처리하기 위해서 else-if 를 다수 사용하는 것 보다 switch 문을 이용해서 처리하면

가독성을 높여줄 수 있다.

 

문법은 아래와 같다.

 

switch (someVar) {
    case someCase1:
        break;
    case someCase2:
        break;
    //....
    default:
        break;
}

 

여기서 switch 문 내에 들어가는 someVar 의 타입은 int, short, char, byte, String, enum 이 될 수 있다

    ※ 참고로, int, short, char, byte 의 경우에는 Wrapper 타입도 수용 가능하다.

    ※ 당연하게 case 문에 있는 someCase1, someCase2 도 위에 명시한 타입을 수용한다.

 

case 라벨 또는 default 라벨에 있는 break 문을 만나면 switch 문 밖으로 빠져나오게 되며,

case 라벨에 부합하는 조건이 하나도 없을 경우 default 라벨에 있는 코드를 실행하고 

switch 문 밖으로 빠져나오게 된다.

 

※ 주의사항

 

case 문 마다 break 문을 명시하지 않을 경우, 아래의 case 문 까지 쭉 내려가면서 코드를

실행하다가 break 문을 만나면 switch 문 밖으로 빠져 나간다.

 

break 문을 잘 명시해야 프로그램이 우리가 원하는대로 동작한다!!

int someValue = 1;

switch(someValue) {
    case 1:
        System.out.println("여기서 이미 조건에 부합했다!");
    case 2:
        System.out.println("여긴 아닌데 출력된다..");
        break;
    default:
        break;
  }
    

 

그럼 이제 반복문에 대해서 알아보자.

 

■ 반복문(Iteration Statement) 이란?

특정한 코드가 반복적으로 실행되도록 하는 구문

 

¿ 그럼 우리는 왜 반복문을 사용해야할까??

예를 들어 우리가 콘솔에 "메롱" 을 10번 출력해야 한다고 해보자.

 

우리가 반복문 없이 저 작업을 하려면 같은 내용의 코드를 10번 작성해야한다....(싫다)

 

하지만 우리가 반복문을 사용한다면 적어도 3줄의 코드로 위의 내용을 수행할 수 있다 (10줄에서 3줄로 줄어든다면 얼마나 보기 좋은가!!)

 

¿ 반복문의 종류

JAVA 에서 제공하는 반복문은 크게 4 가지가 있다

 

  • while
  • do-while
  • for
  • foreach

 

위 4 가지 반복문을 차례로 알아보자

 

▶ while 문

while 문은 자바에서 반복적인 행동을 할 수 있는 가장 기본적인 statement 이다.

 

문법은 다음과 같다

 

while (expression) {
    statement 
}

 

while 문은 처음으로 expression 을 평가(evaluate) 하는데 그 결과는 반드시 boolean 또는 Boolean(boolean 의 Wrapper) 여야 한다.

 

만약에 expression 으로 평가된 값이 true 이면 while 문 블록 내에 statement가 실행되고

expression 을 다시 평가한다.

 

위 작업을 계속 반복하다가, expression 으로 평가된 값이 false 가 되면 statement 문을 실행하지 않고 while 문을 빠져나온다.

 

즉, expression 으로 평가된 값이 true 인 이상 while 문 내에 statement 는 계속 반복된다.

 

예제) 1 부터 10까지 숫자를 출력하는 코드

 

int i = 1; // 초기화

while (i <= 10) {
    System.out.println(i);
    i++;
}

 

▶ do 문

do 문은 expression 을 평가하는 위치가 아래에 있다는 것을 제외하고는 while 문과 유사하다.

 

expression 을 평가하는 위치가 아래에 위치하므로 do 문은 무조건 한 번은 실행된다

 

문법은 아래와 같다.

 

do {
    statement
} while (expression); // 여기서 ';' 이 붙는거에 주의해야한다.

※ do 문에서 while 이 세미콜론으로 끝나야 하는 이유

while 문의 블록이 '}' 로 끝나는 반면, do 문은 순회 조건으로 끝나기 때문이다.

 

예제) 위의 예제를 do 문으로 표현

 

int i = 1;
do {
    System.out.println(i);
    i++;
} while (i <= 10);

 

▶ for 문

for 문은 변수 초기화 부분, 변수 평가 부분, 변수 업데이트 부분을 캡슐화 하기 때문에

while 문, do 문보다 사용하기 편리하다.

 

문법은 아래와 같다

 

for (초기화 부분; 평가 부분; 변수 갱신 부분) {
    statement
}

 

위의 for 문은 기본적으로 다음 코드에서 whlie 문과 동일하다

 

초기화 부분;
while (평가 부분) {
    statement
    변수 갱신 부분;
}

 

예제) 위에서 예제를 for 문으로 작성해보자.

 

for (int i = 1; i <= 10; i++) {
    System.out.println(i);
}

 

※ 참고로, for 문의 초기화 부분에서 선언 및 할당된 변수 'i' 는 for 문을 벗어나면 

   존재하지 않는다.

 

 

▶ foreach 문

자바의 for 문은 primitive type 들에 대해서는 잘 동작하지만 객체의 collection 에 대해서 사용하기에는 

번거로운 면이 있다

 

대신에 foreach 문을 사용해서 순회하면 for 문 보다 더 편하게 collection 내의 객체들을 순회할 수 있다.

 

foreach 문은 'for' 키워드 뒤에 괄호를 열고, 변수 선언(단, 초기화를 따로 하지 않는다) 을 하고, 콜론(:) 을 붙이고, expression 을 명시하고 괄호를 닫고 블록 내에 statement 를 작성한다.

 

for (변수 선언: expression) {
    statement
}

 

예제) 배열 내에 있는 값을 foreach 문을 통해 출력해보자

 

int[] numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

for (int number: numbers) {
    System.out.println(number);
}

 

※ foreach 문의 한계

  • List 또는 배열의 원소를 뒤에서 부터 순회할 수 없다
  • 원소의 개수가 같은 두 배열에 대해서는 하나의 루프 카운터를 사용해서 순회해야 한다. (for 문을 이용해서)
  • List 의 원소들을 순회할 때에는 List 의 iterator 를 호출하기 보다는 get() 메소드를 호출한다(??)
  • index 를 이용한 부가적인 행동을 추가할 수 없다

 

▶ for 문을 제어하기 위한 부가적인 방법 => continue, break

 

▦ continue 문은 for 문, do 문 또는 while 문 안에서 현재의 반복에서 빠져나와 다음 반복을 시작하게 하는 역할을 한다.

 

예제) 아래 예제는 배열 내에 -1 을 만나면 그 다음 루프를 수행한다.

 

int[] data = {1, 2, 3, 4, -1, 3, 2, 1};

for (int i = 0; i < data.length; i++) {
	if (data[i] == -1) { // 현재 원소가 -1 이면
    	continue;        // 현재 반복을 건너뛴다. 즉, 아래의 출력문이 실행되지 않는다
    }
    System.out.println(data[i]);
}

 

▦ break 문은 for 문, do 문 또는 while 문 안에서 현재의 루프 블록에서 아예 빠져 나오는 역할을 한다.

 

예제) 아래 예제는 배열 내에 -1 을 만나면 루프를 빠져나와 출력문을 실행한다

 

int[] data = {1, 2, 3, 4, -1, 3, 2, 1};

for (int i = 0; i < data.length; i++) {
	if (data[i] == -1) { // 현재 원소가 -1 이면
    	break;        // for-loop 를 종료한다.
    }
    System.out.println(data[i]);
}

System.out.println("End loop");

 

 

∴ 조건문과 반복문을 적절히 잘 활용하면 코드를 적게 사용하면서도 효과적인 프로그램을 만들 수 있다.

     그리고 예전에 자바를 공부할 때에는 for-each 문이 없어 배열 index 를 가지고 일일히 배열에 접근했어야 했는데,

     더욱 편리해진 것 같다.

 

 

다음 포스트에서는 과제 중 하나인 JUnit 에 대해 알아보고

간단한 코드를 테스트 코드로 작성해볼 것이다.

 

 

 

[참고했던 것들]

≫ Java in nutshell 7th Edition

multifrontgarden.tistory.com/130 (LichKing 님의 티스토리, List 순회 시 get 을 사용하면 안되는 이유)

 

'공부 > whiteship-java' 카테고리의 다른 글

7주차: 패키지  (0) 2021.01.01
6주차: 상속  (0) 2020.12.24
5주차: 클래스  (0) 2020.12.19
4주차 과제: live-study 대시보드  (0) 2020.12.12
4주차 과제: JUnit5  (0) 2020.12.11