둘째 날

정혅·2024년 2월 6일

더 조은 아카데미

목록 보기
3/76

상수, boolean, 증감 연산자, 반복문 - while 퀴즈, 조건문 - if(else),continue/break - 퀴즈, Scanner, 난수(Random) - 퀴즈, 난수 맞추기 게임 만들기

final

symbolic constant = 상수

  • 상수는 대문자로 작성 (암묵적 약속)

  • 상수 선언 후 값을 변경하려 하면 에러 발생

  • C언어 에서는 cont라는 명령어로 상수 지정


Boolean

참 과 거짓

class T1{
    public static void main(String[]args){
        boolean result;
        result = 5 > 3; 
        System.out.println(result);
    }
}

result에는 true의 값이 들어가있다

true 라고 출력

==

class T1{
    public static void main(String[]args){
        boolean result;
        result = 5 == 3; 
        System.out.println(result);
    }
}

좌변과 우변이 같으면 true 아니면 false

!=

class T1{
    public static void main(String[]args){
        boolean result;
        result = 5 != 3;
        System.out.println(result);
    }
}

좌변과 우변이 같으면 false, 다르면 true


증감 연산자 ++

  • 전치, 후치 상관 없이 값이 1 증가
class T1{
    public static void main(String[]args){
        int num = 10;
        ++num;
        System.out.println(num);
    }
} //출력값 11 

다른 연산자와 사용될 때

전치는 바로 증가 / 후치는 증가하지만 변수에 증가하기 전의 값을 대입한다.

   class T1{
    public static void main(String[]args){//다른 연산자와 사용되었을때
        int num1 = 10, num2 = 10;
        int result1 = 0, result2 = 0;

        System.out.println(num1++); //10
        System.out.println(num1); //11
    }
}
class T1{
    public static void main(String[]args){//다른 연산자와 사용되었을때
        int num1 = 10, num2 = 10;
        int result1 = 0, result2 = 0;

        result1 = ++num1;
        result2 = num2++;
        System.out.println(num1 + "" + num2)
        //11,10
        System.out.println(result1 + "" + result2);
        //11
    }
}
class T1{
    public static void main(String[]args){//다른 연산자와 사용되었을때
        int num1 = 10, num2 = 10;
        int result1 = 0, result2 = 0;

        num1++;
        ++num2;
        System.out.println(num1 + "" + num2); //11,11
    }
}
  • result = num1; 라는 문장이 있으면 result는 10이지만 num1의 값은 11

do while

조건이 참이든 거짓이든 무조건 한번은 실행

class T1{
	public static void main(String[]args){
		int i = 10;	
		do {
			System.out.println(i);
			i++;
		}while(i<3); 
	}
}
  • 조건에 맞지 않는 값을 주었지만 그래도 한번은 수행

퀴즈

  1. 1부터 100까지의 합

  2. 1부터 100까지의 4의 배수의 갯수

  3. 7의 배수의 합이 최초로 1000을 넘는 수와 그 수가 몇번째 항인지.

  4. 5!

class T1{
	public static void main(String[]args){
		int i = 0,sum = 0;	
		do {
			sum += i;
			System.out.println("i = " + i + " / sum = " + sum);
			i++;
		}while(i <= 100); 
	}
}

class T2{
	public static void main(String[]args){
		int i = 0,sum = 0;	
		do {
			sum += i;
			System.out.println("i = " + i + " / sum = " + sum);
			i += 2;
		}while(i <= 100); 
	}
}

class T3{
	public static void main(String[]args){
		int i = 4,sum = 0, cnt = 0;
		do {
			sum +=  i;
			cnt += 1;
			System.out.println("i = " + i + " / sum = " + sum + " / cnt = " + cnt);
			i += 4;
		}while(sum <= 100); 
	}
}

class T4{
	public static void main(String[]args){
		int i = 7,sum = 1,cnt = 0;
		do {
			sum += i;
			cnt += 1;
			System.out.println("sum = " + sum + " / cnt = " + cnt);
			i += 7;
		}while(sum <= 1000); 
	}
}

