본문 바로가기

programming/Gukbi

국비 교육 13일차 - Class method

728x90
반응형

오늘은 유난히 더 힘들었다

점심에 눈도 오고 뭔가 나쁘지 않았는데 뒤로 갈 수록 실습해보는게 이해는 안되는데 코드는 일단 받아 적어야하고

울며겨자먹기로 꾸역꾸역 수업을 다 들었다.....

 

가면 갈수록 어려워져서 매일 복습 블로깅을 써야지 처음부터 마음먹은게 너무 다행인거 같다

 

여튼 오늘 블로깅 start

아침부터 한건 숫자야구게임 메소드화..

아니 어쩐지 오늘 토나오게 힘들더라니 그냥 어려운결 8시간 내내 해서였다.

 

/*
 *  int[] com : 컴퓨터 난수
 *  int[] user : 사용자 입력값
 *  int s,//여기까지 멤버변수 int b;//지역변수
 *  
 *  1) 컴퓨터가 난수 발생 => int[] com
 *  2) 사용자 입력 => int[] user
 *  3) 비교 => int[] com, int[] user
 *  4) 힌트 => s,b
 *  5) 종료여부 => s
 */
import java.util.Scanner;
public class 야구게임 {

	// 변수
	// 멤버변수 자동 초기화
	int[] com=new int[3];
	int[] user=new int[3];
	int s,b; //s=0, b=0 초기화
	
	// 난수 발생 => int[] com에 저장
	void rand()
	{
		int su=0; // 난수를 저장하는 변수
		boolean bCheck=false; //디폴트값, 지역변수-반드시 초기화
		// true: 중복, false: 중복이 안됨
		// 중복된 수가 있으면 안됨
		// 난수 => 3번을 발생
		for(int i=0; i<3; i++)
		{
			//저장된 데이터가 중복이 있는지 확인
			bCheck=true;
			while(bCheck)
			{
				//난수 발생 1~9사이의 정수 발생
				su=(int)(Math.random()*9)+1; // 1~9사이의 난수 발생
				bCheck=false; // while종료
				// com에 저장된 데이터와 난수를 비교 => 중복이 있는지 확인
				for(int j=0; j<i; j++)
				{
					if(com[j]==su)
					{
						//중복이 있으면 -> while문을 다시 수행
						bCheck=true;
						break;
					}
				}
			} com[i]=su; // 중복수가없다
		}
		
	}
	// 사용자 입력 => int[] user
	void userInput()
	{
		Scanner scan=new Scanner(System.in); // 키보드 입력값을 받아오는 것
		// 자바 => 모든 메소드는 클래스에 존재
		while(true)
		{
			System.out.print("세자리 정수 입력:");
			int input=scan.nextInt();
			// 오류 처리
			// 1. 세자리 정수가 아닌 경우 100~999
			if(input<100 || input>900)
			{
				System.out.println("세자리 정수만 사용이 가능합니다!!");
				continue; // while문 처음으로 이동
			}
			// 2. 중복된 수를 사용할 수 없다
			user[0]=input/100;
			user[1]=(input%100)/10;
			user[2]=input%10;
			
			if(user[0]==user[1]||user[2]==user[1]||user[0]==user[2])
			{
				System.out.println("중복된 수는 사용할 수 없습니다!!");
				continue;
			}
			// 3. 0은 사용할 수 없다
			if(user[0]==0||user[1]==0 || user[2]==0)
			{
				System.out.println("0은 사용할 수 없는 숫자입니다!!");
				continue;
			}
			//while문 종료
			break;				
		}
	}
	// 비교 => int[] com, int[] user
	void compare()
	{
		s=0;
		b=0;
		for(int i =0; i<3; i++)
		{
			for(int j=0; j<3; j++)
			{
				if(com[i]==user[j]) // 같은 숫자이고
				{
					if(i==j) // 같은 자리수
					{
						s++;
					}
					else
					{
						b++;
					}
				}
			}
		}
	}
	// 힌트 => int[] user, s, b
	void hint()
	{
		System.out.printf("Input Number:%d%d%d, Result:%dS-%dB\n", user[0], user[1], user[2],s,b);
	}
	// 종료 => s(3)
	boolean isEnd()
	{
		if(s==3)
			return true;
		return false; // 메소드는 return을 만나면 종료
	}
	
