6장. 제가 조건을 좀 따져요

공부하는 감자·2023년 11월 27일
0

자바의 신 3판

목록 보기
6/30

들어가기 전

『자바의 신 3판』 을 읽고 내용 정리 및 공부한 내용을 정리한 글입니다.
서적: 자바의 신 3판 구입처

내용 정리

조건문

IF

문법

if (boolean) 처리문장1;
else if (boolean) 처리문장2;
else 처리문장3;
  • 소괄호 안에는 boolean 형태의 결과가 있어야 한다.
  • 소괄호 안의 결과가 true 일 때 처리하는 처리문장을 적고 세미콜론으로 끝낸다.
  • 처리문장 없이 세미콜론만 적어도 오류없이 동작한다.
  • if 문이 false일 경우 else if를 검사하고, else if가 false일 경우 esle 를 실행한다.
    만약, if 나 else if 에서 true 여서 처리문장이 실행된다면, 그 이후는 검사하지 않고 종료된다.

사용할 수 있는 문법 (if-elseIf-else 모두 통용)

// 1) 소괄호 없이 쓰기: 1개의 처리문장을 처리할 수 있다
if (true) ;
if (true) 처리문장;

// 2) 소괄호로 묶기: 소괄호 내의 여러 개의 처리문장을 처리할 수 있다
if (true) {
	처리문장1;
	처리문장2;
	처리문장3;
	...
	처리문장N;
}

코드 가독성을 위해 한 줄만 작성하더라도 소괄호로 묶어주는 것이 좋다.

Switch

If는 보통 두 가지 이상의 값을 비교하거나, 단순히 true, false 여부만 확인하고자 할 때 많이 사용한다.

하지만, 학점이나 이자 계산 같이 하나의 값이 여러 범위에 걸쳐서 비교되어야 할 때에는, 하나의 값으로 분기하여 비교하는 switch 구문을 사용하는 것이 좋다.

문법

switch(비교대상변수) {
	case 점검값1"
	처리문장1;
	...
	break;
	case 점검값2"
	처리문장2;
	...
	break;
	...
	default:
	기본처리문장;
	...
	break;
}
  • 비교대상변수는 long을 제외한 정수형과 몇몇 특별한 타입(Enum, Character, Byte, Short, Integer)만이 들어갈 수 있다.
    • Java 6까지는 위 타입들만 사용할 수 있었는데, Java 7부터는 String도 사용할 수 있다.
  • default는 앞에 있는 조건에 맞지 않는 경우에 수행된다.
    • case문에서 한 번이라도 걸렸으면 default 는 실행되지 않고, 모든 case의 조건에 맞지 않는 경우에만 실행된다.
    • break를 사용하지 않았을 경우에는 default까지 내려와 같이 실행되기도 한다.

break

switch 문에서는 한 번 조건을 만족시켜 줬다면, 그 다음에 break가 올 때까지 어떤 case가 오든지 상관 안하고 계속 무사 통과하면서 실행하라는 것들을 실행한다.

그러므로 switch에서는 각 case를 마무리하고 싶다면 반드시 break를 사용해야 한다.

이렇게 여러 case를 실행할 수 있도록 한 것은 월별 일자를 계산해서 반환하는 코드처럼, 특정 조건에 따른 처리를 해야할 때 사용하기 좋도록 만들어졌다.

반복문

반복문이라는 것은 지정한 횟수만큼 반복하거나, 조건에 맞을 때까지 반복하는 문장을 말한다.

while

while(boolean조건) {
	처리문장;
	...
}

boolean 조건 값이 true일 경우에만 중괄호 안에 있는 내용들이 수행된다. 처음부터 조건값이 false 라면 아예 while 문장이 수행되지 않는다.

중괄호가 끝난 이후에 다시 위로 올라가 boolean 조건을 확인해보고, 이 값이 false가 될 때까지 중괄호 안의 내용이 계속 실행된다. false가 되면 중괄호를 빠져나간다.

