자바에서의 선택문은 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 를 사용할 수 있게 되었습니다.
caseyield→ )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");
}