[2023.09.26] 개발자 교육 7일 차 : 강의-복습, for 문, if 문, 랜덤게임 [구디 아카데미/김승수 강사님]

DaramGee·2023년 9월 26일
0

오늘 정리

Flow Chart? 코딩이란 프로그램을 설계하는 것, 그 과정을 도식화하여 그려보는 것은 설계하는 것에 큰 도움이 된다.

코딩의 step up? 기본적인 과정부터 조금씩 습득되는 지식들로 코드를 업그레이드 하는 것이 필요하다.

복습

  • RandomGame 클래스의 구성

    • 여러 클래스가 함께 사용되는 것은 서로 의존관계가 있는 것

    • package com.step3;
      
      import java.util.Random;
      import java.util.Scanner;
      
      public class RandomGame {
      	//선언부
      	//새로 채번된 숫자를 담는 정답을 담는 전역변수
      	int dap = -1; //-1 end of file 찾아도 없다
      	//사용자가 입력하는 숫자는 입력할때마다 바뀌어야하니까 지역변수로 설정
      	//게임 메소드 선언
      	//새 게임을 누를 때 마다 호출되는 메소드
      	//여기서 채번되는 숫자가 정답이므로 노출하지 않는다. - 그래서 나는 전변으로 선언함.
      	public void newGame() {
      		Random r = new Random();
      		//리턴타입이 없어도 전변이면 어떤 메소드에서도 재정의가 가능하다.
      		dap = r.nextInt(10); //답이 결정됨, 종료가 될 때 까지 값이 유지되어야 한다.
      	}
      	//문자로 응답 판정을 내려주는 메소드 선언
      	/***********************************************************************************************************************
      	 * 판정을 내려주는 메소드 구현하기
      	 * @param - user - 사용자가 숫자를 맞추기 위해서 입력하는 값을 담는 변수, 입력할 때 마다 바뀜(지변)
      	 * @return - String - 힌트를 반환한다(예시 : 높여라, 낮춰라, 정답입니다. 축하합니다)
      	 ***********************************************************************************************************************/
      	public String account(int user) {  //user -> 매번 화면에 사용자가 입력하고 엔터를 친 값
      //		System.out.println("dap : " + dap + "," + "user : " + user);   //출력해서 확인해보기
      		String hint = null;
      		if(dap == user) {
      			hint = "정답입니다.";
      		}else if(dap > user){
      			hint = "높여라";
      		}else if(dap < user) {
      			hint = "낮춰라";
      		}
      		return hint;		
      	}
      	//메시지 출력
      	//메소드 파라미터 자리에 리턴타입이 존재하는 메소드를 호출할 수 있다는 것을 보여주기 위해 추가한 메소드
      	//우선 생략
      //	public void messagePrint(int user) {                        //호출되면 5가 복사됨 -> call by value
      //		System.out.println(account(user));                       //24 -> 5를 쥐고 간다 -> 높여라 출력
      //	}
      	
      	public static void main(String[] args) {
      		RandomGame rg = new RandomGame();  //f6
      //		rg.account(5);                                       //높여라가 출력은 이게 아니라
      		rg.newGame();                                      //f5(메소드 안으로 들어감)  
      		//이 메소드가 호출되어야 0~9 사이의 숫자가 채번된다.그래서 채번된 숫자는dap에 담김
      		//아래 메소드 호출 시 파라미터 자리에 5를 넘겨주고, 37번에서 account() 호출될 때 user 값
      		//즉 5가 파라미터로 넘어감. 
      		//24번에서도 user값이 5가 된다. -> 원시형 타입이기 때문에 값이 호출됨.
      		Scanner sc = new Scanner(System.in);
      		for(int i=0; i<5 ; i++) {
      			System.out.println("0부터 9사이의 숫자를 입력하세요.(입력 후 엔터치기)");
      		    int user = sc.nextInt();  // 초기화 5번 반복됨(덮어쓰기 5회, 마지막 값만 유지됨)
      		    String hint = rg.account(user);
      		    if(hint.equals("정답입니다.")) {
      		    	System.out.println("진행횟수 : " + (i+1) + " 축하합니다. 정답입니다.");
      		    	break;		 //5회 이전에 정답을 맞추면 for문 탈출   
      		    }
      		    else if(hint.equals("높여라")) {
      		    	System.out.println("진행횟수 : " + (i+1) + " 힌트 : 더 큰 숫자를 입력하세요.");
      		    }
      		    else if(hint.equals("낮춰라")) {
      		    	System.out.println("진행횟수 : " + (i+1) + " 힌트 : 더 낮은 숫자를 입력하세요.");
      		    }
      		    //insert here (낮춰라, 높여라 케이스 추가)
      		}
      	}
      
      }

  • for문

