[Chapter 4] 조건문과 반복문

slchoi·2022년 1월 6일
0

자바의 정석

목록 보기
9/19
post-thumbnail

'자바의 정석 3rd Edition'을 공부하며 정리한 내용입니다.

제어문

  • 프로그램의 흐름(flow)을 바꾸는 역할을 하는 문장들
  • 조건문과 반복문이 있음
    • 조건문: 조건에 따라 다른 문장이 수행
    • 반복문: 특정 문장들을 반복해서 수행

1. 조건문 - if, switch


  • 조건식과 문장을 포함하는 블럭{}으로 구성
  • 조건식의 연산결과에 따라 실행할 문장이 달라져 프로그램의 실행흐름을 변경할 수 있음
  • if문과 switch문이 있으며 if문이 많이 사용됨
    • 처리할 경우의 수가 많을 때는 switch문이 효율적이지만 if문보다 제약이 많음

1.1 if문

  • 조건식이 true이면 괄호{} 안의 문장들을 수행하고 false일 경우 수행하지 않음
if (조건식) {
	// 조건식이 true일 때 수행될 문장들
}

조건식

  • 등가비교 연산자 '==' 대신 대입 연산자 '='를 사용하지 않도록 조심
  • 조건식의 결과는 반드시 true 또는 false이어야 함. 그렇지 않을 경우 에러 발생
if (x=0) {...}	// x에 0이 저장되고, 결과는 0이 됨
if (0) {...}	// 에러 발생

블럭{}

  • 블럭(block): 괄호{}를 이요해 여러 문장을 하나의 단위로 묶은 것
  • '}' 다음에 ';'를 붙이지 않음
  • 블럭 내 문장들은 탭으로 들여쓰기(indentation)를 해서 블럭 안에 속한 문장이라는 것을 알기 쉽게 해주는 것이 좋음
  • 블럭 내의 문장이 하나뿐일 경우 괄호를 생략할 수 있으나 써주는 것이 좋음
if (score > 60)
	System.out.println("합격");

or

if (score > 60) System.out.println("합격");
  • 괄호를 생략한 경우 새로운 문장이 추가되면 괄호로 문장을 감싸주어야 함
if (score > 60)
	System.out.println("합격");	// if문에 속한 문장
	System.out.println("축하드립니다");	// if문에 속하지 않은 문장
    
if (score > 60) {
	System.out.println("합격");		// if문에 속한 문장
	System.out.println("축하드립니다");	// if문에 속한 문장
}

1.2 if-else문

  • else는 조건식의 결과가 false일 때 수행
if (조건식) {
	// 조건식이 true일 때 수행될 문장들
} else {
	// 조건식이 false일 때 수행될 문장들
}
  • 조건식에 따라 두 개의 블럭 중 어느 한 블럭의 내용이 수행되고 전체 if문을 벗어남
    • 두 블럭의 내용이 모두 수행되거나 모두 수행되지 않는 경우는 없음

1.3 if-else if문

  • 여러 개의 조건식을 쓸 수 있음
if (조건식1) {
	// 조건식1이 true일 때 수행될 문장들
} else if (조건식2){
	// 조건식2이 true일 때 수행될 문장들
} else if (조건식3){
	// 조건식3이 true일 때 수행될 문장들
}
else {	// 마지막에는 보통 else 블럭으로 끝나며, 생략 가능
	// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적음
}
  • else 블럭이 생략되었을 경우 if-else문은 어떤 블럭도 수행되지 않을 수 있음
  • if-else if문 수행 과정
    1. 결과가 참인 조건식을 만날 때까지 첫 번째 조건식부터 순서대로 평가
    2. 참인 조건식을 만나면, 해당 블럭의 문장들을 수행
    3. if-else if문 전체를 빠져나옴
  • if-else if문은 여러 개의 if문을 합쳐놓은 것이지만 조건식을 바꾸지 않고 여러 개의 if문으로 쪼개놓으면 전혀 다른 코드가 됨
1. 
if (score >= 90){
	...
}
else if (score >= 80){
	...
}

2. 
if (score >= 90){
	...
}
if (score >= 80){
	...
}

3. 
if (score >= 90){
	...
}
if (score < 90 && score >= 80){
	...
}
  • 1번과 3번은 같은 의미의 코드이지만 1번과 2번은 전혀 다른 의미의 코드

1.4 중첩 if문

  • if문의 블럭 내에 또 다른 if문을 포함시키는 것. 횟수 제한 없음
if (조건식1) {
	// 조건식1이 true일 때 수행될 문장들
	if (조건식2) {
		// 조건식1과 조건식2가 모두 true일 때 수행될 문장들
	} else {
		// 조건식1이 true이고 조건식2가 false일 때 수행될 문장들
	}
} else {
	// 조건식1이 false일 때 수행될 문장들
}

1.5 switch문

  • 하나의 조건식으로 많은 경우의 수를 처리할 수 있고 표현이 간결
switch (조건식) {
	case1 : 
		// 조건식의 결과가 값1과 같을 경우 수행될 문장들
        break;
	case2 : 
   		// 조건식의 결과가 값2와 같을 경우 수행될 문장들
		break;
	// ...
	default:
		// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
    
}
  • switch문 수행 과정
    1. 조건식을 계산
    2. 조건식의 결과와 일치하는 case문으로 이동
    3. 이후의 문장들을 수행
    4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나감
    5. 조건식의 결과와 일치하는 case문이 하나도 없는 경우 default문으로 이동
  • break문
    • 각 case문의 영역을 구분하는 역할
    • 생략할 경우 case문 사이의 구분이 없어져 다른 break문을 만나거나 switch문 블럭의 끝을 만날 때까지 나오는 모든 문장들을 수행

