관리 메뉴

나구리의 개발공부기록

자바의 정석 기초편 ch4 - 1 ~ 8[조건문과 반복문, If문,if-else문,if-esle if문, 중첩if문] 본문

유튜브 공부/JAVA의 정석 기초편(유튜브)

자바의 정석 기초편 ch4 - 1 ~ 8[조건문과 반복문, If문,if-else문,if-esle if문, 중첩if문]

소소한나구리 2023. 11. 6. 16:40

1) 조건문과 반복문

  • 조건문과 반복문을 제어문(flow control statement)이라 부름

(1) 조건문

  • 조건을 만족할때만 { } 를 수행 (0 ~ 1번)
  • if / switch

(2) 조건문 예시

if (score > 60) {
	System.out.println("합격입니다.");
	System.out.println("축하드립니다.");
}
  • 참이면 위의 문장들을 순차적으로 실행하고 거짓이면 모두 건너뜀

(3) 반복문

  • 조건을 만족하는 동안 { }를 수행 (0 ~ n번)
  • for / while

(4) 반복문 예시

int i = 10;
while (i-- > 0) {
	System.out.println(i);
}
  • 조건을 확인해서 조건을 만족하는 동안 계속 반복하고 조건을 벗어나면 다음 문장을 실행
  • 조건이 처음부터 안맞으면 건너뜀

2) If문

  • 조건식이 참(true)일 때, 블록 {  }안의 문장들을 수행
  • 조건식에는 연산결과가 true or false인 식이 와야함 // 그 외의 식은 에러가 발생
if (조건식) { // 시작
	조건식 문장
}  // 끝

// socre의 값이 80이면 80 > 60 이므로 true가 되어 합격입니다가 출력됨
if (score > 60) {
	System.out.println("합격입니다.");
}

 

(1) 자주쓰는 조건식


3) 블록 { }

  • 여러 문장을 하나로 묶어주는 것
  • 코드 작성시 가독성을 위해 블록안의 내용은 들여쓰기 하는 습관을 권장
  • if문에 속한 문장이 하나인 경우 블록을 생략이 가능함 (C언어, 자바 등)
  • 그러나 가독성도 좋지 않고 실수를 할 수 있기 때문에 간단한 경우가 아니고서는 대부분은 블록을 사용하는 것을 권장.
if(score > 60)
	System.out.println("합격입니다.");   // If문에 속한 문장
	System.out.println("축하드립니다.");  // If문에 속하지 않은 문장

4) if - else문

  • 둘 중 하나 - 조건식이 참일 때와 거짓일 때로 나눠서 처리
if (조건식) {
	// 조건식이 참일 때 수행 될 문장
} else {
	// 조건식이 거짓일 때 수행 될 문장
}


5) if-else if문

  • 여러개의 조건식 중 하나만 실행 (여러개가 실행 되는 경우는 없음)

(1) 예제

  • 점수에 따라 등급을 구분
import java.util.Scanner; // 스캐너기능 사용하기 위함

public class ex4_4 {
	public static void main(String[] args) {
		int score = 0; // 점수를 저장하기 위한 변수
		char grade = ' '; //학점을 저장하기 위한 변수. 공백으로 초기

		System.out.print("점수를 입력하세요. >");
		Scanner scanner = new Scanner(System.in);
		score = scanner.nextInt();  // 화면을 통해 입력받은 순자를 score에 저장
		
		if (score >= 90) {   // score가 90점 보다 같거나 크면 참 실행 후 바로 조건문 아웃
			grade = 'A';
		} else if (score >= 80) { // score가 80점 보다 같거나 크면 참 실행 후 바로 조건문 아웃
			grade = 'B';
		} else if (score >= 70) { // score가 70점 보다 같거나 크면 참 실행 후 바로 조건문 아웃
			grade = 'C';
		} else { // score가 그 외일 때 실행 후 조건문 아웃
			grade = 'D';
		}
			System.out.println("당신의 학점은 "+ grade +"입니다.");
	}	
}

 

(2) 코드 리팩토링 적용시(코드를 더욱 좋게 바꾸는 작업)

  • grade 변수에 기본값을 설정하여 모든조건을 만족하지 않을 경우 기본값을 출력되게 하여 마지막의 else블록을 쓰지 않도록 수정
  • else를 써야하는 경우도 있지만 쓰지 않아도 되는 경우에는 제외가 가능하니 고민하는 연습이 필요함
import java.util.Scanner;

