[JAVA]14일차(static/클래스 변수(static변수)/클래스 메소드(static 메소드)/학생별로 국어점수, 영어점수, 수학점수를 입력받아 총점, 평균을 계산하는 프로그램/가위, 바위, 보 게임)

정효진·2021년 8월 2일
0

Developer Study

목록 보기
16/47
post-thumbnail

8월2일(월)

Test096~Test099

◼ 클래스와 인스턴스

public class test 
{ 
	int iv; // 인스턴스 변수 
	static int cv; // 클래스 변수 
	void method() 
 	{ 
	    int lv; // 지역 변수 
	} 
}

▪ 클래스 변수(static변수)와 클래스 메소드(static 메소드)

  • 클래스 변수 또는 클래스 메소드는 클래스 정보가 로딩되는 순간 메모리 할당이 이루어지며 클래스 이름 또는 객체(인스턴스)를 통해 전근할 수 있다.
    즉, 『new』연산자를 통해 메모리를 할당받지 않아도 사용이 가능하다는 것이다.
  • 클래스 변수에 접근하기 위해서는 『클래스명.변수명』 의 형태로 클래스의 이름을 통해 접근하는 것이 가능하다.
  • 같은 클래스 내부에 존재하면 클래스의 이름을 생략하는 것이 가능하다.
  • 클래스 메소드에서 클래스 메소드의 호출은 가능하며, 『클래스명.메소드명()』의 형태로 접근하여 호출하는 것이 가능하다.
    또한, 같은 클래스 내부에 존재하면 클래스의 이름을 생략하는 것이 가능하다.
  • 클래스 변수나 클래스 메소드는
    『생성된인스턴스명.변수명』
    『생성된인스턴스명.메소드명()』의 형태로도 접근(호출)이 가능하지만 『클래스명.변수명』 --------(일반적)
    『클래스명.메소드명()』의 형태로 접근(호출)하는 것이 일반적인다.

▪ 인스턴스 변수와 인스턴스 메소드

  • 인스턴스 변수 또는 인스턴스 메소드는 동일한 클래스의 메소드에서는 바로 접근하는 것이 가능하지만 클래스 메소드에서는 접근할 수 없다.

▪ 클래스와 인스턴스 코드

public class hyodii096
{
	static int a = 10;

	int b = 20;

	void write()
	{
		System.out.println("클래스 변수 a : " + a);
		System.out.println("인스턴스 변수 b : " + b);
	}

	static void print()
	{
		System.out.println("클래스 변수 a : " + a);  
		//System.out.println("인스턴스 변수 b : " +b); //접근 불가능
	}


	public static void main(String[] args)
	{
		System.out.println("main() -> 클래스 변수 a : " + hyodii096.a);

		System.out.println("main() -> 클래스 변수 a : " + a);
		
		hyodii096.print();
		print();

		//System.out.println("main() -> 인스턴스 변수 b : " + b);  //접근 불가능
		//hyodii096.write();  //접근 불가능
		
		hyodii096 ob = new hyodii096();
		System.out.println("main() -> 인스턴스 변수 b : " + ob.b);

		ob.write();

		System.out.println("main() -> 클래스 변수 a : " +ob.a);

		ob.print();

		//3가지 방법 --- 2번째가 일반적임
		System.out.println("main() -> 클래스 변수 a : " + a);
		System.out.println("main() -> 클래스 변수 a : " + hyodii096.a);
		System.out.println("main() -> 클래스 별수 a : " + ob.a);


		hyodii096 ob2 = new hyodii096();

		ob2.a = 10000;
		ob2.b = 20000;

		System.out.println("ob2확인 ---------------------------");
		ob2.write();
		ob2.print();

		System.out.println();
		System.out.println("ob확인 ---------------------------");
		ob.write();
		ob.print();
	}
}

▪ 클래스와 인스턴스 코드 설명📝

public class Test096
{
	// ※ 클래스 변수 또는 클래스 메소드는
	//    클래스 정보가 로딩되는 순간 메모리 할당이 이루어지며
	//    클래스 이름 또는 객체(인스턴스)를 통해 전근할 수 있다.
	//	  즉, 『new』연산자를 통해 메모리를 할당받지 않아도
	//    사용이 가능하다는 것이다.
	static int a = 10;   //-- static 변수(클래스 변수) class 변수

