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("요기요");
}
}
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);
}
}
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);
}
}
}
}
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);
}
}
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("여기");
}
}
if(i >0 & j > 1) { //앤퍼센트 연산자
System.out.println("둘 다 true이면..");
}
else {
System.out.println("둘 중 하나라도 false이면..");
}
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 입니다.");
}
}
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 입니다.");
}
}
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 입니다.");
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);
}
}
}
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);
}
}
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개의 수가 결정되었을 때 호출가능함.
}
}