Back-End/JAVA

[JAVA] 자바의 정석(기초편) 공부 - CHAPTER 4 . 조건문과 반복문

남건욱 2023. 6. 1. 21:13

목차

    반응형
    조건문
    if(조건식){
    		// 조건식이 참(true)일 때 수행될 문장을 삽입
    }

    가장 기본적인 조건문이다. if의 뜻대로 만일(if) 조건식이 참(true)이면 괄호{ } 안의 문장들을 수행한다.라는 의미로 이해하면 될 것이다.

     

     

     

     

     

    블록
    if(score > 70)
    { -> 블럭의 시작
    		System.out.println("합격");
    } -> 블럭의 끝

    괄호 { }를 이용해서 여러 문장을 하나의 단위로 묶을 수 있다. 이것을 '블록(block)'이라고 한다. 블록은 { 로 시작해서 }로 끝난다. 블록에는 문장의 끝을 의미하는 ' ; '를 붙이지 않는다.

     

     

     

     

     

     

    if-else문
    if(조건식){
    		// 조건식이 참(true)일 때 수행될 문장
    } else {
    		// 조건식이 거짓(false)일 때 수행될 문장
    }

    if문의 변형인 if-else문의 구조는 다음과 같다. if만 사용하다가 else라는 블록이 추가되었다. else의 '그 밖에 다른'이라는 뜻이다. 조건식의 결과가 참이 아닐 때, 즉 거짓일 때 else안에 있는 무장들을 수행하게 된다.

     

     

     

     

     

    if-else if문
    if(조건식1){
    		// 조건식1의 연산결과가 참일 때 수행될 문장들을 적는다.
    } else if(조건식2) {
    		// 조건식2의 연산결과가 참일 때 수행될 문장들을 적는다.
    } else if(조건식3) {
    		// 조건식3의 연산결과가 참일 때 수행될 문장들을 적는다.
    } else {
    		// 위의 어느 조건식도 만족하지 않을때 수행될 문장들을 적는다.

    if-else문은 두 가지 경우중 하나만 수행되는 구조이다. 하지만 처리해야 할 경우의 수가 셋 이상인 경우에는 if-else문을 사용하지 못한다. 그럴 때는 한 문장에 여러 개의 조건식을 쓸 수 있는 'if-else if'문을 사용해 주면 된다.

     

    첫 번째 조건식부터 체크를 한다. if(조건식 1)에서 조건식 1이 참이면 문장을 실행하고, 거짓이면 아래로 내려가 else if(조건식 2)를 만나게 된다. 이런 식으로 차례차례 아래로 내려가며 비교해 준다.

    else if는 여러 개를 사용할 수 있고, else는 주로 마지막에 사용된다. 위 조건식중 어느 것도 만족하지 않으면 실행시켜 줄 문장을 적는 것이다. else는 생략이 가능하다.

     

     

     

     

     

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

    if문의 블록 내에 또 다른 if문을 포함시키는 것이 가능하다. 이것을 중첩 if문이라고 부른다. 중첩의 횟수에는 거의 제한이 없다. 위 코드처럼 중첩 if문을 사용할 때는 내부의 if문을 외부의 if문보다 안쪽으로 들여 쓰기를 해서 두 if문의 범위가 명확히 구분될 수 있도록 작성해야 한다. 또한 괄호{ }의 실수가 많이 일어나는 부분이므로 { }를 제대로 사용하였는지 확인해야 한다.

     

     

     

     

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

    switch() 안에 조건식을 넣어서 조건식을 먼저 계산해 준다. 그 후 값이 나왔을 때 각 case 값 1 이 부분부터 차례대로 아래로 수행한다. 만약 case마다 순차적으로 돌아가며 확인을 하다가 값이 일치하면 그 값에 포함된 문장들을 수행한다. 수행 후 break;를 만나게 되면 switch문 전체를 빠져나가며 종료한다. default는 조건식의 값과 일치하는 case가 없을 때 수행된다.

    default는 break;를 안 써도 되는 건가 의문이 들 수 있다. dafault는 어느 위치에 두어도 상관없다. 보통 마지막에 놓기 때문에 break;를 쓰지 않는 것이다. 마지막 위치가 아닐 경우에는 break;를 꼭 적어주어야 한다.

     

     

     

     

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

     

     

     

    Math.random()
    0.0 <= Math.random() < 1.0
    0.0 ~ 1.0 사이의 범위에 속하는 하나의 double값을 반환

    Math.random() 메서드를 사용하면 0.0부터 10 사이의 범위에 속하는 하나의 double값을 랜덤으로 반환한다. 0.0은 범위에 포함되고 1.0은 포함되지 않는다.

     

     

     

     

    for문
    for(초기화; 조건식; 증감식){
    		// 조건식이 참(true)인 경우 수행될 문장을 적는다.
    }
    
    ex) for(int i=1; i<=5; i++){
    			System.out.println("Hello");
        }

    for문은 어떤 작업이 반복적으로 수행될 때 사용한다. for안에 초기화, 조건식, 증감식이 들어간다. 예로 적힌 ex)를 확인해 보겠다. 

    초기화 : i=1   정수형 변수 i를 선언하고 1로 초기화해 주었다.

    조건식 : i <=5   변수 i가 5보다 작거나 같을 때까지 문장을 실행한다.

    증감식 : i++   i에 1씩 더해주겠다.

     

    이렇게 생각을 하고 ex)를 보게 되면 이해가 될 것이다. "Hello"는 총 5번 출력될 것이다. i는 1,2,3,4,5 총 5가지의 경우가 반복될 것이며 블록{ } 내부의 문장을 실행시켜 주게 되니 "Hello"가 5번 출력될 것을 알 수 있다.

     

     

     

     

     

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

    for문에 비하여 while문의 구조는 간단하다. while문은 조건식이 참(true)인 동안 반복된다. 조건문이 거짓(false)이 될 때 while문은 종료된다.

     

     

    for(int i=1; i<10; i++){
    	System.out.println(i);
    }
    
    /////////////////////////
    
    int i=1;
    
    while(i<=10){
    	System.out.println(i);
        i++;
    }

    위 두 가지 for문과 while문의 코드는 완전히 동일하다고 생각할 수 있다.

     

     

     

     

     

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

    do-while문은 while문의 변형이다. 기본적인 구조는 while문과 같으나 조건식과 블록{ }의 순서를 바꿔놓은 것이다. 따라서 while문과 반대로 블록{ }을 먼저 수행한 후에 조건식을 수행한다. while문은 조건식의 결과에 따라서 블럭{ }이 한 번도 수행되지 않을 수 있지만, do-while문은 최소한 한 번은 수행한다.

     

     

     

    break문
    class wook{
    	public static void main(String[] args){
        	int sum = 0;
            int i= 0;
            
            While(true){
            	if(sum > 100)
                	break;
                ++i;
                sum += i;
            }
            
            System.out.println("i=" + i);
            System.out.println("sum =" + sum);
       	}
    }

    반복문에서도 break문을 사용할 수 있다. switch문에서 그랬던 것처럼, break문은 자신이 포함된 가장 가까운 반복문ㅇ르 벗어난다. 주로 if문과 함께 사용되어 특정 조건을 만족할 때 반복문을 벗어나게 한다. 위 코드에서 While문안의 if(sum >100) 일시 break;를 사용하였다. 이는 sum이 100을 넘는 순간 바로 while문은 종료된다.

     

     

     

     

    continue문
    class wook{
    	public static void main(String[] args){
        	for(int i=0; i<=10; i++){
            	if(i%3 == 0)
                	continue;
                System.out.println(i);
            	}
       	}
    }

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

    continue문과 break문의 다른 점은 continue문은 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이 break문과 다르다. 위의 예시는 if(i%3 == 0) 일 때 continue문을 사용하였다. i를 3으로 나눈 나머지의 값이 0이면 그 아래 Syste.out.println(i)를 실행하지 않고 다음 반복문으로 넘어간다. 그래서 출력결과는 3의 배수는 출력하지 않는다고 생각할 수 있다.

     

     

     

     

     

     

    자바의 정석(기초편) CHAPTER 4. 연습문제

    4-1 문제

    1. 10 < x && x < 20

    2.!(ch == ' ' || ch == '\t') 

    3. ch == 'x' || ch == 'X'

    4. '0' <= ch && ch <= '9'

    5. ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')

    6. year % 400 == 0 || (year % 4 == 0 && year % 100!=0)

    7.! powerOn 또는 powerOn == false

    8. str.equals("yes")

     

     

     

     

     

     

     

     

    4-2 문제

    class Exercise4_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("sum="+sum);
    } // main
    }

    다음과 같이 i를 2로 나누거나 3으로 나눴을 때 둘 다 0이 아닐 때만 sum에 i값을 저장해 준다. i는 20까지 증가한다.

    1 + 5 + 7 + 11+ 13 + 17  + 19 = 73

    정답은 73

     

     

     

     

     

     

     

     

    4-3 문제

    class Exercise4_3 {
    public static void main(String[] args) {
    int sum = 0;
    int totalSum = 0;
    for(int i=1; i <=10; i++) {
    sum += i;
    totalSum += sum;
    }
    System.out.println("totalSum="+totalSum);
    } // main
    }
    1 sum = 1 totalSum = 1
    2 3 = 1 + 2 4 = 1 + 3
    3 6 = 1 + 2 + 3 10 = 1 + 3 + 6
    4 10 = 1 + 2 + 3 + 4 20 = 1 + 3 + 6 + 10
    5 15 = 1 + 2 + 3 + 4 + 5 35 = 1 + 3 + 6 + 10 + 15
    6 21 = 1 + 2 + 3 + 4 + 5 + 6 56 = 1 + 3 + 6 + 10 + 15 + 21
    7 28 = 1 + 2 + 3 + 4 + 5 + 6 + 7 84 = 1 + 3 + 6 + 10 + 15 + 21 + 28
    8 36 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 120 = 1 + 3 + 6 + 10 + 15 + 21 + 28 + 36
    9 45 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 165 = 1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + 45
    10 55 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 220 = 1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + 45 + 55

    정답 : 220

     

     

     

     

     

     

     

    4-4 문제

    class Exercise4_4 {
    public static void main(String[] args) {
    int sum = 0; // 총합을 저장할 변수
    int s = 1; // 값의 부호를 바꿔주는데 사용할 변수
    int num = 0;
    
    for(int i=1;true; i++, s=-s) { 
    num = s * i;
    sum += num;
    if(sum >=100)
    break;
    }
    System.out.println("num="+num);
    System.out.println("sum="+sum);
    }

    다음 코드를 실행하면 199가 나온다. 

     

     

     

     

     

     

     

    4-5 문제

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

     

    public class wook {
    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++;
    		}
    	} 
    }

    정답코드이다. 위 for문에서는 i는 0~10j는 0~ i의 숫자만큼 반복된다. 따라서 다음과 같이 i를 먼저 0으로 초기화해 준 뒤, while문으로 i <=10일 때 실행하도록 하고 j는 j <=i일 때 문장을 출력하도록 하면 예시의 for문과 같은 값이 나오게 된다.

     

     

     

     

     

     

     

     

    4-6 문제

    class wook {
    public static void main(String[] args) {
    	for(int i=1;i<=6;i++)
    		for(int j=1;j<=6;j++)
    			if(i+j==6)
    				System.out.println(i+"+"+j+"="+(i+j));
    	}
    }

    다음과 같이 코딩해 주면 된다. i, j는 1부터 6까지 반복될 것이고 중첩 for문에서 추가로 i+j가 6일 때만 출력되도록 코딩하였다.

     

     

     

     

     

     

     

    4-7 문제

    class Exercise4_7 {
    public static void main(String[] args) {
    String str = "12345";
    int sum = 0;
    for(int i=0; i < str.length(); i++) {
              (1)
    }
    System.out.println("sum="+sum);
    }
    }

    정답은 sum += str.charAt(i) - '0';이다. 다음 문장을 풀이하면 sum = sum + (str.charAt(i) - '0') 이 된다. sum안에 str.charAt(i) - '0' 의값을 계속 넣는 것이다.  str.CharAt(i)를 통해 문자열의 각 자리에 접근한다.  그 후 '0'을 빼주어 해당 문자를 정수로 변환하여 sum에 넣는다. '0'을 빼주는 이유는 문자열을 숫자로 바꾸기 위해서이다. 유니코드를 활용하였다.

     

     

     

     

     

     

     

    4-8 문제

    class Exercise4_8 {
    public static void main(String[] args) {
    int value =        (1)
    System.out.println("value:"+value);
    }
    }

    정답은 (int)(Math.random() *6) + 1이다. 이유는 Math.random() 메서드는 0 이상 1 미만의 난수를 반환하므로, 이를 6과 곱해서 0 이상 6 미만의 수를 얻는다. 그 후 소수점 아래를 버리기 위해 (int) 형으로 변환시켜 준후 +1을 더해서 1부터 6으로 맞춰주었다.

     

     

     

     

     

     

    4-9 문제

    class Exercise4_9 {
    public static void main(String[] args) {
    int num = 12345;
    int sum = 0;
    
    
        (1)
    
    
    System.out.println("sum="+sum);
    }
    }

     

    while (num > 0){
    	sum += num%10;
        num /= 10;
    }

    위 코드를 추가시켜 주면 된다. 먼저 num을 10으로 나눈 나머지를 구하면 해당숫자의 1의 자리를 얻을 수 있다. 이를 sum에 넣어주고 다시 num을 10으로 나눈 몫을 num에 저장하고 반복한다. 이렇게 하면 12345 / 1234 / 123 / 12 / 1 순으로 돌아가며 각 자리의 합을 구할 수 있다.

     

    위 코드는 변수 num의 각 자리의 합을 구하는 문제를 해결합니다. 주어진 숫자를 10으로 나눈 나머지(num % 10)는 해당 숫자의 일의 자리 숫자를 얻을 수 있습니다. 이렇게 얻은 일의 자리 숫자를 sum에 더하고, num을 10으로 나눠서 다음 자리 숫자를 구할 수 있도록 합니다. 이 과정을 num이 0보다 큰 동안 반복합니다.

     

     

     

     

     

     

     

    4-10 문제

    class Exercise4_10
    {
    public static void main(String[] args)
    {
    // 1~100 사이의 임의의 값을 얻어서 answer에 저장한다
    int answer =       (1)
    int input = 0; // 사용자입력을 저장할 공간
    int count = 0; // 시도횟수를 세기위한 변수
    
    java.util.Scanner s = new java.util.Scanner(System.in);
    do {
    count++;
    System.out.print("1 100 :"); 과 사이의 값을 입력하세요
    input = s.nextInt(); // input . 입력받은 값을 변수 에 저장한다
    
    
    
    (2)
    
    
    } while(true); 
    }
    }

     

    (1)
    (int)(Math.random() * 100) + 1;
    
    (2)
    if(answer > input){
    	System.out.println("범위보다 작은수가 입력되었습니다.");
        } else if(answer < input){
        	System.out.println("범위보다 큰수가 입력되었습니다.");
        } else {
        	Sysetm.out.println("정답입니다.");
            Sysetm.out.println("시도횟수는 " + count + "번 입니다.");
            break;
        }

     

    (1)에 들어갈 정답은 (int)(Math.random() * 100) + 1이다. 4-8문제에서도 설명한 내용인데 0~1 사이의 난수를 100을 곱해서 0~100 미만의 수를 갖도록 하고 +1을 해주어 1~100 사이의 임의값을 얻게 해 주었다.

     

    (2)에 들어갈 정답은 위의 (2)와 같다. 먼저 사용자가 입력한 input이 answer보다 작으면 작다고 출력해 주고 크면 크다고 출력해 준다. 이 두 개의 조건에 만족하지 않을 시 "정답입니다"를 출력하고 시도 횟수를 출력해 주고 종료한다.

     

     

     

     

     

    정리

    프로젝트를 많이 해본 경험은 없지만 대체로 코딩을 할 때 가장 자주 사용하는 것 중 하나가 조건문, 반복문이라고 생각한다. if문과 for문 없이는 코드가 너무 복잡해질 것이다. 이 부분은 가장 잘 이해하고 넘어가야 할 부분인 것 같다. 난수 부분은 오늘 공부를 통해서 다시 한번 제대로 알게 되었다. 0~1의 double형 수를 반환해 준다고 알고 있었는데 마지막에 왜 +1을 해주는지는 잘 몰랐다. 알고 보니 0~1이 0은 포함하지만 1은 포함하지 않는다는 것을 알게 되었다. 이번 챕터를 공부하며 난수와 조건문에 대해 다양한 형식을 추가로 알게 되었다. 연습문제에서 시간을 많이 투자하게 되었다. 막히는 부분 없이 문제해결을 할 수 있어서 뿌듯했다.

    반응형
    프로필사진

    남건욱's 공부기록