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 |