	// ※ 인스턴스 변수 또는 인스턴스 메소드는 
	//  동일한 클래스의 메소드에서는 바로 접근하는 것이 가능하지만
	//  클래스 메소드에서는 접근할 수 없다.
	
	int b = 20;                //-- non-static 변수(인스턴스 변수) instance 변수
	
	void write()               //-- non- static 메소드(인스턴스 메소드) instance 메소드
	{
		System.out.println("클래스 변수 a : " + a);      //접근가능
		System.out.println("인스턴스 변수 b : " + b);  //접근가능
		
	}

	static void print()        //--static 메소드(인스턴스 메소드) instance 메소드
	{
		System.out.println("클래스 변수 a : " + a);	      //접근가능
		//System.out.println("인스턴스 변수 b : " + b);   //접근불가능   에러발생(컴파일 에러)
	}
	
	public static void main(String[] args)
	{
		System.out.println("main() -> 클래스 변수 a : " + Test096.a);  //이게 바람직함!
		//-- 클래스 변수에 접근하기 위해서는
		//   『클래스명.변수명』 의 형태로
		//   클래스의 이름을 통해 접근하는 것이 가능하다.
		//--==>> main() -> 클래스 변수 a : 10

		System.out.println("main() -> 클래스 변수 a : " + a);  //메인도 스태틱 a도 스태틱
		//--==>> main() -> 클래스 변수 a : 10
		//-- 같은 클래스 내부에 존재하기 때문에
		//   클래스의 이름을 생략하는 것이 가능하다.

		Test096.print();
		print();
		//--==>> 클래스 변수 a : 10
		//		 클래스 변수 a : 10
		//-- 클래스 메소드에서 클래스 메소드의 호출은 가능하며,
		//   『클래스명.메소드명()』의 형태로 접근하여 호출하는 것이 가능하다.
		//   또한, 지금은 같은 클래스 내부에 존재하기 때문에
		//   클래스의 이름을 생략하는 것이 가능하다.

		//System.out.println("main() -> 인스턴스 변수 b : " + b);
		//--==>> 에러발생(컴파일 에러)
		//System.out.println("main() -> 인스턴스 변수 b : " + Test096.b);
		//--==>> 에러발생(컴파일 에러)

		//Test096.write();
		//--==>> 에러발생(컴파일 에러)
		//write();
		//--==>> 에러발생(컴파일 에러)
		
		// Test096 클래스 기반 인스턴스 생성
		Test096 ob = new Test096();

		//System.out.println("main() -> 인스턴스 변수 b : " + b); //인스턴스를 통해서 접근해야함
		//--==>> 에러발생(컴파일 에러)

		//생성된 인스턴스를 통한 인스턴스 변수 접근
		System.out.println("main() -> 인스턴스 변수 b : " + ob.b);
		//--==>> main() -> 인스턴스 변수 b : 20

		//생성된 인스턴스를 통한 인스턴스 메소드 접근(호출)
		ob.write();
		//--==>> 클래스 변수 a : 10
		//       인스턴스스 변수 b : 20

		// 생성된 인스턴스를 통한 클래스 변수 접근
		System.out.println("main() -> 클래스 변수 a : " + ob.a);
		//--==>> main() -> 클래스 변수 a : 10

		//생성된 인스턴스를 통한 인스턴스 메소드 접근(호출)
		ob.print();
		//--==>> 클래스 변수 a : 10

		// ※ 클래스 변수나 클래스 메소드는
		//    『생성된인스턴스명.변수명』
		//    『생성된인스턴스명.메소드명()』
		//    의 형태로도 접근(호출)이 가능하지만
		//    『클래스명.변수명』 --------(일반적)
		//    『클래스명.메소드명()』
		//    의 형태로 접근(호출)하는 것이 일반적인다.

		System.out.println("main() -> 클래스 변수 a : " + a);
		System.out.println("main() -> 클래스 변수 a : " + Test096.a);  //----(일반적)
		System.out.println("main() -> 클래스 변수 a : " + ob.a);
		//--==>>main() -> 클래스 변수 a : 10
		//      main() -> 클래스 변수 a : 10
		//      main() -> 클래스 변수 a : 10


		//----------여기까지 탄생 시점을 기반으로 접근 가능여부 확인

		System.out.println(); //개행

		//Test096 클래스 기반 인스턴스 생성
		Test096 ob2 = new Test096();

		ob2.a = 10000;       //-- 클래스 변수 초기화   (스테이플러)
		ob2.b = 20000;       //-- 인스턴스 변수 초기화 (스테이플러)

		System.out.println("ob2확인 -------------------------");
		ob2.write();
		ob2.print();
		//--==>>  ob2확인 -------------------------
		//        클래스 변수 a : 10000
		//        인스턴스 변수 b : 20000
        //        클래스 변수 a : 10000


		System.out.println();
		System.out.println("ob확인 -------------------------");
		ob.write();
		ob.print();
		//--==>>  ob확인 -------------------------
		//        클래스 변수 a : 10000
		//	      인스턴스 변수 b : 20
		//        클래스 변수 a : 10000


	}
}