반복을 끝내는 법

  • while의 boolean 조건을 특정 조건에서 false가 되도록 하고, 중괄호 안에서 조건을 맞춰준다.
    // 예를 들어, loop를 다섯 번 도는 건 아래처럼 구현한다.
    while (loop < 6) { loop++; }
  • break를 사용한다.
    • break를 사용하면 현재 수행중인 중괄호에서 빠져나간다. 원하는 시점에 빠져나가도록 위치를 신경써서 배치한다.

continue

continue 뒤의 있는 문장은 건너 뛰고, “boolean 조건” 점검 부분으로 다시 가라는 의미이다.

이때, 위치를 잘못 사용한다면 무한루프에 빠질 수 있으니 조심해야 한다.

💡 무한루프 Infinite loop
조건이 false인 시점이 오지 않아서, 계속해서 조건을 검사하고 true이니 내용을 실행하는 작업을 반복하는 것이다.

이 작업은 자바 프로세스가 멈출 때까지 계속 반복되므로, 서비스 장애로 연결될 수 있으니 조심해야 한다.

do-while

적어도 한 번은 반복문장이 실행된다. while문은 조건에 한 번도 맞지 않으면 한 번도 실행되지 않지만, do-while 문은 “한 번은 꼭 실행시키고 싶을 때 사용”한다.

do {
	처리문장;
	...
} while(boolean조건);

이때, while의 소괄호 뒤에 세미콜론을 반드시 입력해줘야 한다.

for

for(초기화; 종료조건; 조건 값 증가) {
	반복문장
}
  1. “초기화”라고 되어 있는 부분에서는 변수를 초기화 한다.
  2. “종료조건” 구문이 수행된다. 이 종료 조건 내의 결과는 if 문과 동일하게 boolean 타입만 위치할 수 있다. true 이면 for 루프 내의 반복문장이 수행되고, 그렇지 않으면 for 루프는 종료된다.
  3. 중괄호 내의 작업이 종료되면 “조건 값 증가”가 수행된다. 보통은 “초기화”에서 선언한 변수를 여기서 증가시킨다.
  4. “종료조건” 결과가 false일 때까지 2~3번까지를 반복 수행한다.

JDK5 부터는 for 루프를 쉽게 사용할 수 있게 되었다. 이 방법은 7장에서 소개된다.

label

두 개 이상의 for나 while 루프가 있을 때 사용되는 예약어로, 많이 사용하지는 않는다. 두 개 이상의 반복문을 사용했을 때, 바깥쪽 루프의 시작점으로 이동하려고 할 때 label을 사용한다

아래처럼 반복문 안에 반복문을 사용했을 경우 “2중 루프”라고 부른다.