package com.step3;

public class Break1 {

	public static void main(String[] args) {
		for(int i=2; i<10; i++) {
			//if문에 return을 만나면 메소드를 탈출하고
			//if문이 반복문 안에 있을 때는 break; 사용할 수 있고, for문을 탈출함. 
			if(i == 6) break; //for문 밖으로 탈출
		}
		System.out.println("요기요");
	}	
	
}
  • for문 실습 1
public static void main(String[] args) {
			//1부터 10까지 합 더해보자
			int i = 1;
			int hap = 0; //초기화
			for(i=1; i<=10; i++) {   //(초기화; 조건식; 증감연산자)
				hap = hap + i;   //for문 안에 기입
				System.out.println(i + ", " + hap);
			}
}
  • for문 실습2 (for문 + if문)
public static void main(String[] args) {
//1부터 10까지를 세면서(for문) 홀수(if문)의 합을 구하는 프로그램 작성  
			int i = 1;
			int hap = 0;
			for(i=1;i<=10; i++) {
				if(i%2 == 1) {
					hap = hap + i;
				}
				System.out.println(i +", "+ hap);
			}
	}

package com.step3;
//변수는 몇 개 필요
//변수의 타입은?
//for문 안에 if문? 5에 fizz, 7에 buzz
//조건을 따질 때 fizz를 먼저 따져야 하는지, 
//fizzbuzz(5와 7의 공배수) 먼저 따져야 하는지?  
//예로 35는 5로 나누어 나머지가 0일 경우, fizz를 출력하므로
//원하는 결과가 아니다.     -> 공배수를 먼저 따져놔야 함. 
//조건을 따질때도 순서가 결과에 영향이 있다. 
class FizzBuzz{
}
public class FizzBuzzGame {

	public static void main(String[] args) {
		int i = 0;
		for(i=1; i<=1000; i++) {
			if(i%7 == 0 & i%5 == 0) {
				System.out.println("FizzBuzz");
			}
			else if(i%5 == 0) {
				System.out.println("Fizz");
			}
			else if(i%7 == 0) {
				System.out.println("Buzz");
			}else {
				System.out.println(i);
			}
		}
	}
}
  • 리턴
    • step 1 : 리턴타입의 종류와 작성법에 대해 안다.
      • void의 경우, 반환값을 받을 수 없다.(그 외는 받을 수 있다)
    • step 2 : 리턴타입에 참조형을 사용할 줄 안다.
      • 인스턴스 후 반환 값을 넣을 수 있다 | 없다
package com.step3;

import java.util.Random;