▪ 클래스의 개념을 활용하여 학생별로 국어점수, 영어점수, 수학점수를 입력받아 총점, 평균을 계산하는 프로그램 코드 설명📝

// 1. record 클래스
//	 - 속성만 존재하는 클래스로 설계할 것~!!

public class Record
{
	// 학생 한 명을 표현할 수 있는 속성들로 구성~!!! check~!!!

	String name;              //--이름
	//int kor, eng, mat;        //-- 각 과목의 점수(국어, 영어, 수학)
	int[] score = new int[3]; // score[0] = 국어, score[1] = 영어, score[2] = 수학
	int tot;                  //--총점
	double avg;               //--평균
	int rank;                 //--석차(등수)

}
/*
2. Sungjuk 클래스
	- 인원 수를 입력받아, 입력받은 인원 수 만큼
	  이름, 국어점수, 영어점수, 수학점수를 입력받고
	  총점과 평균을 산출하는 클래스로 설계할 것~!!!
		* 속성 : 인원수, record 형태의 배열
		* 기능 : 인원 수 입력, 상세 데이터 입력, 총점 및 평균 연산, 결과 출력

*/

import java.util.Scanner;

public class Sungjuk
{
	// 주요 속성 구성(주요 변수 선언)
	int inwon;                     //-- 인원 수
	Record[] rec;                  //-- Record 배열(학생 한 명 당 Record 배열 방 한 개 활용)
		                           //   Record 를 기반으로 생성된 객체만 담아낼 수 있는 배열


	// 주요 메소드 정의(기능 구성)
	// 1. 인원 수 입력
	public void set()
	{
		Scanner sc = new Scanner(System.in);

		do
		{
			System.out.print("인원 수 입력(1~100) : ");
			inwon = sc.nextInt();
		}
		while (inwon<1 || inwon>100);

		// check~!!!
		// Record 클래스를 기반으로 생성된 객체(인스턴스)를 담을 수 있는
		// 배열방을 inwon 만큼 생성
		//record [] rec = new record[inwon];
		rec = new Record[inwon];

		//-- Record 배열방을 inwon 만큼 생성한 것이지
		//   Record 클래스의 인스턴스를 생성한 것은 아니다. (학생이 앉을수있는 좌석(틀)을 만든것이고 학생을 만든건 아님)
	}