class T5{
	public static void main(String[]args){
		int i = 1, fac = 1;
		do {
			fac *= i; 
			System.out.println("i = " + i + " / fac = " + fac);
			i++;
		}while(i <= 5); 
	}
}

if 문

  • 중괄호 사용 안하면 처음 문장만 if 문에 속하고 그 외는 중괄호 벗어나있는 문장(평상문)
class Test{
	public static void main(String[]args){
		{
			if( 5 < 1) System.out.println("Hello"); //거짓으로 실행 x 
			if( 5 > 1) System.out.println("Good") //참으로 수행 
			
	}
}

if ~else문

else는 단독으로 사용 x > if 와 함께 사용

class Test{
	public static void main(String[]args){
		{
			if( 5 < 1){
    System.out.println("Hello"); 
	   }else{    
        System.out.println("Good")
		}	
	}
}

else if 문

else if 또한 단독으로 사용 x, if 와 함께 사용

if(5 > 1) System.out.println("Hello");
else if(5>2) System.out.println("Nice");
else if(5>3) System.out.println("Good");
else System.out.println("Bye"0;)
  • if 가 만족하면 else if문장은 실행되지 않는다.

  • if가 만족하지 않고, else if 도 만족하지 않으면 else가 출력된다.


Scanner

사용자로부터 입력을 받는 명령어

import java.util.Scanner; 선언 필수

Scanner 변수명1 = new Scanner(System.in);
변수명 = 변수명1.nextInt(); 로 답변 입력 받는다.

사용 후 sc.close(); 로 닫아주는게 좋다.

Scanner() 메서드 종류

  • next() String을 읽음. 단, 띄어쓰기 뒷부분은 읽지 않음
  • nextLine() String을 읽음. 띄어쓰기를 포함하여 한 줄(즉, Enter를 치기 전까지)을 읽음
  • nextInt() int 를 읽음
  • nextBoolean() boolean 을 읽음
  • nextByte() byte 를 읽음
  • nextShort() short 를 읽음
  • nextLong() long 을 읽음
  • nextFloat() float 을 읽음
  • nextDouble() double 을 읽음
주의해야 할 메서드, nextLine()

nextLine() 메서드와 나머지 메서드의 차이점 2가지

  • nextLine() 메서드는 Enter 단위로 읽고, =Spacebar와 같은 공백문자들을 포함해서 한 줄을 읽는다.
    나머지 메서드들은 토큰(Token) 단위로 읽는다.

  • 입력값을 읽어들일 때,
    nextLine() 메서드는 '\n'를 포함해서 읽어들이고,=(입력 버퍼에 저장되어있는) 공백문자를 포함하는 한줄을 읽는다.
    나머지 메서드들은 '\n'뿐만 아니라 다른 공백문자도, 제외해서 읽어들인다.

  • 반환할 때,
    nextLine() 메서드는 '\n'을 버려서 return 하고,
    나머지 메서드들은 애초에 공백문자를 제외해서 읽어들였으므로 당연히 반환값도 공백문자가 제외된 상태로 return 된다.

상세 설명
  • nextLine()을 제외한 나머지 Scanner 클래스의 메서드들은 토큰(Token) 단위로 읽는다.

  • 나머지 메서드 들은 입력값을 읽을 때 공백문자를 제외해서 읽어들인다.

  • 그에 따라 반환할 때도 당연히 공백문자를 제외한 값을 return 한다.

Scanner 주의사항

  • Scanner 클래스는 "토큰 단위"로 읽는다.
    - 토큰(Token): 공백문자(Spacebar, Tab, Enter등)로 구분되는 요소
    • nextLine()은 예외이다. nextLine()은 Enter 단위로 읽는다.
  • 공백문자는 사라지지 않는다.
    - 어떤 값을 입력받을 때, 컴퓨터는 공백문자까지도 버퍼에 저장한다.
    • 내가 입력한 Spacebar나 Enter, Tab도 입력값과 함께 버퍼에 저장이 되고, 해당 공백문자를 다른 곳에서 읽어들이기 전까지는 버퍼에 남아있는 것이다.

Scanner 활용 연습 문제

Q. 임의의 두 수를 입력받아 큰 수를 출력하시오

