『자바의 신 3판』 을 읽고 내용 정리 및 공부한 내용을 정리한 글입니다.
서적: 자바의 신 3판 구입처내용 정리
if (boolean 값) 처리문장1;
else if (boolean 값) 처리문장2;
else 처리문장3;
// 1) 소괄호 없이 쓰기: 1개의 처리문장을 처리할 수 있다
if (true) ;
if (true) 처리문장;
// 2) 소괄호로 묶기: 소괄호 내의 여러 개의 처리문장을 처리할 수 있다
if (true) {
처리문장1;
처리문장2;
처리문장3;
...
처리문장N;
}
코드 가독성을 위해 한 줄만 작성하더라도 소괄호로 묶어주는 것이 좋다.
If는 보통 두 가지 이상의 값을 비교하거나, 단순히 true, false 여부만 확인하고자 할 때 많이 사용한다.
하지만, 학점이나 이자 계산 같이 하나의 값이 여러 범위에 걸쳐서 비교되어야 할 때에는, 하나의 값으로 분기하여 비교하는 switch 구문을 사용하는 것이 좋다.
switch(비교대상변수) {
case 점검값1"
처리문장1;
...
break;
case 점검값2"
처리문장2;
...
break;
...
default:
기본처리문장;
...
break;
}
switch 문에서는 한 번 조건을 만족시켜 줬다면, 그 다음에 break가 올 때까지 어떤 case가 오든지 상관 안하고 계속 무사 통과하면서 실행하라는 것들을 실행한다.
그러므로 switch에서는 각 case를 마무리하고 싶다면 반드시 break를 사용해야 한다.
이렇게 여러 case를 실행할 수 있도록 한 것은 월별 일자를 계산해서 반환하는 코드처럼, 특정 조건에 따른 처리를 해야할 때 사용하기 좋도록 만들어졌다.
반복문이라는 것은 지정한 횟수만큼 반복하거나, 조건에 맞을 때까지 반복하는 문장을 말한다.
while(boolean조건) {
처리문장;
...
}
boolean 조건 값이 true일 경우에만 중괄호 안에 있는 내용들이 수행된다. 처음부터 조건값이 false 라면 아예 while 문장이 수행되지 않는다.
중괄호가 끝난 이후에 다시 위로 올라가 boolean 조건을 확인해보고, 이 값이 false가 될 때까지 중괄호 안의 내용이 계속 실행된다. false가 되면 중괄호를 빠져나간다.
// 예를 들어, loop를 다섯 번 도는 건 아래처럼 구현한다.
while (loop < 6) { loop++; }
continue 뒤의 있는 문장은 건너 뛰고, “boolean 조건” 점검 부분으로 다시 가라는 의미이다.
이때, 위치를 잘못 사용한다면 무한루프에 빠질 수 있으니 조심해야 한다.
💡 무한루프 Infinite loop
조건이 false인 시점이 오지 않아서, 계속해서 조건을 검사하고 true이니 내용을 실행하는 작업을 반복하는 것이다.
이 작업은 자바 프로세스가 멈출 때까지 계속 반복되므로, 서비스 장애로 연결될 수 있으니 조심해야 한다.
적어도 한 번은 반복문장이 실행된다. while문은 조건에 한 번도 맞지 않으면 한 번도 실행되지 않지만, do-while 문은 “한 번은 꼭 실행시키고 싶을 때 사용”한다.
do {
처리문장;
...
} while(boolean조건);
이때, while의 소괄호 뒤에 세미콜론을 반드시 입력해줘야 한다.
for(초기화; 종료조건; 조건 값 증가) {
반복문장
}
JDK5 부터는 for 루프를 쉽게 사용할 수 있게 되었다. 이 방법은 7장에서 소개된다.
두 개 이상의 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;
처리문장;
}
}
Me: boolean 타입
Me: else
Me: long을 제외한 정수형과 몇몇 참조 자료형
Me: case
Me: break
Me: default
Me: boolean 타입
Me: do-while을 사용한다.
Me: break
Me: continue
Me: 초기화는 최초에만 1회 수행된다.
Me: boolean 타입
Me: 조건 값의 증가 혹은 감소
💡 책에 있는 내용이 아닙니다.
책을 읽으며 설명이 더 필요하거나, 추가로 궁금한 점에 대해 질문 형식으로 작성 후, 답을 구해보고 있습니다.
참고한 사이트나 영상은 [출처]로 달아두었으며, 오류 지적은 언제나 환영합니다.
책에서는 중간에 넣으면 원하지 않는 결과가 나올 수도 있다고 하는데, 실제로 돌려봤을 경우엔 별다른 문제가 없어 보인다.
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;
}
}
}
검색해 봤을 때도 상관없다고 하는 사람들이 많았다. 그렇지만 가독성을 위해선 맨 마지막에 넣는게 좋아 보인다.
물론 동작하는 데에는 문제가 없다. 일치하는 조건이 없으면 아무 동작하지 않고 종료하는 경우엔 더더욱. 하지만 가독성, 그리고 보다 안전한 코드를 위해서는 작성하는게 좋다고 한다.
일을 배우면서 최대 2중까지만 사용하는게 좋다고 배웠다. 그에 관해 '왜 그런지' 생각해서 정리해봤다.
먼저, 추후 시간복잡도를 배우면 알겠지만, 중첩 반복문을 쓰면 2중이면 , 3중이면 으로 복잡도가 증가할 수 있다.
또한, 가독성도 떨어지고 중첩될 수록 실수하여 잘못된 코드를 짤 수도 있다. 이건 아무래도 연산이 복잡해지니까….
그렇다고 절대 사용하면 안 된다! 는 말은 아니다. 때로는 삼중 반복문이 더 효율적일 때가 있지 않겠는가?
가능한 피하되, 꼭 필요한 상황에서는 쓰도록 하자.
그리고 이건 관련 내용에 대해 다른 사람의 의견을 찾아보다가 추가로 알게 된 것이다.
메모리 접근 관점에서 본다면 중첩 반복문을 쓸 때에는 가장 잘 변하지 않는 변수를 바깥쪽에, 자주 변하는 변수를 안쪽에 쓰는게 성능적으로 좋다고 한다.
이는 참고 사이트를 읽어보도록 하자.