	// 주요 메소드 정의(기능 구성)
	// 2. 상세 데이터 입력(총점 및 평균 산출 기능 포함)
	public void input()     //입력받은 값을 rec 배열방에 넣을 것
	{
		Scanner sc = new Scanner(System.in);

		String[] title = {"국어 점수 : ", "영어 점수 : ", "수학 점수 : "};
			
		// 인원 수 만큼 반복 -> 인원 수에 기반하여 만들어진 배열의 길이만큼 반복
		for (int i=0; i<inwon; i++)  // for(int i=0; i<rec.length; i++) 같은의미		// 웅~~!!!!
		{
			//check~!!!
			// Record 클래스 기반의 인스턴스 생성
			/* 한번 씩 돌때마다 Record의 인스턴스를 생성해야함
			Record ob = new Record();	//-- ⓐ
			ob.name
			ob.tot

			rec[i] = ob;
			rec[i].name
			rec[i].tot
			*/
			//rec[i] = new record();	// 인스턴스 생성구문... 위의 ⓐ 처럼... 클래스 이름 대문자
			rec[i] = new Record();

			System.out.printf("%d번째 학생의 이름 입력 : ", (i+1));
			rec[i].name = sc.next();

				
			/*
			System.out.printf("%d번째 학생의 이름 입력 : ",(i+1));
			//rec배열의i번째방의 이름 = sc.next();
			rec[i].name = sc.next();

			System.out.print("국어 점수 : ");
			//rec배열의i번째방의 국어 = sc.nextInt();
			rec[i].kor = sc.nextInt();

			System.out.print("영어 점수 : ");
			//rec배열의i번째방의 영어 = sc.nextInt();
			rec[i].eng = sc.nextInt();

			System.out.print("수학 점수 : ");
			//rec배열의i번째방의 수학 = sc.nextInt();
			rec[i].mat = sc.nextInt();
			*/

			for (int j=0; j<title.length; j++)   //숑숑숑 0 1 2			// 쑝~~!!!
			{
				// 안내 메세지 출력
				System.out.print(title[j]);

				// 배열 이름 스코어(score)
				//사용자가 입력한 데이터를 스코어(score) 배열에 담아내기
				//rec[i].sore[j] = sc.nextInt();         // i번째 학생의 score[0] -> 국어점수
				rec[i].score[j] = sc.nextInt();			 // i번째 학생의 score[1] -> 영어점수
												         // i번째 학생의 score[2] -> 수학점수
				
				// 국어, 영어, 수학 점수 데이터를 반복적으로 입력받는 동안
				//총점 누적하기
				rec[i].tot += rec[i].score[j];

			}

			// 평균 산출하기
			 rec[i].avg = rec[i].tot / 3.0;
		}

	}//end input()

	// 주요 메소드 정의(기능 구성)
	// 3. 결과 출력
	//정효진 90 80 70 240 xx.xx   2
	//가나다 82 72 62 xxx xx.xx   3
	//라마바 98 88 78 xxx xx.xx   1
	public void print()
	{
		System.out.println(); //개행

		// 학생 한 명 당 반복 출력구문 구성
		for (int i=0; i<inwon; i++)							// 웅~!!!
		{
			//check~!!!!
			// 석차 산출 메소드 호출~!!!(구문 추가)
			ranking();
			
			
			//이름 출력
			System.out.printf("%5s", rec[i].name);
		


			// 성적(국어, 영어, 수학) 반복 출력
			for (int j=0; j<3; j++)							// 쑝~0!!!
				System.out.printf("%4d", rec[i].score[j]);

			// 총점, 평균 출력
			System.out.printf("%5d", rec[i].tot);
			System.out.printf("%8.2f", rec[i].avg);

			//check~!!!!
			// 석차 출력구문 추가~!!!
			System.out.printf("%5d", rec[i].rank);

			// 개행
			System.out.println();
		
		}//end outter for문
		
	}//end print

	//4. 석차 산출 메소드 추가~!!!
	//   - Record 배열의 rank 속성 초기화 기능 -> 반환 자료형 void
	//   - 클래스 내부에서 활용할 메소드로 정의 -> 접근제어 지시자 private
	private void ranking()
	{
		int i,j;          //--루프 변수
		// 모든 학생들의 등수(석차, rank)를 1로 초기화
		for (i=0; i<inwon; i++)
		{
			rec[i].rank = 1;       //처음에는 전부 1로 세팅하고 비교해서 작으면 1더하기 해줄 것임
		}

		// 등수 산출....ex) 4명
		for (i=0; i<inwon-1; i++)      //-- 비교 기준   0   1   2(인원 -1(마지막사람까지 비교안해도되니까!)) 
		{
			for (j=i+1; j<inwon; j++)  //-- 비교 대상  123  23  3
			{
				if (rec[i].avg > rec[j].avg)      //-- 비교 기준의 평균이 비교대상의 평균보다 크다면.....
				{
					//-- 비교대상의 rank를 1만큼 증가
					rec[j].rank++;
				}
				else if (rec[j].avg > rec[i].avg)  //-- 비교대상의 평균이 비교기준의 평균보다 크다면...
				{
					//-- 비교기준의 rank를 1만큼 증가
					rec[i].rank++;
				}
			}
		}

	}//end ranking

	
}//end class Sungjuk
3. Test097 클래스
	-main() 메소드가 존재하는 외부 클래스로 설계할 것~!!!