    + 두 수가 서로 같으면 같다고 출력

import java.util.Scanner;
class Scanner1{
	public static void main(String[]args){
		
			int num1 = 0, num2 = 0;

			Scanner sc = new Scanner(System.in);
			System.out.println("첫 번째 숫자를 입력하세요.");
			num1 = sc.nextInt();

			System.out.println("두 번째 숫자를 입력하세요.");
			num2 = sc.nextInt();
		
			if(num1 < num2){
				System.out.println("두 번째 숫자가 더 큽니다. " + num2);
			} else if (num1 > num2) {
				System.out.println("첫 번째 숫자가 더 큽니다. " +num1);
			} else {
				System.out.println("두 수가 같습니다.");
			}
		sc.close();
		
	}
}

다른 방식의 풀이 - if 3개

if(num1 < num2){
System.out.println("두 번째 숫자가 더 큽니다. " + num2);
} if (num1 > num2) {
System.out.println("첫 번째 숫자가 더 큽니다. " +num1);
} if (num1 == num2) {
System.out.println("두 수가 같습니다.");
}

로직이 더 좋은 코딩
class Ex1{
	public static void main(String[]args){
		int cnt = 0;
		for(int i = 0; int <= 100; i++){
			if(i%4 == 0) 
			cnt++;
		}
	}
}

if문이 100번 반복된다.

class Ex2{
	public static void main(String[]args){
		int cnt = 0;
		for(int i = 4; int <= 100; i+= 4){
			cnt++;
		}
	}
}

for문 이용해 25번만 반복된다.

예제 2번이 더 좋은 로직이 된다.


변수에 값이 서로 바뀌게 하는 방법

class Ex1{
	public static void main(String[]args){
		int num1 = 10, num2 = 5,  = 0;
		System.out.println(num1 + " " + num2);
		num3 = num1;
		num1 = num2;
		num2 = num3; 
		System.out.println(num1 + " " + num2);
	}
} 

int num3 = num1; / int num1 = num2 이런식으로 입력해서 출력했더니 String으로 인식하는지 오류난다. String에서 int로 자동 형변환이 되나


selection sort = 선택 정렬

Q1. 임의의 숫자 5개를 입력받아 오름차순 되게 하시오(ASC) - 배열이 아닌 if문 사용

import java.util.Scanner;
class Ex1{
	public static void main(String[]args){
	int num1 = 0, num2= 0, num3 = 0, num4 = 0, num5 = 0, temp = 0;
	
	Scanner sc = new Scanner(System.in);
	System.out.println("첫 번째 숫자 입력");
	num1 = sc.nextInt();
	
	System.out.println("두 번째 숫자 입력");
	num2 = sc.nextInt();
	
	System.out.println("세 번째 숫자 입력");
	num3 = sc.nextInt();

	System.out.println("네 번째 숫자 입력");
	num4 = sc.nextInt();

	System.out.println("다섯 번째 숫자 입력");
	num5 = sc.nextInt();
	
	
	if (num1 < num2){
	}else{
		temp = num1;
		num1 = num2;
		num2 = temp;

	}if (num1 < num3){
	}else{
		temp = num1;
		num1 = num3;
		num3 = temp;

	}if (num1 < num4){
	}else{
		temp = num1;
		num1 = num4;
		num4 = temp;

	}if (num1 < num5){
	}else{
		temp = num1;
		num1 = num5;
		num5 = temp;
			//가장 작은 수 결정
	}if (num2 < num3){
	}else{
		temp = num2;
		num2 = num3;
		num3 = temp;

	}if (num2 < num4){
	}else{
		temp = num2;
		num2 = num4;
		num4 = temp;
	
	}if (num2 < num5){
	}else{
		temp = num2;
		num2 = num5;
		num5 = temp;
			//두 번째로 작은 수 결정

	}if (num3 < num4){
	}else{
		temp = num3;
		num3 = num4;
		num4 = temp;

	}if (num3 < num5){
	}else{
		temp = num3;
		num3 = num5;
		num5 = temp;
			//세 번째로 작은 수 결정

	}if (num4 < num5){
	}else{
		temp = num4;
		num4 = num5;
		num5 = temp;
			//네 번째로 작은 수 결정
			}
	System.out.println(num1 + " " + num2 + " " + num3 + " " + num4 + " " + num5 );
		}
} 

예제 문제에서 else if 를 사용한다면?
  • 처음 if문이 참이면 밑에 else if문은 실행되지 않기때문에 if else 문을 이용해야한다.

continue/ break

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

