본문 바로가기
진행중인 학습/자바의 정석_학습

자바의 정석_기초편 CHAPTER 4 (230804)

by 트레비봄 2023. 8. 4.
728x90
자바의 정석_기초편 CHAPTER 4 (230804)

4-1. if문.

프로그램의 흐름(flow)을 바꾸는 역할을 하는 문장들을 '제어문 (control statement)' 라고 한다.

제어문에는 '조건문과 반복문' 이 있는데, 조건문은 조건에 따라 다른 문장이 수행되도록 하고, 반복문은 특정 문장들을 반복해서 수행한다.

 

if문가장 기본적인 조건문, '조건식' 과 '괄호{}' 로 이루어져 있다.

'if'의 뜻이 '만일 ~ 이라면' 이므로 '만일 (if) 조건식이 참 (true) 라면, 괄호 {} 안의 문장들을 수행하라' 라는 의미로 이해하자.

if (조건식) {
	// 조건식이 true 일 때 수행될 문장들을 적는다.
}
다음과 같이 if 문이 있을 때, 조건식 'score > 60'true 라면 괄호 {} 안의 문장이 수행되어 화면에 '합격입니다.' 라고 출력되고 거짓 (false) 이면, if 문 다음의 문장으로 넘어간다.

if (score > 60) {
	System.out.println("합격입니다.");
}
위 if 문의 조건식의 과정을 단계별로 보자.

변수 score 의 값을 80으로 가정하였다.

	score > 60
    80 > 60
    true	// 조건식이 참(true) 이므로 괄호{} 안의 문장이 실행된다.

위 조건식의 결과가 true. >> if문 괄호 {} 안의 문장이 실행된다. false면 실행되지 않는다.

 

4-2. 조건식의 다양한 예

조건식 조건식이 참일 조건
90 <= x && <= 100 정수 x가 90이상 100이하 일 때
x < 0 || x > 100 정수 x가 0보다 작거나 100보다 클 때
x%3==0 && x%2!=0 정수 x가 3의 배수지만, 2의 배수는 아닐 때
ch==' y ' || ch== ' Y ' 문자 ch가 'y' 또는 'Y' 일 때
ch=='  ' || ch== ' \t ' || ch == ' \n ' 문자 ch가 공백이거나 탭 또는 개행 문자일 때
' A ' <= ch && cj <= ' Z ' 문자 ch가 대문자일 때
' a ' <= ch && ch <= ' z ' 문자 ch가 소문자일 때
' 0 ' <= ch && ch <= ' 9 ' 문자 ch가 숫자일 때
str.equals("yes") 문자열 str의 내용이 "yes" 일 때 (대소문자 구분)
str.equalsIgnoreCase("yes") 문자열 str의 내용이 "yes" 일 때 (대소문자 구분안함)

if 문에 사용되는 조건식은 일반적으로 비교 연산자와 논리 연산자로 구성.

위의 표들은 기본적인 것들로 예시이다.

 

주의.

조건식을 작성할 때 등가비교 연산자 == 대신 대입 연산자 = 를 사용하는 것.

4-3. 블럭 { }

괄호 { } 를 이용해 여러 문장을 하나의 단위로 묶을 수 있는데, 이를 블럭이라한다.

{ 로 시작해서 } 로 끝나는데, 문장의 끝을 의미하는 세미콜론 ( ; ) 을 붙이지 않아야 한다. 주의!!

 

블럭 안에는 여러 문장을 넣는 것이 일반적이지만, 한 문장 넣기 또는 아무런 문장도 넣지 않을 수 있다.

만일 블럭 내의 문장이 하나 뿐 일 때는  괄호 { } 를 생략 가능하다.

4-4. if - else 문.

if 문의 변형인 if - else 문의 구조는 다음과 같다. if 문에 'else블럭' 이 더 추가되었다. 'else'의 뜻이 '그 밖의 다른' 이므로 조건식의 결과가 참이 아닐 때, 즉 거짓일 때 else 블럭의 문장을 수행하라는 뜻이다.

if (조건식) {
	// 조건식이 참 (true) 일 때 수행될 문장을 적는다.
} else {
	// 조건식이 거짓 (false) 일 때 수행될 문장을 적는다.
}

4-5. if - else if 문.

if - else 문두 가지 경우 중 하나가 수행되는 구조이다. 

만약 처리해야 할 경우의 수가 셋 이상인 경우에는 어떻게 해야 할까?

>> 한 문장에 여러 개의 조건식을 쓸 수 있는 'if - else if' 문을 사용하면 된다.

