티스토리 뷰
선택문
조건에 따라 명령을 처리하는 문법
- if~else문
- switch~case문
자바에서는 특정 데이터의 값에 따라 수행할 구문을 선택하는 문법을 제공한다. 연속된 값으로 데이터의 범위를 확인하는 if문, 그리고 불연속 값들을 case별로 나누어서 확인하는 switch문이 있다.
if~else문
package Week4;
public class Exam1 {
public static void main(String[] args) {
int month = 4;
if(month==12 || month==1 || month==2) System.out.println("winter");
else if(month==3 || month==4 || month==5) System.out.println("spring");
else if(month==6 || month==7 || month==8) System.out.println("summer");
else if(month==9 || month==10 || month==11) System.out.println("fall");
else System.out.println("error");
if(month==12 || month==1 || month==2) System.out.println("winter");
if(month==3 || month==4 || month==5) System.out.println("spring");
if(month==6 || month==7 || month==8) System.out.println("summer");
if(month==9 || month==10 || month==11) System.out.println("fall");
int count = 0;
if(month >= 5) count++;
else if(month >=4) count++;
else if(month >=3) count++;
else count++;
System.out.println("else if 사용 : " + count);
count = 0;
if(month >= 5) count++;
if(month >=4) count++;
if(month >=3) count++;
System.out.println("if만 사용 : " + count);
}
}
// [출력]
// spring
// spring
// else if 사용 : 1
// if만 사용 : 2
if문은 구분하자면 3가지 경우로 나누어서 설명할 수 있다.
- if
- if ~ else
- if ~ else if ~ else
if는 안에 있는 조건을 검사하여 검사값이 true이냐 false이냐에 따라서 다음 문장을 실행한다. else는 if의 조건을 제외한 나머지 모든 경우에 대해서 문장을 실행한다. 따라서 else는 항상 그 if문의 마지막에 하나만 존재한다.
else if가 조금 다른데 else if는 if다음에 계속해서 추가하여 사용할 수 있고 이전에 있었던 조건을 충족하지 않았을 때 해당 조건문으로 와서 검사한다. 그래서 아래의 count를 보면 month가 4이기 때문에 month>=4
와 month>=3
에 포함이 되지만 처음 조건에서 이미 조건을 충족하였기 때문에 count가 1만 올라간 것이다.
if만 연달아서 사용한 것과 달리 else if는 그 조건문 범위에 따라 돌아가지 않기 때문에 정확하게 원하는 조건에 맞는 구문을 사용하여야 한다.
switch문
자바 12, 13에서의 switch문을 볼 때 잠깐 봤었다. 물론 현재 실습은 자바 8로 하고 있고 프로젝트도 자바 8을 기반으로 많이 진행하고 있어 자바8을 기준으로 이야기하고자 한다.
switch 구문은 각각 따로 떼어진 case 별로 확인을 해서 조건을 충족하는지 확인하는 조건문이다. 하나하나 case를 적어놓고 확인하기 때문에 처음보는 입장에서는 가시성은 좋으나 case가 길어질 경우 가독성이 떨어지는 경향이 있다.
package Week4;
public class Exam2 {
public static void main(String[] args) {
int month = 4;
switch (month) {
case 12:
case 1:
case 2:
System.out.println("winter");
break;
case 3:
case 4:
case 5:
System.out.println("spring");
break;
case 6:
case 7:
case 8:
System.out.println("summer");
break;
case 9:
case 10:
case 11:
System.out.println("fall");
break;
default:
System.out.println("error");
break;
}
}
}
// [출력]
// spring
성능적인 이슈도 존재한다. 불연속적으로 나타나는 case들을 원하는 case를 찾을 때까지 무한정 찾다보니 case의 종류가 길어질수록 if문에 비해서 성능이 현저히 떨어진다.
상황에 맞는, 성향에 맞는 조건문을 사용하는 것이 좋다.
반복문
조건에 따라 같은 구간을 반복하는 문법
- for문
- while문
- do~while문
- for each문
- label 문
각각의 반복문 내부의 조건에 허용이 된다면 계속 반복하고 조건에 부합한다면 반복을 그만두는 문법이다. 조건을 잘못두면 내부에서 무한 loop가 발생하기 때문에 주의해서 조건을 달아야 한다.
for문
for(초기화식; 조건; 증감부){
}
초기화식의 경우 for문이 처음 시작할 때 변수를 초기화한다. 물론 for문이 시작하기 앞서 변수를 원하는 값으로 초기화하고 초기화식을 비워둔채 사용하여도 되지만 for문 내부에서 사용하는 변수의 경우 for문안에 사용하는 것이 서로 보기 편하다.
조건검사는 loop를 돌때마다 for문에서 가장 먼저 검사한다. 조건에 맞지 않으면 for문에서 자동으로 break된다.
항상 조건 먼저 검사한 후 증감부가 실행된다.
package Week4;
public class Exam3 {
public static void main(String[] args) {
for(int i=0; i<=3; i++){
System.out.println("i : " + i);
}
int j = 0;
for(; j<=3; j++){
System.out.println("j : " + j);
}
}
}
// [출력]
// i : 0
// i : 1
// i : 2
// i : 3
// j : 0
// j : 1
// j : 2
// j : 3
while문
while(조건문) {
}
초기화식과 증감부가 있어 따로 반복문에서 조건에 담긴 변수를 제어하였던 for문과는 달리 while에 조건만 달고 조건이 true일때까지 loop돈다. for과 마찬가지로 loop를 돌때마다 가장 먼저 조건을 검사한다.
조건안에 있는 값이 true이면 항상 loop를 돌기 때문에 조건문 대신 true를 걸고 내부에 if문으로 조건을 확인 후 break; 로 while문을 탈출하기도 한다. 이 경우 원하는 위치에 loop를 탈출하도록 조정할 수 있다.
package Week4;
public class Exam4 {
public static void main(String[] args) {
int num = 4;
while(num >= 0) {
System.out.println("num : " + num--);
}
System.out.println();
num = 4;
while(true) {
System.out.println("num : " + num);
num--;
if(num==0){
break;
}
}
}
}
// [출력]
// num : 4
// num : 3
// num : 2
// num : 1
// num : 0
//
// num : 4
// num : 3
// num : 2
// num : 1
do while문
do {
} while(조건문);
while문에서 조금 변경된 반복문이라고 생각하면 될 것 같다. 별다른 큰 차이점은 없고 while조건문이 반복문 가장 마지막에 붙어서 조건 검사를 loop 마지막에 하기 때문에 첫 loop는 무조건 돌아간다까지만 알면 된다.
package Week4;
public class Exam5 {
public static void main(String[] args) {
int num = 0;
do {
System.out.println("num : " + num);
num++;
}while(num <=4);
}
}
// [출력]
// num : 0
// num : 1
// num : 2
// num : 3
// num : 4
for each문
for(타입 value : iterate) {
}
흔히 향상된 for문이라고 불리는 for each문이다. 기본적인 구조는 for문과 비슷하지만 조건에 맞게 loop 돌기만 했던 for문에서 배열이 있을 때 배열을 통해 for문을 컨트롤하는 반복문이다.
배열을 for문으로 순회할 때 배열의 크기를 계산하고 그 값에 따라 loop를 돌렸다면 for each문은 배열이라는 객체 요소를 가지고 loop를 돌리기 때문에 배열의 크기를 몰라도 되고 ArrayList나 LinkedList와 같이 그 크기가 가변적인 객체를 다룰 때 매우 안전하다.
for문을 돌리다가 배열의 크기에 맞지 않은 index를 넣었을 때 발생한는 ArrayIndexOutOfBoundsException를 신경쓰지않아도 된다.
호출의 차이 때문에 for와 for each 두 구문의 성능이슈가 있을 것 같은데 조만간 테스트해봐야겠다.
package Week4;
public class Exam6 {
public static void main(String[] args) {
int[] array = new int[]{1, 2, 3, 4, 5};
for(int i=0; i<array.length; i++){
System.out.printf("%d ", array[i]);
}
System.out.println();
for(int value : array) {
System.out.printf("%d ", value);
}
}
}
// [출력]
// 1 2 3 4 5
// 1 2 3 4 5
label문
자주 사용하지는 않지만 간혹 다른 코드를 보면 쓰이는 경우가 있어 공부가 필요하다.
(label명) : for(;;){
}
label은 for문에 이름을 지정하여서 다중 for문을 사용하였을 때 원하는 for문으로 돌아가기 쉽게 만들기 위해 생긴 구문이다. 예를들어 다음 코드에서 가장 내부for문에서 가장 처음 for문으로 가려면 어떻게 해야할까?
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
for(int k=0; k<5; k++){
// ?????
}
}
}
break문을 여기저기 넣고 체크함수를 넣어서 밖으로 나갈 수 있게 만드는 등 코드가 상당히 복잡해진다. 이때 가장 처음 for문을 label로 지정을 하였다면 단순히 break (label명);
만으로 해당 반복문에서 벗어날 수 있도록 편의성을 제공한다.
package Week4;
public class Exam7 {
public static void main(String[] args) {
first: for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
for(int k=0; k<5; k++){
System.out.printf("i:%d, j:%d, k:%d\n", i, j, k);
if(j==1) break first;
}
}
}
}
}
// [출력]
// i:0, j:0, k:0
// i:0, j:0, k:1
// i:0, j:0, k:2
// i:0, j:0, k:3
// i:0, j:0, k:4
// i:0, j:1, k:0
'JAVA > whiteship-livestudy' 카테고리의 다른 글
상속 (0) | 2021.03.28 |
---|---|
클래스 (0) | 2021.03.24 |
연산자 (0) | 2021.03.16 |
자바의 데이터 타입, 변수 그리고 배열 (0) | 2021.03.15 |
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2021.03.11 |
- Total
- Today
- Yesterday