[JAVA] 제어문

김민기·2021년 5월 29일
0

Java

목록 보기
9/20
post-thumbnail

선택문

자바에서의 선택문은 if - else if - else 문과 switch - case 문으로 사용합니다.

선택문의 하위 코드블럭 실행문이 한줄일 경우 코드블럭으로 감싸지 않고 생략가능합니다.

if(true)
	doSomthing();

//==
if(true){
	doSomthing();
}

if - else if - else

if

자바에서 기본 조건문은 if 문으로 구현될 수 있습니다.

if(/*condition*/){
	//action
}

if문의 조건 내부에는 반드시 boolean 표현식만 입력될 수 있습니다. 표현식의 값이 true 인 경우에만 하위의 코드블럭이 수행됩니다.

else

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-if 문은 else 절의 사용에 boolean 조건식을 더한 꼴입니다. 마찬가지로 if 문에 종속적이며 if 문이 false 일 때 다른 조건식을 사용하기 위해 작성합니다.

else 와 마찬가지로 생략이 가능합니다.

if(true){
} else if(true){
} else{
}

switch - case

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

defaultif 문의 else 조건처럼 사용합니다. switch 내의 모든 case 가 수행되지 않았을 때, default 문이 수행됩니다.

break

switch - case 문은 case 문의 조건에 해당하는 절이 있다면 이하의 모든 구문을 실행합니다. 따라서 코드 흐름 중에 break 를 넣어 흐름을 제어합니다.

switch (a){
	case 1 : a++;
	case 2 : a++;
	case 3 : a++;
					 break;
	case 5 : a--;
}

//case가 수행되면 break을 만날 때까지 모든 하위 문장을 수행

향상된 switch - case

JVM 13부터 기존 switch - case 의 문제점을 해결하기 위해 몇가지 개선점이 추가된 switch - case 를 사용할 수 있게 되었습니다.

  • 다중값을 가진 case
  • 반환값을 위한 yield
  • 화살표 연산자( )
  • 코드 블럭

Muti - value Case

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");
}

yield

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

while 문은 작성된 boolean 표현식이 true 가 아닐 때까지 하위 블록을 반복하여 수행합니다.

//무한 루프
while(true){
//action
}

do - while

do - while 문은 do 하위의 코드블럭을 먼저 실행하고 while 의 조건에 따라 코드블럭을 반복합니다.

//action을 최소 한번 수행하고 이후 while 조건에 따라 반복
do{
	action();
} while(isTrue());

for

for 문은 for(초기식 ; 조건식 ; 증감식) { 코드블럭 } 으로 구성되어 있으며 다음과 같은 순서로 실행합니다

  1. 초기식 : 최초 1회만 수행
  2. 조건식 : boolean 표현식(expression)으로 계속 수행할지 판단
  3. 코드블럭 : 로직 수행
  4. 증감식 : 조건을 변경할 구문(statement) 수행

초기식, 조건식, 코드블럭, 증감식은 모두 생략이 가능하여 필요한 경우에만 작성할 수 있습니다.

//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 문과 다르게 for( 타입 레퍼런스 : Iterable 구현체) 와 같이 사용할 수 있습니다.

Itereble 구현 객체(컬렉션) 혹은 배열로 반복할 레퍼런스를 작성한 뒤 선언한 타입의 이름으로 복사(깊은)한 객체를 받은 후 반복을 수행합니다.

해당 객체의 iteratorhasNext() 메서드가 true 일 때까지 반복하며, 즉 해당 자료구조의 맨 처음 자료부터 맨 마지막까지 반복합니다.

//Iterable을 상속한 Collections의 상속 인터페이스 list, 구현체 ArrayList
List<Integer> list = new ArrayList<>();

for(Integer a : list){
	//a 는 해당 객체의 깊은 복사본이므로 원본 객체 수정 불가능
	a = 10;
}

break, continue

break

반복 조건문(while(), for())의 실행 블럭 내에 break 가 작성되게 되면 그 해당 조건문의 코드블럭을 빠져나옵니다

for(/*...*/){
	if(isTrue()) break;
}

while(/*...*/){
	if(isTrue()) break;
}

continue

반복 조건문 내에 작성하여 해당 코드블럭 내의 하위 코드 실행을 생략하고, 증감식 수행후 조건 검사를 다시 수행합니다.

//isTrue() 가 false 일 때만 출력
for(/*...*/){
	if(isTrue()) continue;
	System.out.println("출력");
}

while(/*...*/){
	if(isTrue()) continue;
	System.out.println("출력");
}

continue - loop

상위에 선언된 반복문에 : 로 이름을 지정해주어 해당 루프까지 continue 하게 해줍니다.

loop1 :
while(true){
	while(true){
		//isTrue()가 true 이면 상위의 반복문으로 이동하여 반복을 계속 진행
		//해당 루프의 출력 1 과 출력 2 모두 continue 됨
		if(isTrue()) continue loop1;
		System.out.println("출력1");
	}
	System.out.println("출력2");
}
profile
민기1

0개의 댓글