실행 예)
인원 수 입력(1~100) : 102
인원 수 입력(1~100) : -10
인원 수 입력(1~100) : 3

1번째 학생의 이름 입력 : 정효진
국어 점수 : 90
영어 점수 : 80
수학 점수 : 70

2번째 학생의 이름 입력 : 가나다
국어 점수 : 82
영어 점수 : 72
수학 점수 : 62

3번째 학생의 이름 입력 : 라마바
국어 점수 : 98
영어 점수 : 88
수학 점수 : 78

정효진 90 80 70 240 xx.xx   2
가나다 82 72 62 xxx xx.xx   3
라마바 98 88 78 xxx xx.xx   1

계속하려면 .....

*/

public class Test097
{
	public static void main(String[] args)
	{
		Sungjuk ob = new Sungjuk();
		ob.set();
		//ob.intput();
		ob.input();
		ob.print();
	}
}
/*
인원 수 입력(1~100) : 3
1번째 학생의 이름 입력 : 김연경
국어 점수 : 90
영어 점수 : 97
수학 점수 : 84
2번째 학생의 이름 입력 : 황선우
국어 점수 : 95
영어 점수 : 62
수학 점수 : 84
3번째 학생의 이름 입력 : 안산
국어 점수 : 100
영어 점수 : 97
수학 점수 : 88

  김연경  90  97  84  271   90.33    2
  황선우  95  62  84  241   80.33    3
   안산 100  97  88  285   95.00    1
계속하려면 아무 키나 누르십시오 . . .
*/

▪ 가위, 바위, 보 게임 코드

/*
1 ~ 3 사이의 난수를 발생시켜서
가위, 바위, 보 게임 프로그램을 구현한다.
단, 클래스의 개념을 활용하여 처리할 수 있도록 한다.
또한, 배열을 활용하여 처리할 수 있도록 한다.
최종적으로 RpsGame 클래스를 완성할 수 있도록 한다.

※ 기준 데이터 -> 1:가위, 2:바위, 3:보
가위 바위 보를 배열에 넣으면 됨 

실행 예)
1:가위  2:바위  3:보  중 입력(1~3) : 4
1:가위  2:바위  3:보  중 입력(1~3) : -2
1:가위  2:바위  3:보  중 입력(1~3) : 2

-유저   : 바위
-컴퓨터 : 보

>> 승부 최종 결과 : 컴퓨터가 이겼습니다~!!!
계속하려면...
*/
import java.util.Scanner;
import java.util.Random;
class RpsGame
{
	private int user;
	private int com;

	private void runCome()
	{
		Random rd = new Random();
		com = rd.nextInt(3)+1;
	}

	public void input()
	{
		runCome();

		Scanner sc = new Scanner(System.in);

		do
		{
			System.out.print("1:가위  2:바위  3:보  중 입력(1~3) : ");
			user = sc.nextInt();
		}
		while (user<1 || user>3);
	}

	public void middleCalc()
	{
		String[] str = {"가위", "바위", "보"};  //--check~!!!

		System.out.println();
		System.out.println("- 유  저  : " + str[user-1]);
		System.out.println("- 컴퓨터  : " + str[com-1]);
		System.out.println();

	}

	public String resultCalc()
	{
		String result = "무승부입니다.";
		
		if (user==1 && com==3 || user==2 && com==1 || user==3 && com==2)
			result = "당신이 이겼습니다~!!!";
		else if(user==1 && com==2 || user==2 && com==3 ||user==3 && com==1)
			result = "컴퓨터가 이겼습니다~ㅠㅠ";

		return result;
	}

	public void print(String str)
	{
		System.out.println(">> 승부 최종 결과 : " + str);
	}
}
		


public class hyodii098
{
	public static void main(String[] args)
	{
		RpsGame ob = new RpsGame();

		ob.input();
		ob.middleCalc();
		String result = ob.resultCalc();
		ob.print(result);
	}

}

▪ 가위, 바위, 보 게임 코드 설명📝

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

class RpsGame
{
	private int user;
	private int com;