for(int i=0; i<10; i++) {
	for (int j=0; j<10; j++ {
		처리문장;
	}
}

다음과 같이 바로 앞에 원하는 이름과 콜론을 입력한 후, “continue 작성한 이름”처럼 사용하면 label을 지정한 부분으로 올라간다. label의 루프 내의 문장은 전혀 수행되지 않는다

startLabel:
for(int i=0; i<10; i++) {
	for (int j=0; j<10; j++ {
		if (j==4) continue startLabel;
		처리문장;
	}
}

정리해 봅시다.

Q. if 문장의 소괄호 안에는 어떤 타입의 결과가 제공되어야 하나요?

Me: boolean 타입

Q. if 조건에 맞지 않는 모든 경우를 처리할 때 사용하는 예약어는 뭔가요?

Me: else

Q. switch를 사용할 수 있는 기본 자료형의 타입에는 어떤 것들이 있나요?

Me: long을 제외한 정수형과 몇몇 참조 자료형

Q. switch블록 안에서 비교 대상값 앞에 사용하는 예약어는 무엇인가요?

Me: case

Q. switch 조건을 빠져나가도록 하는 예약어는 무엇인가요?

Me: break

Q. switch 조건들에 맞지 않을 때 기본 처리를 하기 위한 예약어는 무엇인가요?

Me: default

Q. while 문의 소괄호 안에는 어떤 형태의 결과가 제공되어야 하나요?

Me: boolean 타입

Q. while 문을 무조건 한번은 실행하게 하려면 어떻게 해야 하나요?

Me: do-while을 사용한다.

Q. while문을 마음대로 빠져나가게 하려면 어떤 예약어를 사용하면 되나요?

Me: break

Q. while문의 중간에 while문의 소괄호 점검 구문으로 건너뛰도록 할 때 사용하는 예약어는 무엇인가요?

Me: continue

Q. for루프의 소괄호안의 가장 첫 구문(첫 세미 콜론 앞의 문장)은 for루프가 수행되는 동안 몇 번 수행되나요?

Me: 초기화는 최초에만 1회 수행된다.

Q. for루프의 소괄호 안의 중간에 있는 구문은 어떤 타입의 결과가 제공되어야 하나요?

Me: boolean 타입

Q. for루프의 소괄호 안의 마지막에 있는 구문에서는 어떤 작업을 수행하나요?

Me: 조건 값의 증가 혹은 감소

질문

💡 책에 있는 내용이 아닙니다.

책을 읽으며 설명이 더 필요하거나, 추가로 궁금한 점에 대해 질문 형식으로 작성 후, 답을 구해보고 있습니다.
참고한 사이트나 영상은 [출처]로 달아두었으며, 오류 지적은 언제나 환영합니다.

Q. switch 에서 break 를 중간에 써주었을 경우 어떻게 동작하는가?

책에서는 중간에 넣으면 원하지 않는 결과가 나올 수도 있다고 하는데, 실제로 돌려봤을 경우엔 별다른 문제가 없어 보인다.

  • 중간에 넣었을 경우
    public class ControlOfFlow {
    
        public static void main(String[] args) {
            ControlOfFlow cal = new ControlOfFlow();
            for (int i=0; i< 15; i++) {
                cal.switchCalendar(i+1);
            }
        }
    
        public void switchCalendar(int month) {
    
            switch(month) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    System.out.println(month + " has 31 days.");
                    break;
                default:
                    System.out.println(month + " is not a month.");
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    System.out.println(month + " has 30 days.");
                    break;
                case 2:
                    System.out.println(month + " has 28 or 29 days.");
                    break;
            }
        }
    }

검색해 봤을 때도 상관없다고 하는 사람들이 많았다. 그렇지만 가독성을 위해선 맨 마지막에 넣는게 좋아 보인다.

Q. switch 에서 default 는 쓰지 않아도 된다는 사람들이 있는데?

물론 동작하는 데에는 문제가 없다. 일치하는 조건이 없으면 아무 동작하지 않고 종료하는 경우엔 더더욱. 하지만 가독성, 그리고 보다 안전한 코드를 위해서는 작성하는게 좋다고 한다.

Q. 다중 반복문을 사용하는 것에 대한 생각

일을 배우면서 최대 2중까지만 사용하는게 좋다고 배웠다. 그에 관해 '왜 그런지' 생각해서 정리해봤다.

먼저, 추후 시간복잡도를 배우면 알겠지만, 중첩 반복문을 쓰면 2중이면 N2N^2, 3중이면 N3N^3으로 복잡도가 증가할 수 있다.

또한, 가독성도 떨어지고 중첩될 수록 실수하여 잘못된 코드를 짤 수도 있다. 이건 아무래도 연산이 복잡해지니까….

그렇다고 절대 사용하면 안 된다! 는 말은 아니다. 때로는 삼중 반복문이 더 효율적일 때가 있지 않겠는가?

가능한 피하되, 꼭 필요한 상황에서는 쓰도록 하자.

번외

그리고 이건 관련 내용에 대해 다른 사람의 의견을 찾아보다가 추가로 알게 된 것이다.

메모리 접근 관점에서 본다면 중첩 반복문을 쓸 때에는 가장 잘 변하지 않는 변수를 바깥쪽에, 자주 변하는 변수를 안쪽에 쓰는게 성능적으로 좋다고 한다.

이는 참고 사이트를 읽어보도록 하자.

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글