public class ex4_4 {
	public static void main(String[] args) {
		int score = 0; // 점수를 저장하기 위한 변수
		char grade = 'D'; // 기본값 초기화

		System.out.print("점수를 입력하세요. >");
		Scanner scanner = new Scanner(System.in);
		score = scanner.nextInt();  // 화면을 통해 입력받은 순자를 score에 저장
		
		if (score >= 90) {   // score가 90점 보다 같거나 크면 참 실행 후 바로 조건문 아웃
			grade = 'A';
		} else if (score >= 80) { // score가 80점 보다 같거나 크면 참 실행 후 바로 조건문 아웃
			grade = 'B';
		} else if (score >= 70) { // score가 70점 보다 같거나 크면 참 실행 후 바로 조건문 아웃
			grade = 'C';
		}
			System.out.println("당신의 학점은 "+ grade +"입니다.");
	}	
}

 

(3) 위의  if-else if문의 조건을 아래처럼 전부 작성하지 않아도 되는 이유

  • 앞에서 거짓인 값들을 제외하고 다음 조건문으로 넘어가기 때문에 조건문을 간추릴 수 있음 -> if-else if문이기에 가능
if (score >= 90) {
	grade = 'A';
} else if (80 <= score && score < 90) { // 80 ≤ score < 90
	grade = 'B';
} else if (70 <= score && score < 80) { // 70 ≤ score < 80
	grade = 'C';
} else { // score < 70
	grade = 'D';
}

6) 중첩 If문 - if문 안의 If문

  • 중첩 횟수는 제약이 없음 (1000번 이상도 가능..)
if (조건식1) {
	// 조건식 1의 연산 결과가 true일 때 수행 될 문장을 작성
    if (조건식2) {
    	// 조건식 2의 연산 결과가 true일 때 수행 될 문장을 작성
    } else {
    	// 조건식 1이 true, 조건식2가 false일 때 수행되는 문장을 작성
    }
} else {
	// 조건식 1이 false일 때 수행되는 문장을 작성
}

 

(1) 중첩 if문 작성 시 블록 생략에 주의!

  • 아래의 왼쪽의 그림이 언뜻 보면 else블록이 첫번째 If문에 속한 것 처럼 보이지만, 블록 생략 시 가까운 if문을 적용 하기 때문에 아래 오른쪽의 그림처럼 코드가 실행 되어 버림.
  • 위에서 말했던 것처럼 이러한 상황에서는 가독성 좋게 가급적 블록 생략을 하지않도록 하거나 가독성 좋게 들여쓰기 등을 잘해야 함

(2) 정상적인 블록을 생략한 중첩 if문

  • 이렇게하면 if-else 문 안에 if문이 중첩되어 정상적으로 로직이 작동하지만, 가독성이 좋지 않기 때문에 가급적 괄호를 사용하는 것을 권장함
if (num >= 0) {
	if (num != 0)
		sign = '+';
} else {
	sign = '-';
}

 

(3) 예제

  • 점수에 따라 등급을 구분 -> 등급 안에서 점수에 따라 세부적인 등급을 구분
import java.util.Scanner;

public class ex4_5 {

	public static void main(String[] args) {
		int score = 0; // 점수를 저장하기 위한 변수
		char grade = ' ', opt = '0';

		System.out.print("점수를 입력하세요. >");
		
		Scanner scanner = new Scanner(System.in);
		score = scanner.nextInt();  // 화면을 통해 입력받은 순자를 score에 저장
		
		System.out.printf("당신의 점수는 %d입니다.%n", score);
		
		if (score >= 90) {   // score가 90점 보다 같거나 크면 참 실행 후 바로 조건문 아웃
			grade = 'A';
			if (score >= 98 ) { // 90점 이상 중에서도 98점 이상은 A+
				opt = '+';
			} else if (score < 94) { //90점 ~ 94점 미만은 A-
				opt = '-';
			}
		} else if (score >= 80) { // score가 80점 보다 같거나 크면 참 실행 후 바로 조건문 아웃
			grade = 'B';
			if (score >= 88 ) {
				opt = '+';
			} else if (score < 84) {
				opt = '-';
			}
		} else if (score >= 70) { // score가 70점 보다 같거나 크면 참 실행 후 바로 조건문 아웃
			grade = 'C';
			if (score >= 78 ) {
				opt = '+';
			} else if (score < 74) {
				opt = '-';
			}
		}
		else { // score가 그 외일 때 실행 후 조건문 아웃
			grade = 'D';
		}
		System.out.printf("당신의 학점은 %c%c입니다.%n", grade, opt);
	}	
}

 

 

** 출처 : 남궁성의 정석코딩_자바의정석_기초편 유튜브 강의