	private void runCome()  // 컴퓨터의 가위바위보
	{
		Random rd = new Random();
		com = rd.nextInt(3)+1;  //-- 0 1 2  -> 1 2 3
	}
	
	public void input()    // 사용자의 가위바위보 
	{
		runCome();

		Scanner sc = new Scanner(System.in);

		do
		{
			System.out.print("1:가위  2:바위  3:보  중 입력(1~3) : ");
			user = sc.nextInt();
		}
		while (user<1 || user>3);
		
	}//end input()

	//중간결과 출력해주는 메소드
	public void middleCalc()
	{
		String[] str = {"가위", "바위", "보"};
		
		System.out.println();
		//System.out.println("- 유저   : " + user);  //이러면 숫자가 출력됨
		System.out.println("- 유저   : " + str[user-1]);  //str[1] str[2] str[3]     ----check~!!!
		System.out.println("- 컴퓨터 : " + str[com-1]);   //인덱스값이 0인데 가위바위보는 1 2 3으로 되어있으니까 -1 해줘야함!!
		System.out.println();
	}

	//승부에 대한 결과 연산
	public String resultCalc()
	{
		String result = "무승부입니다.";

		if (user==1 && com==3 || user==2 && com==1 || user==3 && com==2)    // 사용자가 승리한 상황
			result = "당신이 이겼습니다~!!!";
		else if(user==1 && com==2 || user==2 && com==3 ||user==3 && com==1)      // 컴퓨터가 승리한 상황
			result = "컴퓨터가 이겼습니다~ㅠㅠ";

		return result;

	}//end resultCalc()

	//최종 결과 출력
	public void print(String str)
	{
		System.out.println(">> 승부 최종 결과 : " + str);
	}

		

	/*----------------------------------------------------------------------
	//[내가 푼 코드]
	String[] rps = {"가위","바위","보"};

	public void set()
	{
		Scanner sc = new Scanner(System.in);
		
		
		Random rd = new Random();
		com = rd.nextInt(3)+1;

		do
		{
			System.out.print("1:가위  2:바위  3:보  중 입력(1~3) : ");
			user = sc.nextInt();
		}
		while (user<1 || user>3);

	}

	public void input()
	{
		System.out.println();
		System.out.println("-유저   : " + rps[user-1]);  //인덱스값이 0인데 가위바위보는 1 2 3으로 되어있으니까
		System.out.println("-컴퓨터 : " + rps[com-1]);
		System.out.println();
	}

	public void print()
	{
		String result;
		result = "무승부";
		
		if (user==1 && com==3 || user==2 && com==1 || user==3 && com==2)
			result = "유저가 이겼습니다~!!!";
		if(user==1 && com==2 || user==2 && com==3 ||user==3 && com==1)
			result = "컴퓨터가 이겼습니다~!!!";

		System.out.println(">> 승부 최종 결과 : " + result);
	}
	-------------------------------------------------------------------*/


	

}

//main() 메소드를 포함하고 있는 외부의 다른 클래스
public class Test098
{
	public static void main(String[] args)
	{
		/*----------------------------------------------------------------------
		RpsGame ob = new RpsGame();
		ob.set();
		ob.input();
		ob.print();
		-------------------------------------------------------------------*/
		RpsGame ob = new RpsGame();

		ob.input();
		ob.middleCalc();
		String result = ob.resultCalc();
		ob.print(result); 

	}
}
/*
1:가위  2:바위  3:보  중 입력(1~3) : 1


- 유저   : 가위
- 컴퓨터 : 보

>> 승부 최종 결과 : 당신이 이겼습니다~!!!
계속하려면 아무 키나 누르십시오 . . .




1:가위  2:바위  3:보  중 입력(1~3) : 2


- 유저   : 바위
- 컴퓨터 : 보

>> 승부 최종 결과 : 컴퓨터가 이겼습니다~ㅠㅠ
계속하려면 아무 키나 누르십시오 . . .




1:가위  2:바위  3:보  중 입력(1~3) : 3


- 유저   : 보
- 컴퓨터 : 보

>> 승부 최종 결과 : 무승부입니다.
계속하려면 아무 키나 누르십시오 . . .
*/

profile
개발새발

0개의 댓글