	void process()
	{
		
		rand(); // 난수발생
		// 조립
		while(true)
		{
			// 사용자 정의 입력
			userInput();
			compare();
			hint();
			if(isEnd()==true)
			{
				Scanner scan=new Scanner(System.in);
				System.out.print("종료할까요? (Y|N):");
				char c=scan.next().charAt(0);
				if(c=='Y' || c=='y')
				{
					System.out.println("-게임 끝-");
					System.exit(0);
				}
				else
				{
					System.out.println("새게임을 시작합니다!!");
					process(); // 재귀호출
				}
				System.out.println("-게임 끝-");
				break; // 종료
			}
		}
	}
	public static void main(String[] args) {
		
		야구게임 game=new 야구게임();
		game.process();
	}

}

이거 지금 다시 한 번 써볼려고 했는데 일단은 눈으로 이해하고 넘어간 다음에

주말에나 다시 풀어봐야 할것 같다..

 

지금 다시 하기엔 뒤에 복습할 양이 너무 많음

 

 

/*
 * 	클래스
 * 		1) 구성요소
 * 			= 변수
 * 				멤버변수 : 클래스가 가지고 있는 변수 : new를 사용하면 따라 생성되는 메모리 공간
 * 				class A
 * 				{
 * 				  =========== 자동초기화
 * 				  String name;
 * 				  int age;
 * 				  ===========
 * 				}	
 * 				공유변수 : 클래스에서 공통으로 사용되는 변수 (1개만 생성)
 * 				class A
 * 				{
 * 				  ============
 * 				  static String dept;
 * 				  ============
 * 				}
 * 				지역변수 : 메소드안에서 선언
 * 				class A
 * 				{
 * 					void display()
 * 					{
 * 						=========
 * 						int a=10; ==> 지역변수는 반드시 초기화를 한다
 * 						========= display()가 종료하면 사라지는 변수
 * 					}
 * 				}
 * 
 * 				코드 영역
 * 				=======
 * 				 class
 * 				{
 * 					선언만 가능 = 변수 선언, 메소드 선언 => 구현은 할 수 없다 (메소드 호출, 연산처리, 제어문(X))
 * 				}
 * 				method()
 * 				{
 * 					선언(변수선언), 메소드 호출, 연산처리, 제어문
 * 				}
 * 				==> 사용자 요청 => 처리 (구현)
 * 				프로그램 : 선언(필요한 데이터 선언) + 데이터 처리(읽기, 쓰기, 연산처리, 제어문)
 * 			= 메소드 : 기능처리
 * 					예) 자판기
 * 					   =====
 * 					   동전, 지폐 ==> 변수
 * 					   음료수 
 * 					   ======
 * 					   동전을 첨부 ==> 계산
 * 					   버튼을 클릭
 * 					   잔돈을 계산
 * 					   클래스 => 명사형 + 동사형
 * 							   ====   ====
 * 							   변수	  메소드
 * 				형식)
 * 					= 메소드는 항상 클래스 블록 {} 안에 존재
 * 					  ====== 클래스 종속
 * 					class A
 * 					{
 * 						메소드1(){}
 * 						메소드2(){}
 * 						메소드3(){}
 * 						메소드4(){}
 * 						// 지정 => 시작 메소드 => main 프로그램 안에는 반드시 main이 1개 이상 존재
 * 					}
 * 
 * 					메소드의 구성 요소
 * 					============
 * 					1. 리턴형(반환값)
 * 					2. 메소드명
 * 					3. 매개변수
 * 					
 * 					=> 1. 사용자가 입력한 데이터를 받아서
 * 					   2. 요청 처리
 * 					   3. 결과값을 전송
				형식)
									메소드 => 다른클래스와 연결할때 주로 사용(의미를 부여) => 재사용
									=====
					리턴형(데이터형)		메소드명 (매개변수...: 사용자로부터 받는 값)
					===========
					기본데이터형
					 = 정수형 (int, long, byte, short)
					 = 실수 (float, double)
					 = 논리형 (boolean)
					 = 문자 (char)
					 참조형데이터 (데이터가 여러개인 경우)
					 = 배열 : 목록출력
					 = 클래스 : 상세보기
				= 리턴형 (O), 매개변수(O)
				= 리턴형 (O), 매개변수(X)
				=======================
				= 리턴형 (X), 매개변수(O)
				= 리턴형 (X), 매개변수(X)	 
				========================
				반드시 void라고 사용한다 ==> 데이터베이스 (수정, 삭제, 추가)
				
				= 멤버 메소드 : 리턴형 메소드명(매개변수...) - new를 이용해서 저장 (*대부분 멤버 메소드)
				= 공유 메소드 : static 리턴형 메소드명(매개변수..) 
							데이터형 변환
							String.valueOf()
							String s = "Hello";
							s.substring()
							String s1="Java"
							
							String s = "Hello Java!!";
							s.substring(0,2)
							String s1="Oracle Hello!!";
							
							String.valueOf(10) => "10"
							String.valueOf(true) => "true"
							
							Math.random()
 *			= 생성자
 * 
 * 			동작 : 일치 ==> static (웹사이트에 static이 많음-공유하는 데이터가 많기 때문에)
 * 			동작 : 다르다 ==> 인스턴스 메소드
 */