public class Return {
	void m() {              
		System.out.println("void 리턴타입의 경우, 반환값을 받을 수 없다");
	}
	int m2() {              //
		System.out.println("int 리턴타입의 경우, 반환값을 받을 수 있다");
		return 0;
	}
	String m3() {
		System.out.println("String 리턴타입의 경우, 반환값을 받을 수 있다");
		return "높여라";
	}
	Random m4() {
		System.out.println("클래스 리턴타입의 경우, 반환값을 받을 수 있다");
		return new Random();   //변수선언 없이 직접 객체 생성 -> 이전 : Random r = new Random(); 후 r 로 기입
	}
	Random m5() {
		System.out.println("클래스 리턴타입의 경우, 반환값을 받을 수 있다");
		return new Random();   //변수선언 없이 직접 객체 생성 -> 이전 : Random r = new Random(); 후 r 로 기입
	}
	public static void main(String[] args) {
		Return r = new Return();
//		int i = r.m();                       //반환값이 갈 수 없는 메소드이기 때문에 반환값 넣을 수 x
//		System.out.println(r.m());      //반환값이 갈 수 없는 메소드이기 때문에 반환값 넣을 수 x
		int i = r.m2();                     //반환값이 갈 수 있는 메소드이기 때문에 반환값 넣을 수 ㅇ
		System.out.println(r.m2());    //반환값이 갈 수 있는 메소드이기 때문에 반환값 넣을 수 ㅇ
		System.out.println(r.m3());    //반환값이 갈 수 있는 메소드이기 때문에 반환값 넣을 수 ㅇ
		//m4와 m5 메소드의 리턴타입은 오브젝트이다.
		//그러므로 뒤에 메소드를 호출할 수 있다.
		System.out.println(r.m4().nextInt(10));    //반환값이 갈 수 있는 메소드이기 때문에 반환값 넣을 수 ㅇ
		System.out.println(r.m5().nextInt(5));    //반환값이 갈 수 있는 메소드이기 때문에 반환값 넣을 수 ㅇ
} 

}
package com.step3;

public class Return3 {
	String m(int i) {   //조건의 기준이 되는 임의의 i 변수를 받음
		String hint = null;
		//조건에 따라 return을 사용하게 되므로, 못 만날 수도 있다.
		//그래서 else문을 추가해서 디폴트 값이라도 넣어야 한다.
    //위의 조건에도 맞지 않는 상황일 때에도 에러가 없이 값이 나오도록 표시(웹 응답페이지 등에서 사용)
		if(i<0) {    //너 음수니?
			hint = "너 음수야.";
			return hint;
		}else if(i>0) { //너 양수니?
			hint = "너 양수야.";
			return hint;
		}else {                         
			return "";
		}
	}
	public static void main(String[] args) {
		Return3 r3 = new Return3();
		String hint = r3.m(10);
		System.out.println(hint);
	}
}
  • if문
    • if문 안에 return을 사용하면 메소드를 탈출하여 메인메소드로 이동함
package com.step3;

public class Return2 {
	void m(int i) {  //12번에 호출될 때 파라미터 자리에 -1 있다.
		if(i == -1) { //-1과 같니? 네
			return;    //if문 안에 return을 사용하면 메소드를 탈출하여 메인메소드로 이동함
		}
		System.out.println("요기");            //출력x
	}
	public static void main(String[] args) {
		Return2 r2 = new Return2();
		r2.m(-1);
		System.out.println("여기");
	}

}

강의 내용

  • 코드 도식화 Flow Chart
    • 사고의 흐름을 도식화하여 코드를 그린 뒤 작성해보는 것이 코드를 이해하는 것에 도움이 됨.
    • 구체화, 직관적 사고 가능
  • for문
    • 반복해서 같은 코드를 사용해야하는 경우에 for문 사용
  • 앰퍼샌드 (ampersand) 연산자
if(i >0 & j > 1) {    //앤퍼센트 연산자
			System.out.println("둘 다 true이면..");
			
		}
		else {
			System.out.println("둘 중 하나라도 false이면..");
		}
  • 연습문제1(ver1→메인에 다 넣기)
package com.step3;

import java.util.Scanner;

//연습문제
//1. 달의 중력은 지구 중력의 17%에 불과합니다. 지구에서 몸무게가 100kg인 사람은 달에 가면 17kg밖에 안됩니다.
//당신의 몸무게는 달에서 얼마입니까?
//몸무게 N은 실수이고 키보드로부터 입력받습니다.
//
//출력)  지구몸무게  : 100
//      달 몸무게 : 17kg
class MoonWeight{
	
}
public class MoonWeightMain {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		double user = 0.0;
		double g = 0.17;
		System.out.println("당신의 몸무게를 입력해주세요.");
		user = sc.nextDouble();
		System.out.println("당신의 몸무게는 달에서 "+user*g + " kg 입니다.");

	}

}
  • 연습문제1(ver2→클래스 나누기, 인스턴스화)
