본문 바로가기

programming/Java [notion 정리본 업로드]

조건문과 반복문

A. 조건문 (conditional statement)

A-1. 조건문

  • 조건에 따라 분기를 나눠 실행하기 위한 문법
  • IF, IF-ELSE, Switch 문이 있음

A-2. 조건문 IF

문법

  • if문은 각각 쓰임에 따라 if문과 if-else문으로 사용할 수 있다.
  • 개수와 조건에 따른 조건문의 형태
    • 조건이 하나일 때
    • if (조건문) { 실행할 코드 블럭 }
    • 조건이 두 개일 때(두 조건이 반대되는 조건일 때)
    • if (조건문) { // (1) (1) 조건에 만족할 경우 실행할 코드 블럭 } else { // (2) 조건을 만족하지 않는 모든 경우 실행 실행할 코드 블럭 }
    • 조건이 두 개 이고 각 조건에 해당되지 않으면 실행하지 않을 때
    • if (조건문1) { // (1) 실행할 코드 블럭 } else if (조건문2) { //(1) 실행할 코드 블럭 }
    • 조건이 세 개 이상일 때
      • else if 부분은 몇 개가 와도 상관 X : 조건 개수에 따라 여러번 사용할 수 있다
    • if (조건문1) { // (1) 실행할 코드 블럭 } else if (조건문2) { //(1) 실행할 코드 블럭 } ... ... { 실행할 코드 블럭 } else { 실행할 코드 블럭 }
  • 만약 if - else if -else 구문에서 코드 상 위쪽의 조건문이 실행된 시점에 해당 블럭을 실행하고, 이 구문은 종료됨.

[예시] IF절

package com.itwill.condition01;

public class ConditionMain01 {
// 조건문 (conditional statement)
	public static void main(String[] args) {
		int number = -5;
		
		if (number > 0) {
			// 조건식을 만족하는 경우에 실행할 코드 블록
			System.out.println("number가 0보다 커요!");
		}
		
		System.out.println("=====프로그램 끝=====");	
	}
	
}

[예시]if-else문 - 짝수 홀수 조건식

package com.itwill.condition01;

public class ConditionMain01 {
// 조건문 (conditional statement)
	public static void main(String[] args) {
		int number = -5;
		
		if(number %2 == 0) {
//			(1) 조건식을 만족하는 경우에 실행할 코드 블록
			System.out.println("짝수");
		} else {
//			(2) 조건식을 만족하지 않는 경우에 실행할 코드 블록
			System.out.println("홀수");
		}
	}
	
}

[예시]if-else문 - 양수 or 음수 or 0

짝수 홀수 조건식package com.itwill.condition01;

public class ConditionMain01 {
// 조건문 (conditional statement)
	public static void main(String[] args) {
		int number = 0;
		
		if(number > 0) {
			System.out.println("양수");
		} else if (number < 0) {
			System.out.println("음수");			
		} else {
			System.out.println("00");
		}
	}

중첩 조건문

  • if 또는 else 블록 안에 또 다른 조건문이 있는 경우
  • if (조건) { if (조건) { } else { } }

[예시]중첩 조건문

package com.itwill.condition01;

public class ConditionMain02 {
	public static void main(String[] args) {
//		중첩 조건문 : if 또는 else 블록 안에 또 다른 조건문이 있는 경우
		double x = 3.14;
		
		if (x > 0) {
			System.out.println("양수");
		} else {
			if (x < 0) {
				System.out.println("음수");				
			} else {
				System.out.println("0");								
			}
		}
	}
}

🐔 Java는 Falthy Truthy가 없나봐!

  • C언어나 JS에서 사용하던 while(1) {}… 과 같은 무한 루프 구문이 JAVA에서는 사용할 수 없다.
  • 무한 루프로 사용하기 위해서는 while(true)나 while(1==1)처럼 논리 연산자를 사용해야 함

A-3. 조건문 예제 문제

Build-up

  • 값을 입력받아 조건문을 이용한 구문 만들기
  • Java.util 패키지 내 선언된 Scanner 클래스 이름을 사용하기 위해 필요한 import 구문 필수
  • 키보드에서 입력받은 값을 저장하는 방법
    • 키보드를 입력 받기 위해 객체를 생성하고, 메서드를 사용해야 함.
  1. Java.util 패키지 내 선언된 Scanner 클래스 이름을 사용하기 위해 필요한 import 구문 필수
  2. Scanner 타입의 객체 생성 : 입력 도구 만들기
    • Scanner 타입으로 변수 선언하고 그 객체를 저장
  3. 키보드에서 정수를 입력받아 int 타입 변수에 저장
  4. 콘솔에 값 입력하고 결과 저장
    • 만약 nextInt를 했는데 문자가 들어오면 에러가 발생
    • 여러 번 입력을 받고 싶은 경우에 여러 개의 Scanner 객체를 생성하지 않고 해당 객체를 여러번 사용하면 됨.
  5. package com.itwill.condition03; import java.util.Scanner; // (1) public class ConditionMain03 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // (2) System.out.println("자바 과목 점수를 입력해주세요."); int java = sc.nextInt(); // (3) System.out.println("Java 점수 : "+java); } }

문제

  • SQL , JS, Java 과목의 점수를 각각 입력받아 변수에 저장하고 해당 점수를 출력하시오.
  • 세 과목의 총점을 계산해서 출력.
  • 세 과목의 평균 점수을 계산해서 출력 (소수점 계산)
  • 조건
    • 세 과목의 평균이 90점 이상이면, A
    • 세 과목의 평균이 80점 이상이면, B
    • 세 과목의 평균이 70점 이상이면, C
    • 그 이외에는 F라고 출력.
package com.itwill.condition03;

import java.util.Scanner;

public class ConditionMain03 {
	
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		
		System.out.println("Java 과목 점수를 입력해주세요.");
		double java = sc.nextDouble();
		System.out.println("SQL 과목 점수를 입력해주세요.");
		double sql = sc.nextDouble();
		System.out.println("JavaScript 과목 점수를 입력해주세요.");
		double javascript = sc.nextDouble();
		
		System.out.println("\\nJava 점수 : " + (int)java);
		System.out.println("SQL 점수 : " + (int)sql);
		System.out.println("JavaScript 점수 : " + (int)javascript);
		
		System.out.println("\\n============= 점수 ==============");
		
		System.out.println("세 과목 총점 : " + (int)(java + javascript + sql));
		
		double avg = (java + javascript + sql)/3;
		System.out.println("세 과목 평균 : " + avg);
		
		System.out.print("\\n총 학점 : ");
		
		if (avg >= 90) {
			System.out.println("A");
		} else if (avg >= 80){
			System.out.println("B");
		} else if (avg >= 70) {
			System.out.println("C");
		} else {
			System.out.println("F");
		}
		
	}

}

실행 결과

  • 실수로 출력해야 하는 avg를 계산할 때, A/B 중 하나만 실수이면 실수로 계산한다.
    • int / double, double / int, double / double 세 경우 모두 실수로 계산된다.
      • 위 출력 결과 : true
    • System.out.println(Double.class.isInstance((java + javascript + sql)/3.0)); // java, javascript, sql 모두 int로 선언된 변수
  • 선생님 코드
package com.itwill.condition03;

import java.util.Scanner;

public class ConditionMain03 {
	
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in); // (1) warning 발생
		
		System.out.println("Java 과목 점수를 입력해주세요.");
		int java = sc.nextInt();
		System.out.println("SQL 과목 점수를 입력해주세요.");
		int sql = sc.nextInt();
		System.out.println("JavaScript 과목 점수를 입력해주세요.");
		int javascript = sc.nextInt();
		
		System.out.println("\\nJava 점수 : " + java);
		System.out.println("SQL 점수 : " + sql);
		System.out.println("JavaScript 점수 : " + javascript);
		
		System.out.println("\\n============= 점수 ==============");
		
		System.out.println("세 과목 총점 : " + (java + javascript + sql));
		
		double avg = (java + javascript + sql)/3.0;
		System.out.println("세 과목 평균 : " + avg);
		
		System.out.print("\\n학점 : ");
		
		if (avg >= 90) {
			System.out.println("A");
		} else if (avg >= 80){
			System.out.println("B");
		} else if (avg >= 70) {
			System.out.println("C");
		} else {
			System.out.println("F");
		}
		
	}

}

(1) Warning의 경우,

  • 입력 장치가 키보드인 경우 상관없는데, 만약 파일을 읽어오는 방식으로 Scanner 객체를 사용할 경우, close를 해 주어야 함.
    • A라는 프로그램에서 파일을 사용할 경우, 닫지 않으면 다른 프로그램에서 A 프로그램이 사용하고 있는 파일을 삭제할 수 없음.
    • 이미 사용은 다 끝났는데 계속해서 메모리를 잡아먹고 있는 것이기 때문에 Resource leak이라는 문제가 발생

예제 - 가위바위보

package com.itwill.condition07;

import java.util.Random;
import java.util.Scanner;

public class RpsMain {

	public static void main(String[] args) {
//		가위바위보 게임 : 
//		가위 0, 바위 1, 보 2

		Random random = new Random();
		Scanner scanner = new Scanner(System.in);

		int rsp = random.nextInt(3);

		System.out.println("가위 바위 보!");
		System.out.println("[0]가위");
		System.out.println("[1]바위");
		System.out.println("[2]보");
		System.out.println("------------------------------------------------------------");
		System.out.println("선택하세요!");

		int rspFromUser = scanner.nextInt();

		if (rspFromUser > 2 || rspFromUser < 0) {
			System.out.println("제대로 내세요.");
			return;
		}

		String winner = "User";

		if (rsp == 0) {
			if (rspFromUser == 2) {
				winner = "AI";
			}
		} else if (rsp == 1) {
			if (rspFromUser == 0)
				winner = "AI";
		} else {
			if (rspFromUser == 1) {
				winner = "AI";
			}
		}

		if (rsp == rspFromUser) {
			winner = "Both!";
		}

		System.out.println("AI : " + (rsp == 0 ? "가위" : rsp == 1 ? "바위" : "보"));
		System.out.println("User : " + (rspFromUser == 0 ? "가위" : rspFromUser == 1 ? "바위" : "보"));

		System.out.println(winner + "가 이겼습니다1");
	}6

}
  • 궁금한 점
    • [x] 현재 위 코드에서 Scanner를 사용했는데도 불구하고 Scanner가 import 되지 않고 있음. 해당 프로젝트 내 다른 코드에서 import하기 때문인가..
      • ㅋㅋㅋ….- 버튼 눌려서 import 구문 그냥 요약된 거였음..
      • 기본값으로 User 승리, 만약 컴퓨터에 질 경우에만 winner의 값 변경하기
      • 컴퓨터와 인간의 값 차이로 만든 모듈러
      package com.itwill.condition07;
      
      import java.util.Random;
      import java.util.Scanner;
      
      public class RpsMain {
      
      	public static void main(String[] args) {
      //		가위바위보 게임 : 
      //		가위 0, 바위 1, 보 2
      
      		Random random = new Random();
      		Scanner scanner = new Scanner(System.in);
      
      		int rsp = random.nextInt(3);
      
      		System.out.println("가위 바위 보!");
      		System.out.println("[0]가위");
      		System.out.println("[1]바위");
      		System.out.println("[2]보");
      		System.out.println("------------------------------------------------------------");
      		System.out.println("선택하세요!");
      
      		int rspFromUser = scanner.nextInt();
      
      		if (rspFromUser > 2 || rspFromUser < 0) {
      			System.out.println("제대로 내세요.");
      			return;
      		}
      
      		int diff = user - computer;
      		if (diff == 0) 비긴 경우
      		else if (diff == 1 || diff == -2) user가 이긴 경우
      		else 컴퓨터가 이긴 경우
      
      		System.out.println(winner + "가 이겼습니다1");
      	}6
      
      }
      

A-4. Switch-Case

조건 제어문이지만, 조건식이 아닌 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다.

  • 변수의 값을 비교하는 경우에 이 switch문을 사용하면 if 문보다 코드 형태가 간결하다.
  • case A : 비교 대상 인자가 A와 동일한지 체크한다.
    • 괄호 안의 변수 값과 동일한 값을 갖는 case로 가서 실행문을 실행한다.
    • 만약 변수 값과 동일한 값을 갖는 case가 없으면 default 구문 안에 있는 실행문으로 실행된다. (default문은 필수요소 X)
    package com.itwill.switch02;
    
    import java.util.Random;
    
    public class SwitchMain02 {
    	public static void main(String[] args) {
    		
    		Random random =new Random();
    		
    		int genderCode = 1;
    		genderCode = random.nextInt(6);
    //		강사님 코드
    		System.out.println("genderCode : " + genderCode);
    		switch (genderCode){
    		case 1: 
    		case 3: 
    			System.out.println("남성");
    			break;
    		case 2: 
    		case 4: 
    			System.out.println("여성");
    			break;			
    		default:
    			System.out.println("몰리여");
    		
    	}
    }
    
  • Switch 문은 if - else 구문으로 100% 변경 가능하다.
    • 하지만 그 반대는 불가능하다.
  • 만약 각 케이스마다 break가 없다면, switch 문을 빠져가지 않고 다른 실행문들을 모두 실행한다.
    • 이 때 부합하는 조건 이외의 다른 조건들은 비교하지 않는다.
    package com.itwill.switch03;
    
    public class SwitchMain03 {
    
    	public static void main(String[] args) {
    		Weekday weekday = Weekday.MON;
    		
    		System.out.println(weekday);
    
    		switch (weekday) {
    		case MON:
    			System.out.println("회사 가기 싫어...");
    			break;
    		case TUE:
    			System.out.println("화요일!");
    		case WED:
    			System.out.println("수수수ㅜ!!");
    			break;
    		case THU:
    		case FRI:
    			break;
    		case SAT:
    		case SUN:
    			break;
    		}
    	}
    }
    
    • 만약 위의 ex1과 같이 switch 문이 있다고 가정해보자.
      • weekday가 TUE라면, 출력은 다음과 같다.
      화요일!
      수수수ㅜ!!
      
  • 정수String, Enum, Char과 함께 사용할 수 있다.
    • String 타입의 케이스 문의 경우, == 비교 연산이 아니라 equals 메서드를 이용하여 요소의 값을 비교한다.

<aside> 💡 ☑️ enum : enumerate type (열거형 타입)

상수(Constant)들을 정의하는 특별한 종류의 class ❗한 번 저장되면 바뀌지 않을 값을 변수로 저장할 때는, 변수명을 대문자로 사용한다.

package com.itwill.switch03;

public enum Weekday {
	SUN, MON, TUE, WED, THU, FRI, SAT;
}

⏩⏩⏩더보기

☑️ 변수 : 값(데이터)을 저장하기 위한 메모리 공간

int x = 1; → x: 변수, 1 : 리터럴

☑️ 상수 : 초기화한 이후에는 값을 변경할 수 없는 변수

final int x = 1; final 키워드가 있으면 x의 값을 변경할 수 없다.

☑️ 리터럴 : 고정된 값. ex ) 1, 2, 3.14, “sbda”, …

</aside>

람다와 switch

switch (selectedNum) {
            case 0 -> readAll();
            case 1 -> {
                putLike(idx);
                readDetail(idx);
            }
            case 2 -> // 댓글 달기....
                    addComment(idx);
        }
  • 아마 최신 문법인 것 같은데 IntelliJ가 알려줬다.
  • 람다를 통해 switch 문에서 굳이 break를 일일이 추가해주지 않아도 되어 읽기 더 쉬운 것 같다.
  • 또한 지금 진행 중인 프로젝트 내에 한 케이스마다 한 줄 실행문만 있을 경우가 많은데, 그런 경우에 진짜 좋을 것 같다…
  • ✅ 주의할 점 : 람다와 기존 case 문을 혼용할 수 없다는 것!

B. 반복문

  • 어떤 작업이 반복적으로 실행되도록 할 때 사용되며, 반복문의 종류로는 for, while. do-while문이 있다.
  • for 문과 while 문은 상호 호환 가능하나, for문은 반복 횟수를 알고 있을 때, while 문은 조건에 따라 반복할 때 주로 사용한다.
  • while과 do-while문의 차이점은 조건 검증이 앞에 위치하냐 뒤에 위치하냐의 차이

Break와 continue 문장

  • break : 반복문 실행 중 break문에 도달하면, 해당 코드 블럭 탈출
  • continue : 반복문 실행 중 continue 문장을 만나면 해당 문장 아래 코드들은 무시하고 그 다음 반복 과을 계속 수행
  • package com.itwill.loop05; public class LoopMain05 { public static void main(String[] args) { for (int n = 1; n <= 5; n++) { if (n == 3) break; System.out.println(n); } // 출력 결과 : 1 2 for (int n = 1; n <= 5; n++) { if (n == 3) continue; System.out.println(n); } // 출력 결과 : 1 2 4 5 } }
  • for 구문에서 조건식이 없는 경우는 무한 반복문으로 사용할 수 있음.
    • break 문장 활용하여 무한 반복문을 종료시킬 때 사용할 수 있음

B-1. For문

package com.itwill.loop01;

public class LoopMain01 {
	public static void main(String[] args) {
//		반복문
		System.out.println("Java 1");
		System.out.println("Java 2");
		System.out.println("Java 3");
		System.out.println("Java 4");
		System.out.println("Java 5");
		// (1)
		System.out.println("============================");
	
		for (int i =1; i <= 5; i++) {
			System.out.println("Java " + i);
		}		// (2)
	
	}

}
  • ======로 나눠진 출력문은 해당 코드를 중심으로 똑같은 출력이 반복된다.
    • (2)에서는 반복문을 통해 하나하나 명시한 (1)의 코드 중 반복되는 코드들을 함축된 코드로 표현할 수 있었다.
    • 만약 5번이 아니라 수백번의 반복 행위가 필요한 경우, 이를 하나하나 명시해줄 수 없기 때문에, 반복문을 통해 이를 처리할 수 있다.
    <aside> 💡 반복문의 형태를 알아보자(1) 초기화 문장(3) 반복할 실행 코드 블록</aside>
  • (4) 증감식⇒ 증가/감소 연산자로 많이 사용된다. 단항 연산자의 대표적인 예시
  • (2) 반복 조건식
  • for ((1)초기화 문장; (2)반복 조건식; (4)증가, 감소) { (3) 반복할 실행 코드 블록 }
  • 각 초기화 문장이나 반복 조건식, 증감식은 둘 이상 있을 수 있다.
    • 이 경우, 쉼표(,)로 구분하여 작성한다.
    for (int i = 0, j = 1; i < 50 && j < 199; i++, j++) {
    
    }
    
    • 반복 조건식에서 다수의 조건식이 나올 경우, 논리 연산자를 사용하여 여러 조건을 결합한다.
  • 초기화 문장은 for문의 초기화식에서 선언하지 않고 for 문 전에 선언할 수 있다.
    • 메서드 내에서 사용하는 변수로 사용하여 for문 밖에서도 사용할 수 있다.

<aside> 💡 🆘초기화식에서 루프 카운터 변수를 선언할 때 주의할 점!

Float 타입을 초기화 식에 사용하면 안된다!

for (float x = 0.1f; x <= 1.0f; x += 0.1f) {
			System.out.println(x);
}
  • 위의 코드는 10번 반복될 것으로 예상된다.
  • 하지만 출력 결과는 다음과 같다.
  • 0.1은 float 타입으로 정확하게 표현할 수 없기 때문에, 루프 카운터 변수인 x에는 실질적으로 0.1보다 큰 값이 더해진다.

</aside>

중첩 반복문

  • for문을 여러번 중첩시켜 필요한 과정을 얻을 수 있음
  • 9x9단 출력하기
  • package com.itwill.loop06; public class LoopMain06 { public static void main(String[] args) { // 중첩 반복문 for (int dan = 2; dan < 10; dan++) { System.out.println("---------------" + dan + "단 출력---------------"); for (int n = 1; n < 10; n++) { System.out.println(dan + " x " + n + " = " + (dan * n)); } System.out.println(); } } }

[예제-중첩 반복문과 break문]

  • 구구단 출력하기
  • 조건
    • 2단은 2X2까지, 3단은 3X3까지…… 9단은 9X9까지 출력하기
  1. break문 활용하기
  2. package com.itwill.loop07; public class LoopMain07 { public static void main(String[] args) { for (int dan = 2; dan < 10; dan++) { System.out.printf("-----------%d단 출력-----------\\n", dan); for (int i = 1; i < 10; i++) { System.out.printf("%d x %d = %d\\n", dan, i, dan*i); if (dan==i) break; } } } }
  3. 중첩 반복문의 조건 활용하기
  4. package com.itwill.loop07; public class LoopMain07 { public static void main(String[] args) { for (int dan = 2; dan < 10; dan++) { System.out.printf("-----------%d단 출력-----------\\n", dan); for (int i = 1; i <= dan; i++) { System.out.printf("%d x %d = %d\\n", dan, i, dan * i); } } } }

B-2. while문

  • 조건이 true일 경우 계속해서 반복
  • while문과 for문은 100% 상호 변경 가능
    • Go랭에서는 while문이 없대..
  • 조건 식에는 비교 또는 논리 연산식이 오며, 조건식이 false일 경우 반복 행위를 멈추고 while문을 종료
  • 문법
    • 실행 코드에 증감식을 함께 작성함
    1. while문이 실행될 때 조건식 평가
    2. 평가 결과가 true이면 실행문(2) 실행
    3. 실행문(2)이 모두 실행되면 조건식(1)으로 되돌아가서 다시 조건식 평가
    4. 만약 조건식이 true라면 실행문(2) 다시 실행
    5. 만약 조건식이 false라면 while문 종료
    int i = 1;
    
    while (i < 6) {
    	System.out.println (i);
    	i++;
    }
    
  • [초기값 선언]; while ( [반복 조건] ) { // (1) [실행할 코드]; // (2) }
  • while문의 반복 조건에 활용되는 지역 변수는 while 문의 바깥에서 선언되므로 while 문 밖에서도 사용할 수 있다.

[예제 1,2] 1부터 5 출력하고 반대로도 출력하기

[예제 3,4] 2씩 증가하거나 감소하거나!

package com.itwill.loop08;

public class LoopMain08 {
	public static void main(String[] args) {
//		while 반복문 문법 공부하기

		System.out.println("---------[1]");
//		[1] 반복할 문장(들) 1 2 3 4 5 출력
		int i = 1;

		while (i < 6) {
			System.out.print(i++ + " ");

		}
		
		System.out.println();
		System.out.println("---------[2]");
// 		[2] 5 4 3 2 1 출력
		while (--i > 0) {
			System.out.print(i + " ");
		}

		System.out.println();
		System.out.println("---------[3]");
//		[3] 0 2 4 6 8 10 출력하기
		while (i <= 10) {
			System.out.print(i + " ");
			i += 2;
		}

		System.out.println();
		
		i=0;
		while (i<=5) {
			System.out.print(i*2+" ");
			i++;
		}
		
		System.out.println();
		System.out.println();
		System.out.println("---------[4]");
//		[4] 9 7 5 3 1 출력하기
		i = 9;
		while (i >= 0) {
			System.out.print(i + " ");
			i -= 2;
		}
		System.out.println();
	}
}
  • 예제 [3]이나 [4]는 여러가지 경우의 수로 코드를 구성할 수 있음.
  • 다양한 경우의 수를 생각해보며 코드를 작성할 수 있는 좋은 시간인 것 같다.

구구단 문제 활용해서 만들어보기 (feat. Scanner 라이브러리)

Scanner scanner = new Scanner(System.in);
System.out.printf("========== 몇 단을 출력할까요 ==========\\n");
int dan = scanner.nextInt();
int n = 1;
System.out.printf("========== %d 단을 출력합니다 ==========\\n", dan);

while (n < 10) {
	System.out.printf("%d X %d = %d\\n", dan, n, dan * n);
	n++;
}

[예제] 구구단 - 1단부터 9단까지 출력하기

package com.itwill.loop09;

public class LoopMain09 {
	public static void main(String[] args) {
//		중첩 반복문(while) 활용하기 : 구구단 출력 (2단 ~ 9단)
		int dan=2;
		int n;
		
		while (dan < 10) {
			
			n=1;
			System.out.printf("======%d단을 출력합니다======\\n", dan);
			
			while (n < 10) {
				System.out.printf("%d X %d = %d\\n", dan, n, dan * n++);
			}
			
			dan++;
		}
	}
}
  • dan의 경우, 다른 연산자들과 함께 쓸 수 있는 코드가 없어서 단독으로 사용해봄,,,
  • n의 초기화를 선언과 같이 하기보다 한 단의 구구단이 시작될 때 하는 것이 좀 더 읽기 편할 것 같아서 초기화와 재할당을 모두 외부 while문 내에 사용해 보았다.
    • 그렇게 따지면 선언 자체도 첫 번째 while 문 내에 사용하는 것이 좋았을지도 모르겠다.
    1. 어차피 중첩된 while문 내에서만 사용하기 때문에 굳이 메모리를 사용할 필요가 없을 듯.

B-3. do-while문

  • 문법
  • [초기값 선언]; do{ [실행할 코드]; // (1) } while ( [반복 조건] ); // (2)

While과 Do-While

  • 두 반복문의 문법 차이
while (조건식) {... ...};
do {... ...} while(조건식);
  • While 문
    • 반복 블럭을 실행하기 전 (반복 조건식)을 검사하기 때문에, 실행 블록이 한 번도 실행되지 않는 경우가 있음
  • do-while문
    • do-while 문은 무조건 실행 블록을 먼저 실행하고 난 후 반복 조건식을 검사함.
    • 조건 검증보다 실행문이 먼저 실행되기 때문에 최소한 1번 이상 실행
      • 조건에 맞지 않더라도 초기 실행 보장
    • 거의 사용하지 X
  • while과 do-while의 실행 차이
    • while과 do-while 문의 실행 과정 차이를 실험해본 코드… 강사님 코드에서 조건만 슬쩍 만져봤는데 무한 루프 타서 while문의 종료를 확인할 수 없었다는 후문…
    • 출력 결과는 다음과 같다.
      • while 문은 단 한번의 실행도 되지 않고 종료된다. 하지만 do-while문은 해당 실행 블럭의 코드가 실행되어 조건에 부합하여 계속 실행이 된다.
    • ====== while ====== end while ====== do-while ====== 1 0 -1 -2 -3 ... ...
  • package com.itwill.loop10; public class LoopMain10 { public static void main(String[] args) { // do-while문 System.out.println("====== while ======"); int n = 1; while (n <= 0) { System.out.println(n); n--; } System.out.println("end while"); System.out.println("====== do-while ======"); n = 1; do { System.out.println(n); n--; } while(n <= 0); // 무한 루프;;;;; } }

B-4. 예제

⁉️1부터 10까지의 자연수들의 합 구하기 : sum = 1+ 2 + 3 + … … + 10; ⇒ 55

package com.itwill.loop11;

public class LoopMain11 {
	public static void main(String[] args) {
//		[1] 1부터 10까지 자연수들의 합 계산하기 
//				: sumByFor = 1 + 2 + ... + 10; => 55
		int sumByFor = 0;

		for (int i = 1; i < 11; i++) {
			sumByFor += i;
		}
// (1) for문

		int sumByWhile = 0;
		int n = 1;
		while (n < 11) {
			sumByWhile += n++;
		} 
// (2) while문

		int sumByDoWhile = 0;
		n = 1;

		do {
			sumByDoWhile += n++;
		} while (n < 11);
// (3) do while 문
	}
}
  • 현재 위에 작성된 3가지 반복문의 실행은 동일하다.

⁉️1부터 100까지의 짝수들의 합 구하기 && ⁉️1부터 100까지의 홀수들의 합 구하기

package com.itwill.loop11;

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

		int sumOfEven = 0;

		for (int i = 2; i < 101; i += 2) {
			sumOfEven += i;
//			System.out.println(sumOfEven);
		}

		sumOfEven = 0;
		int m = 0;

		while (m < 101) {
			sumOfEven += m;
			m += 2;
//			System.out.println(sumOfEven);
		}

		sumOfEven = 0;
		m = 0;
		do {
			sumOfEven += m;
			m += 2;
//			System.out.println(sumOfEven);
		} while (m < 101);

		// -----------------
		int sumOfOdd = 0;

		for (int i = 1; i < 100; i += 2) {
			sumOfOdd += i;
//			System.out.print(sumOfOdd + " ");
		}

		sumOfOdd = 0;
		m = 1;

		while (m < 101) {
			sumOfOdd += m;
//			System.out.print(m + " ");
			m += 2;
//			System.out.println(sumOfOdd + " ");
		}

		sumOfOdd = 0;
		m = 1;

		do {
			sumOfOdd += m;
			System.out.print(m + " ");
			m += 2;
			System.out.println(sumOfOdd + " ");
		} while (m < 101);
	}
}
  • 이렇게 말고 if 문으로 작성하는 방법
    • if (m % 2 == 0) 이면 더하기, default로 m++ 해주기
  • 문제가 2개라고 나눠서 풀 생각 말고, 한 번에 해결해볼 생각도 하면 좋겠다.

[혼공자 예제]

package com.itwill.loop13;

import java.util.Scanner;

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

//		교재 연습문제 2번
		System.out.println("=====교재 연습문제 2번=====");
		int sum = 0;

		for (int i = 1; i < 101; i++) {
			if (i % 3 == 0)
				sum += i;
		}
		System.out.println(sum);

//		교재 연습문제 5번
		System.out.println("=====교재 연습문제 5번=====");
		for (int i = 1; i <= 4; i++) {

			for (int j = 0; j < i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}

		System.out.println();

//		교재 연습문제 6번
		System.out.println("=====교재 연습문제 6번=====");
		for (int i = 1; i <= 4; i++) {

//			for (int j = i; j < 4; j++) { 		//  두 경우 모두 가능
			for (int j = 4 - i; j > 0; j--) {
				System.out.print(" ");
			}

			for (int j = 0; j < i; j++) {
				System.out.print("*");
			}

			System.out.println();
		} // 현재 가지고 있는 변수들로 내가 원하는 수열을 만드는 과정을 생각해보기

//		교재 연습문제 7번
		System.out.println();
		System.out.println("=====교재 연습문제 7번=====");
		boolean run = true;

		int balance = 0;
		Scanner scanner = new Scanner(System.in);

		while (run) {
			System.out.println("---------------------------------------");
			System.out.println("1. 예금 | 2. 출금 | 3. 잔고 | 4. 종료");
			System.out.println("---------------------------------------");

			int selected = scanner.nextInt();

			if (selected == 1) {
				System.out.println("예금할 금액을 입력하세요.");
				int savings = scanner.nextInt();
				balance += savings;
			} else if (selected == 2) {
				System.out.println("출금할 금액을 입력하세요.");
				int withdraw = scanner.nextInt();
				
				if (balance >= withdraw)  balance -= withdraw;
				else {
					System.out.println("출금 금액이 부족합니다.");
				}
			} else if (selected == 3) {
				System.out.println(balance);
			} else {
				run = false;
				System.out.println("거래가 종료되었습니다.");
			}
		}

	}

}

강사님 ⇒ 6번 문제 풀이

System.out.println("=====교재 연습문제 6번=====");

for (int x = 1; x <= 4; x++) {
			for (int y = 1; y <= 4; y++) {
				if(y <= 4-x) {
					System.out.print(" ");
				} else {
					System.out.print("*");
				}
			}
			System.out.println();
}
  • 내부에 반복문을 하나만 써서 if절과 else if절로 만드는 코드는 지금껏 생각해본 적이 없다…
  • 역시 머리가 굳으면 안되니까 다양한 코드를 보는 연습을 하자

'programming > Java [notion 정리본 업로드]' 카테고리의 다른 글

상속  (0) 2024.04.13
Class  (0) 2024.04.13
연산자  (0) 2024.04.13
변수 & 데이터 타입  (0) 2024.04.13
Java 설치하기 [feat. 17]  (0) 2024.04.13