자바에서의 선택문은 if - else if - else
문과 switch - case
문으로 사용합니다.
선택문의 하위 코드블럭 실행문이 한줄일 경우 코드블럭으로 감싸지 않고 생략가능합니다.
if(true)
doSomthing();
//==
if(true){
doSomthing();
}
자바에서 기본 조건문은 if
문으로 구현될 수 있습니다.
if(/*condition*/){
//action
}
if문의 조건 내부에는 반드시 boolean
표현식만 입력될 수 있습니다. 표현식의 값이 true
인 경우에만 하위의 코드블럭이 수행됩니다.
else
문은 if
문의 조건이 false
일 때만 수행되는 구문입니다. 마찬가지로 else
절 이후 코드블럭으로 구성되어 있습니다.
또한 else
문은 생략이 가능합니다.
else{
//action
}
이 때 else
문은 반드시 if
문에 종속적이여야 하며 if
문과 연속적으로 표현되어야 합니다.
//올바른 사용
if(true){
//action
} else{
//action
}
//잘못된 사용
if(true){
//action
}
int a = 10;
else{
}
//syntax error
else-if
문은 else
절의 사용에 boolean
조건식을 더한 꼴입니다. 마찬가지로 if
문에 종속적이며 if
문이 false
일 때 다른 조건식을 사용하기 위해 작성합니다.
else
와 마찬가지로 생략이 가능합니다.
if(true){
} else if(true){
} else{
}
switch - case
는 표현식의 반환값을 통한 다중 분기를 위해 사용되는 구문입니다.
switch
문에 표현식을 작성하고 하위 코드블럭 case
문에 리터럴을 작성하여 블록을 수행시킬 수 있습니다.
이 때 switch
의 표현식 반환값은 정수형 primitive
타입, 래퍼 클래스, String
또는 enum
이어야 합니다.
Object a = "Hello";
String b = "Hello";
//에러, 조건식의 타입 불일치
switch(a){
}
switch((String)a){
case "Hello" :
//do something..
break;
//에러, 반드시 리터럴 값을 가져야함
case b :
}
default
는 if
문의 else
조건처럼 사용합니다. switch
내의 모든 case
가 수행되지 않았을 때, default
문이 수행됩니다.
switch - case
문은 case
문의 조건에 해당하는 절이 있다면 이하의 모든 구문을 실행합니다. 따라서 코드 흐름 중에 break
를 넣어 흐름을 제어합니다.
switch (a){
case 1 : a++;
case 2 : a++;
case 3 : a++;
break;
case 5 : a--;
}
//case가 수행되면 break을 만날 때까지 모든 하위 문장을 수행
JVM 13부터 기존 switch - case
의 문제점을 해결하기 위해 몇가지 개선점이 추가된 switch - case
를 사용할 수 있게 되었습니다.
case
yield
→
)case
문의 ,
구분으로 한번에 여러 조건을 사용할 수 있게 되었습니다.
//이전 방식
switch(score){
case 10 :
case 9 :
case 8 :
System.out.println("A");
break;
case 7 :
case 6 :
case 5 :
System.out.println("B");
break;
default :
System.out.println("C");
}
//JVM 13
switch(score){
case 10, 9, 8 :
System.out.println("A");
break;
case 7, 6, 5 :
System.out.println("B");
break;
default :
System.out.println("C");
}
switch
문 내에 사용하여 switch
문의 반환값을 갖게 합니다. 따라서 switch
문을 표현식으로 사용할 수 있습니다.
System.out.println(
switch(score){
case 10, 9, 8 :
yield "A";
case 7, 6, 5 :
yield "B";
default :
yield "C";
});
String str =
switch(score){
case 10, 9, 8 :
yield "A";
case 7, 6, 5 :
yield "B";
default :
yield "C";
}
case
내에 코드블럭을 사용할 수 있습니다.
화살표 연산자로 case
를 표현하여 표현식, 구문, 코드 블럭을 사용합니다.
String grade;
switch(score){
case 10, 9, 8 -> grade = "A";
case 7, 6, 5 -> grade = "B";
default -> grade = "C";
}
참고
https://docs.oracle.com/en/java/javase/13/language/switch-expressions.html
자바의 반복문은 while
혹은 for
문으로 구성되게 됩니다
while
문은 작성된 boolean
표현식이 true
가 아닐 때까지 하위 블록을 반복하여 수행합니다.
//무한 루프
while(true){
//action
}
do - while
문은 do
하위의 코드블럭을 먼저 실행하고 while
의 조건에 따라 코드블럭을 반복합니다.
//action을 최소 한번 수행하고 이후 while 조건에 따라 반복
do{
action();
} while(isTrue());
for
문은 for(초기식 ; 조건식 ; 증감식) { 코드블럭 }
으로 구성되어 있으며 다음과 같은 순서로 실행합니다
boolean
표현식(expression)으로 계속 수행할지 판단초기식, 조건식, 코드블럭, 증감식은 모두 생략이 가능하여 필요한 경우에만 작성할 수 있습니다.
//for 구조
for(int a = 1; a < 10 ; a++){
System.out.println(a);
}
//모두 생략, 아무 행위가 없지만 무한루프
for(;;);
단 1회만 수행되는 구문으로 for
루프 내에서만 참조될 수 있는 지역변수를 선언할 수 있습니다.
또한 하나의 type
을 갖는 변수만 선언 가능하며 ,
로 같은 타입의 여러 변수를 선언할 수 있습니다.
for(int a = 10, b;;);
//error
for(Object o, int a;;);
boolean
표현식(expression)으로 작성하며 해당 조건에 따라 코드블럭을 반복합니다.
for(int a = 10; a < 10 ;);
조건문이 true
라면 수행할 코드 블록을 작성합니다
기본적으로는 증감연산을 수행하지만 모든 statement를 증감식에 선언할 수 있습니다. 코드 블럭 수행 이후 수행할 식을 작성합니다.
,
로 구분하여 여러 statement를 작성할 수 있습니다.
for(int a = 10; a < 10; a++, myMethod(), b += 20);
기존의 for
문과 다르게 for( 타입 레퍼런스 : Iterable 구현체)
와 같이 사용할 수 있습니다.
Itereble
구현 객체(컬렉션) 혹은 배열로 반복할 레퍼런스를 작성한 뒤 선언한 타입의 이름으로 복사(깊은)한 객체를 받은 후 반복을 수행합니다.
해당 객체의 iterator
의 hasNext()
메서드가 true
일 때까지 반복하며, 즉 해당 자료구조의 맨 처음 자료부터 맨 마지막까지 반복합니다.
//Iterable을 상속한 Collections의 상속 인터페이스 list, 구현체 ArrayList
List<Integer> list = new ArrayList<>();
for(Integer a : list){
//a 는 해당 객체의 깊은 복사본이므로 원본 객체 수정 불가능
a = 10;
}
반복 조건문(while(), for()
)의 실행 블럭 내에 break
가 작성되게 되면 그 해당 조건문의 코드블럭을 빠져나옵니다
for(/*...*/){
if(isTrue()) break;
}
while(/*...*/){
if(isTrue()) break;
}
반복 조건문 내에 작성하여 해당 코드블럭 내의 하위 코드 실행을 생략하고, 증감식 수행후 조건 검사를 다시 수행합니다.
//isTrue() 가 false 일 때만 출력
for(/*...*/){
if(isTrue()) continue;
System.out.println("출력");
}
while(/*...*/){
if(isTrue()) continue;
System.out.println("출력");
}
상위에 선언된 반복문에 :
로 이름을 지정해주어 해당 루프까지 continue
하게 해줍니다.
loop1 :
while(true){
while(true){
//isTrue()가 true 이면 상위의 반복문으로 이동하여 반복을 계속 진행
//해당 루프의 출력 1 과 출력 2 모두 continue 됨
if(isTrue()) continue loop1;
System.out.println("출력1");
}
System.out.println("출력2");
}