package com.step3;

import java.util.Scanner;

class MoonWeight{
		double moon = 0.0;
		double account(int earth) {   //메인에서 입력된 지구의 몸무게 출력희망 -> call by value 값에 의한 호출, 파라미터 안에 기입
			moon = (earth*17)/100.0;
			return moon;
		}
}
public class MoonWeightMain {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("당신의 몸무게를 입력해주세요.");
		int user = sc.nextInt();
		System.out.println("당신의 몸무게는 " + user + "kg 입니다");
		MoonWeight mw = new MoonWeight();
		System.out.println("당신의 몸무게는 달에서 "+mw.account(user)+ " kg 입니다.");
	}
}
  • 연습문제1(ver3→메소드 분리, 함수형 프로그래밍 유행 중)
package com.step3;

import java.util.Scanner;

class MoonWeight{
		//사용자로부터 입력받는 값을 별도의 메소드로 선언해보기
		//리턴타입 int인 이유는? nextInt 메소드(콘솔에 입력한 값 가져오는)의 소유주가 스캐너다
		//nextInt로 가져오는 값이 int이므로, 리턴타입 또한 동일하게 int로 설정해야함.
		//파라미터 값은 필요x
		//화면쪽에 리액트가 활용되고, 더해서 타입스크립트가 등장하며, 
		//this가 코드에 따라 참조하는 객체가 달라졌다. ->초보멘붕
		int getUser() {
			Scanner sc = new Scanner(System.in);
			int user = sc.nextInt();
			return user;
		}
		double moon = 0.0;
		double account(int earth) {   //메인에서 입력된 지구의 몸무게 출력희망 -> call by value 값에 의한 호출, 파라미터 안에 기입
			moon = (earth*17)/100.0;
			return moon;
		}
}
public class MoonWeightMain {

	public static void main(String[] args) {
		MoonWeight mw = new MoonWeight();
		System.out.println("당신의 몸무게를 입력해주세요.");
		int user = mw.getUser();
		System.out.println("당신의 몸무게는 " + user + "kg 입니다");
		System.out.println("당신의 몸무게는 달에서 "+ mw.account(user) + " kg 입니다.");
	}
}
    //메소드 호출 결과를 리턴타입으로 받아서 처리하는 방법과 
		//바로 직접 메소드를 호출하는 것은 차이가 있다|없다??
		//문제점 = 인스턴스 변수 하나에 대해 입력받은 지구의 값도 하나여야 하는데
		//만일 변수로 치환하지 않고, 매번 메소드를 새로 호출하면 입력받는 값이 그때마다 변경되어서
		//이런 상황일 때는 리턴타입으로 받아서 그 변수를 사용해야한다.
    //System.out.println("당신의 몸무게는 " + mw.getUser() + "kg 입니다");
    //System.out.println("당신의 몸무게는 달에서 "+mw.account(mw.getUser())+ " kg 입니다.");
		int user = mw.getUser();
    System.out.println("당신의 몸무게는 " + user + "kg 입니다");
		System.out.println("당신의 몸무게는 달에서 "+ mw.account(user) + " kg 입니다.");
  • 연습문제2(ver1)
package com.step3;

import java.util.Scanner;

//2. 두 개의 정수 중에서 큰 숫자를 반환하는 max메소드를 구현하세요.
//   두 개의 정수를 입력 받고 큰 숫자를 출력합니다.
//
//  출력) 정수(두 개) : 5 8
//           최대값 : 8
public class Practice2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int i = 0;
		int j = 0;
		System.out.println("첫번째 숫자를 넣어주세요");
		i = sc.nextInt();
		System.out.println("두번째 숫자를 넣어주세요");
		j = sc.nextInt();
		System.out.println("정수(두 개) : "+i +" "+ j);
		if(i<j) {
			System.out.println("최대값 : "+j);
		}else {
			System.out.println("최대값 : "+i);
		}
	}
}
  • 연습문제2(ver2→직접 작성)