if (조건식 1) {
	// 조건식1의 연산결과가 참 (true) 일 때 수행될 문장을 적는다.
} else if (조건식 2) {
	// 조건식2의 연산결과가 거짓 (false) 일 때 수행될 문장을 적는다.
} else if (조건식 3) {			// 여러 개의 else if 를 사용할 수 있다.
		// 조건식 3의 연산결과가 참 일 때 수행될 문장들을 적는다.
} else {					// 마지막은 보통 else 블럭으로 끝나며, else 블럭은 생략 가능하다.
		// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
}

이런 순서로 진행된다.

1. 결과가 참인 조건식을 만날 때까지 첫 번째 조건식부터 순서대로 평가한다. (첫 번째 조건식은 거짓, 두번째 조건식으로 넘어간다.)

2. 참인 조건식을 만나면, 해당 블럭 { }의 문장들을 수행한다.

3. if - else if문 전체를 빠져나온다.

4-7. 중첩 if 문.

if 문의 블럭 내에 또 다른 if 문을 포함시키는 것이 가능한데, 이것을 중첩 if 문이라 부른다. 횟수의 제한은 없다.

if (조건식 1) {
		// 조건식 1의 연산결과가 true 일 때 수행될 문장들을 적는다.
        if (조건식 2) {
        		// 조건식 1과 조건식 2가 모두 true일 때 수행될 문장들.
        } else {
        		// 조건식 1이 true 이고, 조건식 2가 false 일 때 수행되는 문장들
        }
} else {	
		// 조건식 1이 false 일 때 수행되는 문장들
}

내부의 if 문은 외부의 if문보다 안쪽으로 들여쓰기 해서 두 if 문의 범위가 명확히 구분될 수 있도록 작성해야 한다.

더군다나 중첩 if문에선 괄호 생략에 더욱 조심해야 한다.

4-9. switch문.

if문과 달리 switch문은 단 하나의 조건식으로 많은 경우의 수를 처리 할 수 있고, 표현도 간결하므로 알아보기 쉽다.

그래서 처리할 경우의 수가 많은 경우에는 if문 보다 switch문으로 작성하는 것이 좋다.

다만, 제약조건이 있기 떄문에 경우의 수가 많아도 어쩔 수 없이 if 문으로 작성해야 하는 경우가 있다.

 

switch문은 조건식을 먼저 계산한 다음, 그 결과와 일치하는 case문으로 이동한다. 이동한 case 문 아래에 있는 문장들을 수행하며, break 문을 만나면 전체 switch문을 빠져나가게 된다.

switch (조건식) {
	case1 :
    		// 조건식의 결과가 값1과 같을 경우 수행될 문장들.
            // ...
            break;
    case2 : 
    		// 조건식의 결과가 값1과 같을 경우 수행될 문장들. 
            // ...
            break;
    // ...
    default :
    		// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
            // ...
}

순서는 이렇다. (위의 코드를 보면서 이해)

1. 조건식을 계산한다. (>> switch (조건식) )

2. 조건식의 결과과 일치하는 case 문으로 이동한다. ( case 값2로 이동 )

3. 이후의 문장들을 수행한다. (break; // switch문을 벗어남.)

4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나간다. (마무리)

 

만일 조건식의 결과가 일치하는 case 문이 하나도 없는 경우에는 default문으로 이동.

default문은 if문의 else블럭과 같은 역할을 한다고 보면 이해가 될 것.

defalut문의 위치는 어디든 상관없다. 보통은 마지막에 놓기 때문에 break문을 쓰지 않아도 된다.

주의해야할 것은 각 case문의 마지막에 break문을 빼먹는 실수를 하지 않도록 주의해야한다.

4-10. switch문의 제약조건.

switch문의 조건식은 결과값이 반드시 정수이어야 하고, 이 값과 일치하는 case문으로 이동하기 때문에 case문의 값이 역시 정수어야한다. 그리고 중복되지 않아야 한다.

같은 값의 case문이 여러 개이면, 어디로 이동해야할 지 알 수 없기 때문이다.

게다가 case문의 값은 반드시 상수이어야 한다. 변수나 실수는 case문의 값으로 사용할 수 없다.

 

switch문의 제약조건

1. switch문의 조건식 결과는 정수 또는 문자열 이어야 한다.

2. case문의 값은 정수 상수(문자포함), 문자열만 가능하고, 중복은 되면 안된다.

4-12. Math.random()

임의의 수를 얻기 위해서는 Math.random() 을 사용해야 하는데, 이 메서드는 0.0과 1.0 사이의 범위에 속하는 하나의 double값을 반환한다.

0.0은 범위에 포함되고, 1.0 은 포함되지 않는다.

0.0 <= Math.random() < 1.0
만일 13 사이의 정수를 구하길 원한다면, 다음과 같은 과정으로 난수를 구하는 식을 얻을 수 있다.

1) 각 변에 3을 곱한다.

0.0 * 3 <= Math.random() * 3 < 1.0 * 3
	0.0 <= Math.random() * 3 < 3.0
    