switch문의 제약조건
1. switch문의 조건식 결과는 정수 또는 문자열이어야 함
2. case문의 값은 정수 상수만 가능하며, 중복되지 않아야 함

switch문의 중첩

  • switch문도 중첩이 가능
  • break문을 빼먹지 않도록 주의

2. 반복문 - for, while, do-while


반복문

  • 어떤 작업이 반복적으로 수행되도록 할 때 사용
  • for, while, do-while문이 있음
    • for문, while문에 속한 문장은 조건에 따라 한 번도 수행되지 않을 수 있지만 do-while문에 속한 문장은 무조건 최소한 한 번은 수행될 것이 보장됨
  • 주어진 조건을 만족하는 동안 주어진 문장들을 반복적으로 수행하므로 조건식을 포함
  • for문과 while문은 구조와 기능이 유사해 서로 변환이 가능하므로 반복문을 작성해야할 때 어느 쪽을 선택해도 좋음
    • 주로 for문은 반복 횟수를 알고 있을 때 사용

2.1 for문

  • 반복 횟수를 알고 있을 때 적합
  • 중첩 for문: for문 안에 또 다른 for문을 포함시키는 것도 가능 (횟수 제한 없음)

1. 구조와 실행 순서

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

2. 초기화, 조건식, 증감식

  • 초기화: 반복문에 사용될 변수를 초기화하는 부분
    • 처음에 한번만 수행
    • 둘 이상의 변수가 필요할 때 ','를 구분자로 변수를 초기화 (두 변수의 타입은 같아야 함)
  • 조건식
    • 조건식 값이 참이면 바복을 계속하고, 거짓이면 반복을 중단하고 for문을 벗어남
    • 조건식을 잘못 작성하면 블럭 내의 문장이 한 번도 수행되지 않거나 무한반복에 빠지기 쉬움
  • 증감식: 반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식
    • 매 반복마다 변수의 값이 증감식에 의해 점진적으로 변하다 조건식이 거짓이 되어 for문을 벗어남
    • 증감식도 ','를 이용해 두 문장 이상을 하나로 연결해서 쓸 수 있음
  • 세 가지 요소는 필요하지 않으면 생략할 수 있으며 모두 생략도 가능
for(;;) {...}
  • 조건식이 생략된 경우 참으로 간주되어 무한 반복문이 됨
    • 블럭 안에 if문을 넣어 특정 조건을 만족하면 for문을 빠져 나오게 해야 함

3. 향상된 for문(enhanced for statement)

  • JDK 1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 for문의 새로운 문법이 추가됨
for (타입 변수명 : 배열 또는 컬렉션) {
    // 반복할 문장
}
  • 타입은 배열 또는 컬렉션의 요소의 타입이어야 함
    • 배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 변수에 저장됨
    • 반복문의 괄호{} 내에서는 이 변수를 사용해서 코드를 작성
  • ex) 배열의 모든 요소를 출력하는 for문
int [] arr = [10, 20, 30, 40, 50];
for (int tmp : arr) {
	System.out.println(tmp);
}
  • 향상된 for문은 일반적인 for문과 달리 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용 가능

2.2 while문

  • 조건식이 참인 동안, 즉 조건식이 거짓이 될 때까지 블럭 내의 문장을 반복
while (조건식) {
	// 조건식의 연산 결과가 참인 동안 반복될 문장들
}
  • while문 실행 과정
    1. 조건식이 참이면 블럭안으로 들어가고, 거짓이면 while문을 벗어남
    2. 블럭의 문장을 수행하고 다시 조건식으로 돌아감
  • 초기화나 증감식이 필요하지 않은 경우 while문이 더 적합

while문의 조건식은 생략 불가

  • for문과 달리 while문의 조건식은 생략 불가
while () {...}	// 에러 발생
  • while문의 조건식이 항상 참이 되도록 하려면 반드시 true를 넣어야 함 => 무한 반복문
while(true) {...}
  • 무한 반복문은 반드시 즐럭 안에 조건문을 넣어서 특정 조건을 만족하면 무한 반복문을 벗어나도록 해야 함

2.3 do-while문

do {
	// 조건식의 연산결과가 참일 때 수행될 문장들
} while (조건식);
  • 기본적인 구조는 while문과 같으나 조건식과 블럭의 순서를 바꿔놓은 것
  • while문과 반대로 블럭을 먼저 수행한 후에 조건식을 평가
  • while문은 조건식의 결과에 따라 블럭이 한 번도 수행되지 않을 수 이ㅉ시만, do-while문은 최소한 한번은 수행될 것을 보장
  • 반복적으로 사용자의 입력을 받아서 처리할 때 유용

2.4 break문

  • 자신이 포함된 가장 가까운 반복문을 벗어남
  • 주로 if문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 함
  • 무한 반복문에는 조건문과 break문이 항상 같이 사용. 그렇지 않으면 무한히 반복되기 때문에 프로그램이 종료되지 않음

2.5 continue문

  • 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어감
    • for문의 경우 증감식으로 이동
    • while, do-while문의 경우 조건식으로 이동
  • 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이 break문과의 차이점
  • if문과 함께 사용되어 특정 조건을 만족하는 경우에 continue문 이후의 문장들을 수행하지 않고 다음 반복으로 넘어가서 계속 진행하도록 함
  • 전체 반복 중에 특정 조건을 만족하는 경우를 제외하고자 할 때 유용

2.6 이름 붙은 반복문

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

Chapter 4 끝!!!

profile
예비 백엔드 개발자

0개의 댓글