package com.step3;

import java.util.Scanner;

class MaxPrint{
	//큰 숫자를 반환하는 함수를 구현
	int Max(int n1, int n2) {
		if(n1 > n2) {
			System.out.println("정수(두 개) : " + n1 +", "+ n2 + " / 최대값 : " + n1 );
			return n1;
		}else if(n1 < n2) {
			System.out.println("정수(두 개) : " + n1 +", "+ n2 + " / 최대값 : " + n2 );
			return n2;
		}else {
			System.out.println("정수(두 개) : " + n1 +", "+ n2 + " / 두 수는 같은 값입니다." );
			return n1;
		}
	} 
}
public class MaxPrintmain {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		MaxPrint m = new MaxPrint();
		System.out.println("첫 번째 숫자를 넣어주세요");
		int i = sc.nextInt();
		System.out.println("두 번째 숫자를 넣어주세요");
		int j = sc.nextInt();
		m.Max(i, j);
	}
}
  • 연습문제2(ver3→for 문 사용)
    • 웹 개발에서 html 페이지에서 처리결과를 출력할 때 사용
package com.step3;

import java.util.Scanner;

class MaxPrint{
	//큰 숫자를 반환하는 함수를 구현
	int Max(int n1, int n2) {
		if(n1 > n2) {
			return n1;
		}else if(n1 < n2) {
			return n2;
		}else {
			return -1;  //-1은 end of file의 의미
		}
	} 
}
public class MaxPrintmain {

	public static void main(String[] args) {
		MaxPrint mp = new MaxPrint();
		Scanner sc = new Scanner(System.in);
		int user1 = 0;
		int user2 = 0;
		for(int i = 0; i<2; i++) {
			if(i==0) {        //첫 번째 실행 시 코드
				System.out.println("첫 번째 수를 넣어 주세요.");
				user1 = sc.nextInt();   //이렇게 넣게 될 경우, user1 변수에만 값이 두 번 담기며 덮어쓰기 됨.
			}
			else if(i==1) { //두 번째 실행 시 코드
				System.out.println("두 번째 수를 넣어 주세요.");
				user2 = sc.nextInt();   //이렇게 넣게 될 경우, user1 변수에만 값이 두 번 담기며 덮어쓰기 됨.
			}
			System.out.println("user1 : " + user1 + ", " + "user2 : " + user2);  //user2는 계속 0밖에 안 찍힘. 
		}
			System.out.println(user1 +", "+ user2);
			int big = mp.Max(user1, user2);
			System.out.println("두 수 중 최대값은 "+big+ " 입니다.");
	}
}
public class MaxPrintmain {

	public static void main(String[] args) {
		MaxPrint mp = new MaxPrint();
		Scanner sc = new Scanner(System.in);
		int user1 = 0;
		int user2 = 0;
		for(int i = 0; i<2; i++) {
			user1 = sc.nextInt();   //이렇게 넣게 될 경우, user1 변수에만 값이 두 번 담기며 덮어쓰기 됨.
			System.out.println("user1" + user1 + ", " + "user2" + user2);  //user2는 계속 0밖에 안 찍힘. 
		}
		System.out.println(user1 +", "+ user2);
//		//서로 다른 두 수를 받아서 크고, 작은지를 비교해야 하므로
//		//메소드 호출 전에 두 수가 먼저 결정되어 있어야 함. -> for문 밖에서 Max 메소드를 호출해야 함.
//		mp.Max(i, user);      //for 문 밖에서 사용되어야 2개의 수가 결정되었을 때 호출가능함. 
	}
}
  • Scanner함수
    - JVM 내장되어있으며, java.util 폴더에 선언되어 있는 클래스임.
    - java.lang 폴더가 아닌 폴더는 import 문으로 물리적 위치를 나타내야 함.
    - 정의된 메소드는 인스턴스변수. 후 확인 가능(nextInt 등)
    - quick fix의 기능은 이클립스의 API 즉, document문서를 제공받고 있어서 확인이 가능한 것임.

0개의 댓글