항해99 온보딩 스터디[Java 언어 기초] 3일차

Hohomi·2023년 3월 8일
0
post-thumbnail

스터디 3일차 : 조건문과 반복문 (if, switch, for, while statement)

✅ 제어문(control statement)

  • 프로그램의 흐름을 바꾸는 역할을 하는 문장들
  • 조건문과 반복문이 있다.
    - 조건문 : 조건에 따라 다른 문장이 수행되도록 한다.
    - 반복문 : 특정 문장들을 반복해서 수행한다.

✅ if문

  • 가장 기본적인 조건문
  • '조건식'과 '괄호{}'로 이루어져 있다.
if (조건식) {
	// 조건식이 참(true)일 때 수행될 문장들을 적는다.
}

- if문에 사용되는 조건식

** 조건식의 결과는 반드시 true 또는 false여야 한다!

✅ if - else문

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

✅ if - else if문

  • 한번에 여러 개의 조건식을 쓸 때 사용한다. (처리해야 할 경우의 수가 3개 이상일 때)
if (score >= 90) {
	grade = 'A';
} else if (80 <= score && score < 90) {
	grade = 'B';
} else { 
	grade = 'C';
}

✅ switch문

  • 하나의 조건식으로 많은 경우의 수를 처리해야 할 때 사용한다.
  • 다만 switch문은 제약조건이 있기 때문에, 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 경우도 있다.
  • 각 case문의 마지막에 break문을 빼먹는 실수를 하지 않도록 주의 필요!
1. 조건식을 계산한다.
2. 조건식의 결과와 일치하는 case문으로 이동한다.
3. 이후의 문장들을 수행한다.
4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나간다.

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