2) 각 변을 int형으로 변환한다.

(int)0.0 <= (int)(Math.random() * 3) < (int)3.0
	 0	 <= (int)(Math.random() * 3) < 3
     
3) 각 변에 1을 더한다.

0 + 1 <= (int)(Math.random() * 3) + 1 < 3 + 1
	1 <= (int)(Math.random() * 3) + 1 < 4
위의 방법으로 13 사이의 정수를 구할 수 있다. 1은 포함, 4는 포함x

4-13. for 문.

for 문과 while 문은 구조와 기능이 유사하여 어느 경우에나 서로 변환이 가능하다.

반복 횟수를 알고 있을 때 for문, 모를 땐 while문을 사용한다.

for(int i = 1; i <= 5; i++) {
	System.out.println("I can do it.");
}

위 for문은 블럭 { } 내의 문장을 5번 반복한다. 즉 "I can do it" 이란 문장이 5번 출력되는 것이다.

변수 i에 1를 저장한 다음, 매 반복마다 i의 값을 1씩 증가시킨다. 그러다 i의 값이 5가 넘으면 조건식 i <= 5 가 거짓이 되어 반복을 마친다.

 

for문의 구조와 수행순서.

for 문은 아래와 같이 '초기화' '조건식' '증감식' '블럭 { }' 모두 4부분으로 이루어져있고, 조건식이 참인 동안 블럭 { } 내의 문장들을 반복하다 거짓이 되면 반복문을 벗어난다.

for (초기화; 조건식; 증감식) {
			// 조건식이 참인 동안 수행될 문장들을 적는다.
}
  1. 초기화가 수행, 
  2. 조건식이 참인 동안 조건식 -> 수행될 문장 -> 증감식 순서로 계속 반복
  3. 조건식이 거짓이 되면 for문 전체를 빠져나간다.

초기화

반복문에 사용될 변수를 초기화하는 부분이며 처음에 한번만 수행.

 

조건식

참이면 반복을 계속, 거짓이면 반복을 중단 후 for문을 벗어난다.

 

증감식

반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식.

 

4-15. 중첩 for문

for 문 안에 또 다른 for문을 포함시키는 것이 가능하며 이를 중첩 for 문이라고 부른다.

중첩 횟수의 제한은 거의 없다.

 

4-16. while 문.

for 문에 비해 while 문은 구조가 간단하다. if 문처럼 조건식과 블럭 { } 만으로 이루어져 있다.

다만 if문과 달리 while 문은 조건식 '참 인 동안', 즉 조건식이 거짓일 될 때까지 블럭 { } 내의 문장을 반복한다.

while (조건식) {
		// 조건식의 연산결과가 참 인 동안, 반복될 문장들을 적는다.
}

while 문은 먼저 조건식을 평가해서 조건식이 거짓이면 문장 전체를 벗어나고, 참이면 블럭 { }내 문장을 수행하고 다시 조건식으로 돌아간다. 조건식이 거짓이 될 때까지 이 과정이 계속 반복된다.

  1. 조건식이 참 이면 블럭 { } 안으로 들어가고, 거짓이면 while 문을 벗어난다.
  2. 블럭 { } 의 문장을 수행하고 다시 조건식으로 돌아간다.

 

for문과 while문의 비교.

// 초기화, 조건식, 증감식
for(int i = 1; i <= 10; i++) {
	System.out.println(i);
}
 

int i = 1; // 초기화

while(i <= 10) { // 조건식
	System.out.println(i);
    i++; // 증감식
}

4-19. do - while 문.

while문의 변형으로 기본적인 구조는 while 문과 같으나 조건식과 블럭 { } 의 순서를 바꿔놓은 것이다.

그래서 while 문과 반대로 블럭 { }을 먼저 수행한 후에 조건식을 평가한다.

do {
		// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다. (처음 한 번은 무조건 실행)
} while (조건식);

4-20. break 문.

break 문자신이 포함된 가장 가까운 반복문을 벗어난다. 주로 if 문과 함께 사용되어 특정 조건을 만족할 때 반복문을 벗어나게 한다.

4-21. continue 문.

반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중 continue 문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for문의 경우 증감식으로 이동하며, while 문과 do - while 문의 경우 조건식으로 이동한다.

 

break문과의 차이는 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이다.

주로 if문과 함께 사용되어 특정 조건을 만족하는 경우에 continue문 이후의 문장들을 수행하지 않고 다음 반복으로 넘어가 계속 진행하도록 한다.

전체 반복 중 특정조건을 만족하는 경우를 제외하고자 할 때 유용하다.

4-23. 이름 붙은 반복문.

break 문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우, break문으로 중첩 반복문을 완전히 벗어날 수 없다. 이땐 중첩 반복문 앞에 이름을 붙이고 break문과 continue 문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.

 

230804 학습.

728x90