		for(i = 0; i < 10; i++){
			if(i > 5) 
			continue;
			System.out.println("Hello");
		}
		System.out.println("i = " + i);
	}
}

continue 진행되는 순서

  1. for문 i = 0

  2. i < 10

  3. 중괄호 수행 > Hello출력

  4. 증감연산자 i + 1 수행

  5. for문 반복하다가 i 가 5보다 커지면 continue로 인해 조건문의 제일 위 증감연산자로 이동한다.

  6. continue에 의해 for문 증감 연산자로 이동되어 i가 1씩 계속 증가되다가 10이 출력된다.

break 진행 순서

  1. continue와 같이 진행되다가 break를 만나면 그 즉시 조건문을 벗어난다.

퀴즈

  1. for(i=1;true;i++)으로 설정하고, 1+2+3+ ... 순차적으로 더했을 때 최초로 5000을 넘는 수를 break를 통해 구현.

  2. 1부터 20까지 출력을 하는데 2의 배수와 3의 배수는 출력하지 않기 continue 이용

  3. 5의 배수이자 7의 배수인 가장 작은 수 break

  4. 100 이하의 자연수 중에 5의 배수이자 7의 배수인 정수를 전부출력하고, 그 수를 세어보는 프로그램 continue;

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

		for(i = 1; true; i++){
			sum += i;
			if ( sum >= 5000){
		System.out.println("i = " + i + " / sum = " + sum );
		break; 
			}
		}
	}
}

break위치 주의!

println위에 있으면 5000이 넘었지만 println보다 위에서 끝내기때문에 5000전에 값이 출력된다.


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

		for(i = 1; i <= 20; i++){
			if (i %2 != 0 && i % 3 != 0){
			System.out.println("i의 결과: " + i );
			continue;
			}
		}
	}
}
예제 2번 다르게 푸는 방식

if(i%2 == 0) conitnue;

if(i%3 == 0) conitnue;

이렇게 if 문을 작성하고 continue를 작성하면 2의 배수는 출력하지 않는다.

2와 3의 배수는 continue 때문에 출력문장까지 가지 않고 다시 조건문의 처음으로 되돌아가기 때문이다

  • 내가 한 식도 맞지만 if(i%2 == 0 || i%3 == 0) conitnue; 이렇게도 문장 작성 가능

  • ||( 논리 or 연산자: 하나라도 참이면 참, 둘다 거짓일 때 거짓) - 병렬 구조일때는 or사용


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

		for(i = 1; i <= 100; i++){

			if (i % 5 == 0 && i % 7 == 0                    ){
		System.out.println("5의 배수이자 7의 배수인 가장 작은 수" + i);
		break;
			}
		}
	}
}
  • &&( 논리 and 연산자: 하나라도 거짓이면 거짓, 둘 다 참일 때 참) - if안에 if가 들어가는 구조


내가 작성한 문장 - 잘못된

class T4{
	public static void main(String[]args){
		int i = 0, cnt = 0;

		for(i = 1; i <= 100; i++){
			cnt ++; 
        if ( i % 5 == 0 && i % 7 == 0){
		    System.out.println("i = " + i + " cnt = " + cnt);
		    continue;
			}
		}
	}
}
  • 문제가 5와 7의 최소공배수를 구하는 문제다.

  • 나의 식을 확인해보면 5와 7의 최소공배수이긴 하나 cnt++이 if 전에 수행되므로 count의 기능 수행 x

  • continue가 제일 마지막에 위치해 논리적으로 쓸모가 없음 (문법적으로는 문제 x)