public static void main(String[] args) {
	int num, result;
    final int ONE = 1;
    ...
    switch(result1) {
    case '1' :		// OK. 문자 리터럴(정수 49와 동일)
    case ONE :		// OK. 정수 상수
    case "YES" :	// OK. 문자열 리터럴. JDK 1.7부터 허용
    case 1.0 :		// 에러. 실수는 불가
    case num : 		// 에러. 변수도 불가
    ...
}

✅ for문

  • while문과 구조&기능이 유사하여 서로 변환이 가능하며, 반복 횟수를 알고 있을 때 주로 for문을 사용한다.
  • 조건식이 생략된 경우 참(true)으로 간주되어 무한 반복문이 된다. 그럴 때에는 대신 블럭{} 안에 if문을 넣어서 특정 조건을 만족하면 for문을 빠져 나오게 해야 한다.
for (초기화;조건식;증감식;) {
	// 조건식이 참(true)인 동안 수행될 문장들을 적는다.
}

for (;;) {...} 	// 조건식이 생략된 경우

✅ while문

  • for문에 비해 구조가 간단하다. if문처럼 조건식과 블럭{}만으로 이루어져 있다.
  • 다만 if문과 달리 while문은 조건식이 참(true)인 동안, 조건식이 거짓이 될 때까지 블럭 내의 문장을 반복한다.
  • 초기화나 증감식이 필요하지 않은 경우라면 for문보다 while문이 적합할 수 있다.
while (조건식) {
	// 조건식의 연산결과가 참(true)인 동안, 반복될 문장을 적는다.
}

✅ do-while문

  • 기본적인 구조는 while문과 같으나, 조건식과 블럭{}의 순서를 바꿔놓은 것
  • while문과 반대로 블럭{}을 먼저 수행한 후에 조건식을 평가한다.
  • 많이 쓰이지는 않으나 사용자의 입력을 반복적으로 받아서 처리할 때 유용하다.
do {
	// 조건식의 연산결과가 참일 때 수행될 문장을 적는다.(처음 한번은 무조건 실행)
} while (조건식)
import java.util.*;

Class Ex4_15 {
	public static void main(String[] args) {
    	int input = 0, answer = 0;
        
        answer = (int)(Math.random() * 100) + 1; // 1부터 100 사이의 임의의 수를 저장
        Scanner scanner = new Scanner(System.in);
        
        do {
        	System.out.print("1과 100 사이의 정수를 입력하세요.>");
        	input = scanner.nextInt();
        
        	if (input > answer) {
        		System.out.println("더 작은 수로 시도해보세요.");
        	} else if (input < answer) {
        		System.out.println("더 큰 수로 다시 시도해보세요.");
        	} 
      	} while (input != answer);
        
    	System.out.println("정답입니다.");
	}
}

✅ break문

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

✅ continue문

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

📖 『JAVA의 정석 기초편』 연습문제 풀이!

Chater 4

4-1.

조건식으로 표현하기

  1. int형 변수 x가 10보다 크고 20보다 작을 때 true인 조건식
10 < x && x < 20
  1. char형 변수 ch가 공백이나 탭이 아닐 때 true인 조건식
ch != ' ' || ch != '\t'
  1. char형 변수 ch가 'x' 또는 'X'일 때 true인 조건식
ch == 'x' || ch == 'X'
  1. char형 변수 ch가 숫자('0'~'9')일 때 true인 조건식
'0' <= ch && ch <= '9'
  1. char형 변수 ch가 영문자(대문자 또는 소문자)일 때 true인 조건식
'A' <= ch && ch <= 'z'
  1. int형 변수 year가 400으로 나눠떨어지거나 또는 4로 나눠떨어지고 100으로 나눠떨어지지 않을 때 true인 조건식
year % 400 == 0 || year % 4 == 0 && year % 100 != 0
  1. boolean형 변수 PowerOn이 false일 때 true인 조건식
PowerOn == false; 또는 !PowerOn
  1. 문자열 참조변수 str이 "yes"일 때 true인 조건식
str.equals("yes");

4-2.

1부터 20까지의 정수 중 2 또는 3의 배수가 아닌 수의 총합

public class Quiz4_2 {
    public static void main(String[] args) {
        int sum = 0;

        for (int i = 1; i <= 20; i++) {
            if (i%2 != 0 && i%3 != 0) {
                sum += i;
            }
        }
        System.out.println("result = " + sum); // 73
    }
}				

4-3.

1 + (1+2) + (1+2+3) + (1+2+3+4) + ... + (1+2+3+...+10) 의 결과를 계산하기

public class Quiz4_3 {
    public static void main(String[] args) {
        int sum = 0;

        for (int i = 1; i <= 10; i++) {
            sum += i;
        }
        System.out.println("result = " + sum); // 55
    }
}

4-4.

1 + (-2) + 3 + (-4) + ... 과 같은 식으로 계속 더해나갔을 때, 몇까지 더해야 총합이 100 이상이 되는지 구하기

public class Quiz4_4 {
    public static void main(String[] args) {

        int sum = 0;
        int a = 1; // 값의 부호를 바꿔줄 변수
        int num = 0;

        for (int i = 1; sum < 100; i++, a = -a) {
            num = i * a;
            sum += num;
        }
        System.out.println("num = " + num); // 199
        System.out.println("sum = " + sum); // 100
    }
}

** 이 문제에서 헷갈렸던 부분 :

  • for문에서 a에게 걸린 조건이 '-a'이니 당연히 처음에는 '-1'이 곱해질 거라 예상했는데 아니었다.
  • 생각해보면 'i++' 조건도 'i=1'이 먼저 실행되고 그 다음 반복 때 i에 1씩 더해진다. 그와 같은 원리인 듯 하다. ⭐️⭐️⭐️
  • 헷갈릴 경우 for문 안에서 num 값이 어떻게 반복되고 있는지를 프린트 해보자.

4-5.

다음의 for문을 while문으로 변경하기

public class Quiz4_5 {
    public static void main(String[] args) {
        for (int i = 0; i <= 10; i++) {
            for (int j = 0; j <= i; j++)
                System.out.println("*");
            System.out.println();
        }
    }
}
// 처음에 풀었던 내용 - 오답. 무한반복되는 별을 보았음. 깜놀 ^^;;
public class Quiz4_5 { 
    public static void main(String[] args) {
        int i = 0;
        int j = 0;

        while (i <= 10) {
            while (j <= i) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}
public class Quiz4_5 {
    public static void main(String[] args) {
    int i = 0;
        while (i <= 10) {
            int j = 0;
            while (j <= i) {
                System.out.print("*");
                j++;
            }
            System.out.println();
            i++;
        }
    }
}

** 이 문제에서 놓쳤던 부분 :

  • while문은 조건식과 블럭{}만으로 이루어져 있으므로, 블럭 안에 조건식이 false가 될 만한 내용을 넣어주어야 했다.
  • for문에 있는 증감식을 블럭 안에 넣어 변수 i와 j가 10에 도달할 만한 조건을 만들어주었어야 했다!
  • 증감식이 없는 이 while문에서는 변수 i와 j가 10에 도달할 일이 없으므로 블럭 안의 내용이 무.한.반.복.된다..

참고 자료

참고 도서 : 『JAVA의 정석 기초편』, 남궁 성, 도우출판

profile
게발로 개발하기

0개의 댓글