/*
 * 	학생 성적 계산 
 * 	저장되는 데이터 
 * 	학점
 * 	총점
 * 	평균
 * 	점수 입력
 */
import java.util.Scanner;
/*
 * static은 멤버메소드 아니라 => 독립적인 메소드
 * 
 */
public class 클래스구성요소 {
		
	String name;
	int kor, eng, math;
	//점수 입력
	int input(String subject)
	{
		Scanner scan = new Scanner(System.in);
		System.out.print(subject+" 점수 입력:");
		return scan.nextInt();
	}
	void input2 ()
	{
		Scanner scan = new Scanner(System.in);
		System.out.print("국어 점수 입력:");
		kor=scan.nextInt();
		System.out.print("영어 점수 입력:");
		eng=scan.nextInt();
		System.out.print("수학 점수 입력:");
		math=scan.nextInt();
	}
	// 총점
	int total()
	{
		return kor+eng+math;
	}
	// 평균
	double avg()
	{
		return (kor+eng+math)/3.0;
	}
	public static void main(String[] args) {
		
		// 클래스 저장
		클래스구성요소 jeno=new 클래스구성요소();
		클래스구성요소 renjun=new 클래스구성요소();
		jeno.kor=jeno.input("국어");
		jeno.eng=jeno.input("영어");
		jeno.math=jeno.input("수학");
		
		int total=jeno.total();
		double avg=jeno.avg();
		
		renjun.input2();
		
		// 출력
		System.out.println("국어점수:"+jeno.kor);
		System.out.println("영어점수:"+jeno.eng);
		System.out.println("수학점수:"+jeno.math);
		System.out.println("총점:"+total);
		System.out.printf("평균: %.2f",avg);
		
	}

}

사실상 여기가 오늘 배운 메인이었다. 

클래스 안에서 변수와 메소드를 사용하는 방법..

 

static을 사용해서 공유로 쓸것인지 아닌지를 판단하는게 중요하다고 했다. 

예제로 쓴 점수 계산 프로그램을 참조하면 된다. 

 

main 밖에서 멤버변수와 method를 지정하고 

클래스구성요소 jeno=new 클래스구성요소(); <-라고 써주면 인스턴스값이 메모리에 저장된다. 

이렇게 해놓아야지 main안에서 쓸 수 있는것을 꼭 기억해야 한다. 

 

 

 

클래스 내에서 변수와 메소드가 어떻게 쓰이는지 잘 볼 수 있는 예제이다. 

main 밖에서 Music이라는 클래스를 만들어 줬고, title, singer라는 멤버 변수들도 선언해줬다. 

 

이걸 사용하기 위해서는 main 안에서 new를 이용해서 새로운 메모리에 저장을 해주면 된다. 

 

두번째 노래명, 가수명이 null값이 나오는 이유는 메모리에 저장을 안해줬기 때문이다. 

그리고 main안에서는 저장해줬기 때문에 print() 메소드를 호출하면 지정해준 값들이 출력된다. 

 

그리고 m2, m1, m3을 직접 출력해서 나온 값은 전부 메모리 주소 값이다. 

m3=m1을 통해 같은 메모리를 사용하도록 제어했기 때문에 

어느 한 인스턴스에서 값을 바꿔도 연동되어서 값이 변경된다. 

 

 

일단 여기까지만 이해해도 반은 성공한거 같다....

 

 

 

 

728x90
반응형