정답식

class T4{
	public static void main(String[]args){
		int i = 0, cnt = 0;
		for(i = 1; i <= 100; i++){
			if ( i % 5 != 0 || i % 7 != 0) continue;
            cnt ++;
		    System.out.println("i = " + i + " cnt = " + cnt);
		}
	}
}
  1. 문제는 5와 7의 공배수

  2. i가 5와 7의 나머지가 0이 아닐때 continu를 만난다.

  3. 조건문의 처음으로 가서 실행되다가 i가 5와 7의 나머지가 0일때


Random = 난수

import java.util.Random;
class Test{
	public static void main(String[]args){
		Random rand = new Random(); //rand = 변수, Random = 생성자
		int num = 0;

		num = rand.nextInt(100); // 0~99까지 난수 발생시킴 
		System.out.println(num);
	}
}

nextInt(33) 이면 0 ~ 32까지 난수 발생 > 괄호 안 -1

퀴즈 - 난수 맞추기 게임 생성

Q. 1부터 100사이의 임의의 난수를 발생시킨다.
그리고 그 숫자를 맞추는 게임을 만드시오.
예:
게임을 시작합니다.
숫자를 입력하세요.
50
당신이 입력한 숫자 보다 큽니다.
80
당신이 입력한 숫자 보다 작습니다.
67
정답입니다. 당신은 3번만에 정답을 입력하셨습니다.
프로그램을 종료합니다.

내가 작성한 틀린 문장

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

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

		int num = 0, answer = 0, cnt = 0;
		Random rand = new Random();
		Scanner sc = new Scanner(System.in);

		num = rand.nextInt(100) + 1; // 0~99까지여서 +1 해줘야한다. 
		
		System.out.println("게임을 시작합니다. 숫자를 입력하세요.");
		answer = sc.nextInt();
		cnt++;
		if(num < answer){
		System.out.println("당신이 입력한 숫자 보다 작습니다.");
		answer = sc.nextInt();
		cnt++;
		}
		if ( num > answer){
		System.out.println("당신이 입력한 숫자 보다 큽니다.");
		answer = sc.nextInt();
		cnt++;
		} if (answer != num)
		System.out.println("정답입니다. 당신은 " + cnt + "번만에 정답을 입력하셨습니다.");
		
		System.out.println("프로그램을 종료합니다.");
	}
}
  1. 값을 입력해도 정답을 맞춘게 아니라 3번째에 정답이라고 출력되게끔 작성된것이다.

  2. 횟수에 제한이 있다.

  3. continue를 사용해서 끊어줘야하는데 문법적으로 맞지 않음 저기서 continue를 넣는게

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

//import java.util.*; 모든 기능 import해주는 그러나 가독성 측면에는 위와같은게 좋다. 

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

		int rnum = 0, inum = 0, cnt = 0;
		Random rand = new Random();
		Scanner sc = new Scanner(System.in);

		num = rand.nextInt(100) + 1; // 0~99까지여서 +1 해줘야한다. 
		
		System.out.println("게임을 시작합니다. 숫자를 입력하세요.");
		while(true) { //true는 무한루프이므로 위험 부담 while(rnum != inum) 이게 좋음
			cnt++;
			inum = sc.nextInt();
			if(rnum > inum)
			System.out.println("당신이 입력한 숫자보다 큽니다.");
			else if{
				(rnum < inum) 
				System.out.println("당신이 입력한 숫자보다 작습니다.");
			}else {
				System.out.println("정답입니다. 당신은 " + cnt + "번 만에 정답을 맞추셨습니다.")'
				System.out.println("프로그램을 종료합니다.");
				//break; while을 사용하면 쓸모 x
			}
		}	
	}
}


0개의 댓글