7일차 2023-03-16 Java

2023. 3. 16. 18:28java

1.method

1-1) 가위바위보 method consol

전에 한 가위바위보를 메소드로 활용한 프로그램

main메소드 

		public static void main(String[] args) {
			Scanner sc= new Scanner(System.in);
			//1]메뉴 출력
			showMenu();
			//만약 반복한다면
			while(true) {
					
				//2]컴퓨터는 숫자를 랜덤하게 발생시킨다.
				int computer= getComputerNumber(1,3);//
				
				//3]사용자 숫자 입력 받기
				int user = getUserNumber();
				//4]메뉴번호 체크
				char checks= checkMenu(user);
				if(checks==QUIT) break;
				else if(checks==CONTINUE) continue;
                
				//5]게임 승리여부 판단
				showResult(computer,user);
				
			}

기능에 따른 메소드

		//사용자 입력값 설정용
		public static final int SCISSORS=1;
		public static final int ROCK=2;
		public static final int PAPER=3;
		public static final int EXIT=9;
		public static final int REPLAY=4;
		
		//메뉴 채크에 따른 반환값용
		public static final char QUIT='Q';//EXIT상수 대응
		public static final char CONTINUE='C';//REPLAY상수 대응
		public static final char NOMAL='N';//메뉴번호 1,2,3 대응
		
		//1]메뉴 출력용 메소드
		static void  showMenu(){
			System.out.println("=============[매뉴 번호]=============");
			System.out.println("     1.가위 2.바위 3.보 4.메뉴다시보기 9.종료");
			System.out.println("===================================");	
		}
		//2]숫자를 랜덤하게 발생시키는 매소드-컴퓨터용
		private static int getComputerNumber(int start, int end) {
			return (int)(Math.random()*(end-start)+1)+start;
		}
		//3]사용자 숫자 입력받아서 반환하는 메소드
		private static int getUserNumber() {
			Scanner sc=new Scanner(System.in);
			System.out.println("메뉴 번호를 입력하세요?");
			return sc.nextInt();
		}
		
		//사용자 입력 숫자(1,2 혹은 3)에 따라 "가위"바위보 문자열ㅇ르 반환하는 메소드
		static String getSRPValue(int value) {
			//삼항 연산자버전
			//return value==SCISSORS?"가위":value==ROCK?"바위":"보";
			//switch문버전
			switch(value) {
			case SCISSORS:return "가위";
			case ROCK:return "바위";
			default:return "보";
			}
		}
		
		
		//4]가위바위보 승리 판단후 결과 출력용 메소드
		private static void showResult(int computer, int user) {
			System.out.printf("[당신:%s,컴퓨터:%s]%n",getSRPValue(user),getSRPValue(computer));
			if(user==SCISSORS && computer==PAPER || 
					user==ROCK	  && computer==SCISSORS ||
					user ==PAPER  && computer==ROCK) {
			System.out.println("당신이 이겼어요");
			}else if(user ==computer) System.out.println("비겼어요");
			else System.out.println("당신이 졌어요");//여기는 중간버전 코딩에서 5번,6번,다른번호를 눌렀을떄 여기로 보내지는 디폴트 값이다
		}
		//5]메뉴 번호 체크용 메소드
		private static char checkMenu(int menu) {//menu는 사용자가 입력한 번호
			
			if(menu==EXIT) return QUIT;
			else if(menu==REPLAY) {
				showMenu();
				return CONTINUE;
			}
			else if(!(menu==1 || menu==2 || menu==3)) {
				System.out.println("메뉴에 없는 번호입니다.");
				showMenu();
				return CONTINUE;
			}
			return NOMAL;
		}

2. Call By Value와 Call By Reference

//※메소드 호출과 관련 개념으로

//매개변수에 값을 전달(복사)하거나 (Call by value)

//매개변수에 메모리의 주소값을 전달(복사)하는 경우(Call by Reference)

/*

매개변수의 타입이 참조형(배열,String,클래스,인터페이스등) 인 경우:

call by reference(참조에 의한 호출)

값이 아니라 주소값이 매개변수에 전달됨.

같은 메모리를 참조한다

-!!!call by reference를 적용해서 매개변수에 여러 개의 값을 동시에 전달

할 수도 있고 또한 여러개의 값을 반환할 수 있다.

(반환타입이 void여도 반환되는 효과가 일어남)

*/

결국 내가 값에 의한 호출인가, 아니면 주소값으로 인한 호출인가의 차이로 생각한다.

다만, 우리가 메소스를 사용할 때, 반환값이 있는 (void)타입이 아닌  

(int, double, String...)이렇게 메소드를 만들면 return은 하나를 반환하였다.

근데 Call by Reference를 활용한 반환은 매개변수에 여러 개의 값(인자)으로서 반환했다.

그리고 주소로 값을 반환하다 보니 main메소드가 아닌 곳에서 변수의 값을 초기화시키면

주소변수의 값이 변경돼서 main에서도 변경이 된다.

	public class CallByValueNReference {

	//Call By Value 테스트용 메소드 정의]
	static void callByValue(int first,int second) {
		int temp=first;
		first=second;
		second=temp;
		System.out.printf("callByValue메소드 안]first:%d,second:%d%n",first,second);
	}
	//Call By Reference테스트를 위한 메소드 정의]
	static void CallByReference(int [] arr) {
		int temp =arr[0];
		arr[0]=arr[1];
		arr[1]=temp;
		System.out.printf("callReference메소드 안]arr[0]:%d,arr[1]:%d%n",arr[0],arr[1]);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//Call By Value 테스트]
		int first=1,second =10;
		System.out.printf("main메소드 안-callByValue호출 전]first:%d,second:%d%n",first,second);//이건 값을 불러오는것
		callByValue(first, second);
		System.out.printf("main메소드 안-callByValue호출 후]first:%d,second:%d%n",first,second);
		System.out.println();
		
		//Call By Reference테스트]
		int[] ref=new int[2];
		ref[0]=1;
		ref[1]=10;
		
		System.out.printf("main메소드 안-callByReference호출 전]ref[0]:%d,ref[1]:%d%n",ref[0],ref[1]);//이건 주소값을 불러오는것
		CallByReference(ref);
		System.out.printf("main메소드 안-callByReference호출 후]ref[0]:%d,ref[1]:%d%n",ref[0],ref[1]);
	}

sol)

문제) Call by Reference

국어, 영어, 수학, 총점, 평균 구하여라

	public class CallByRefExample {

	private static void setTotalAverage(double[][] scores) {
		for(int i=0;i<scores.length;i++) {
			//총점 구하기]
			for(int k=0; k<scores[i].length-2;k++) {//-2하는 이유 마지막이 3번째까지만
				scores[i][3]+=scores[i][k];
			}
			//평균 구하기
			scores[i][4]=scores[i][3]/3;
		}
	}
	private static void print(double[][] scores) {
		String [] titles= {"국어","영어","수학","총점","평균"};
		for(int i=0;i<scores.length;i++) {
			System.out.printf("[%d번쨰 학생 성적]%n",i+1);
			for(int k=0; k<scores[i].length;k++) {//다 출력
				System.out.printf("%s:%-4.0f",titles[k],scores[i][k]);
			}
			System.out.println();
		}
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		double [][] scores = {
				{100,100,100,0,0},
				{90,90,90,0,0},
				{95,95,95,0,0}
			};
		
		//총점 및 평균을 설정하는 메소드 호출
		//int 이런건 하나만 반환하는데 지금은 15개 를 넘겨야되서 CallByRefence해야됨
		setTotalAverage(scores);
		//출력
		print(scores);
	}
}

 

sol)

여러 개의 값을 넣고,(1개의 값만을 반환하지 않고) 여러 개의 값을 반환하기 위해서 Call by Refence를 활용

이차원 배열 scores를 매개변수 double [][] scores에 넣고 =>scores[i].length는 열의 길이(갯수)만큼 누적합을 구하고(scores[i][3]]에 scores[i][0]]+scores[i][1]]+scores[i][2]] i(누군가)국영수 점수 합을 scores[i][3]](총점 자리)에 더함.

 

3.CommandLine

/*

명령줄(Command Line) 인수:

main메서드의 매개변수인 param에 전달하는 값을

명령줄 인수라 한다

param는 Command Line에서 인수를 의미 즉

예] dos>java.exe CommandLine 100 가길동 에서 args는 100를

담은 매개변수임

[실행시] 인수 개수가 args 배열의 인덱스보다

많으면 상관없으나

부족하면 ArrayOutofBoundsException예외 발생

dos>java.exe CommandLine 홍길동 20 강남

*/

	public static void main(String[] param) {//명령줄 인수는 param(args)에 저장
		// TODO Auto-generated method stub
		System.out.println("[명령줄 인수]");
		System.out.println("이름:"+param[0]);
		System.out.println("나이:"+param[1]);
		System.out.println("사는곳:"+param[2]);
		/*
		 * 우클릭에 Run as->
		 * RunConfiguration->
		 * Arguments->에서 인자 각각 넣기
		 * 지금 param에 3개 만들었으니 인자 3개 넣은것 이름 나이 사는곳
		 * sol)[명령줄 인수]
			   이름:홍길동
			   나이:1
			   사는곳:서울

		 */
	}

4.Class

/*

* [클래스의 객체 생성]

* int num =10;

* 클래스명 인스턴스 변수 =new 클래스명();//클래스명()는 생성자

* [클래스의 멤버 접근]

* 인스턴스변수.멤버 .을 레퍼런스 연산자라 한다.

*/

실행할 PersonApp

public class PersonApp {

	public static void main(String[] args) {
		//1]Person타입의 인스턴스 변수 선언
		Person person1;
		//2]new연산자로 Person타입의 메모리를 heap영역에 생성(할당)
				//인스턴스변수 person1에는 heap영역에 생성된
				//Person타입의 메모리 주소가 저장됨.		
				/* new연산자의 의미]
				 * -Person클래스를 인스턴스화 한다
				 * -Person클래스를 객체화 한다
				 * -Person타입의 메모리를 heap영역에 생성한다
				 *  위 세가지는 모두 같은 의미
				 */
		person1=new Person();
		System.out.println(person1);
		person1.printPerson();
		//멤버 변수(필드) 초기화];
		person1.age=20;
		person1.name="홍길동";
		person1.weight=80;
		System.out.println("[멤버변수에 값 할당 후]");
		System.out.println(person1.getPerson());
		person1.sleep();
		person1.eat();
		Person person2=new Person();
		System.out.println(person2);
		System.out.println(person2.getPerson());
		//멤버 변수 초기화]
		person2.name="가길동";
		person2.weight=3.41;
		System.out.println("[멤버변수에 값 할당 후]");
		System.out.println(person2.getPerson());
		/*
		  자바에서는 new로 새롭게 할당한 메모리를
		  해제 할 필요가 없다.
		  GC(Garbage Collector)가 돌아 다니다가
		  더 이상 사용되지 않는 메모리(Unreachable Object:스택에서 참조가 끊긴 객체)는 해제 하니까.
		 */
		person2 = new Person();
		System.out.println(person2.getPerson());
	}

}

/*

[클래스 정의]

- 클래스명은 항상 대문자로 시작하자

- 클래스는 객체(Object)의 설계도

- 클래스는 여러 타입의 값을 저장할 수 있는 자료형이다(자료구조다)

즉 사용자 정의 자료형(데이타 타입)이다

- 인간 세계의 객체(사물,사건 ,개념,현상)에서 속성(성질,상태)과 행동을 뽑아내서<-모델링이라 함

속성은 변수나 상수로 행동은 메서드로 뽑아내

클래스를 정의하는것을 추상화라한다.

[클래스 정의 구문]

접근지정자 [modifier(지정자)] class 클래스명{

//클래스의 멤버들

멤버 상수

멤버 변수

멤버 메서드

클래스(내부 클래스)

인터페이스

}

속성[멤버변수 혹은 필드]

멤버변수는 해당 클래스와 has a 관계가 존재해야 한다.

멤버변수는 초기화를 하지 않으면 해당 자료형으로 초기화가 된다.

예] 참조형:null,int:0 ,double:0.0 ,boolean:false 등

멤버변수는 해당 클래스안의 모든 메소드에서 사용이 가능하다

멤버변수 선언]

접근지정자 [modifier] 자료형 멤버변수명;

※멤버변수는 모든 데이타 타입

(기본 데이타 타입/배열/클래스등)을 사용할 수 있다

단,지역변수 선언시에는 [modifier] 자료형 변수명;

*/

/*

* 사람을 추상화 해보자

* 즉 사람의 설계도를 만들어 보자

* 즉 사람의 행동과 속성 뽑아내서

* 행동은 메서드로 속성은 상수나 멤버변수로...

*/

public class Person {
	//1]사람이라는 객체가 갖고 있는 속성(성질이나 상태):멤버변수 혹은 필드(has a 관계)
	public String name;//이름 속성-public 접근지정자 사용
	int age=1;//나이속성-생략형(패키지) 접근지정자 사용.선언과 동시에 초기화
	double weight;//몸무게 속성-생략형 접근지정자 사용
	
	//[멤버 메소드 정의]
	//사람이라는 객체가 갖고 있는 행동(행위):멤버 메소드
	void sleep() {
		System.out.println(name+"가(이) 자다");
	}
	void eat() {
		System.out.printf("나이가 %d살인 %s가(이) 먹다%n그래서 몸무게가 %.2fKG이다%n",age,name,weight);
	}
	//프로그램 효율성을 위한 메소드들]
	String getPerson() {
		return "["+name+"의 정보]\r\n나이:"+age+"\r\n몸무게:"+weight;
	}
	void printPerson() {
		System.out.println(getPerson());
	}
}

객체란 1.내가 만든 설계도
             2.내가 만든 자료형

객체는 속성과 행동으로 뽑아낸다 (이걸  객체 모델링이라 부른다)
행동은 메소드로 만들고 속성은 변수로 만듬
설계도(클래스)에서=> 아파트(객체)에서 =>행동(메소드)과 속성(변수)

 

'java' 카테고리의 다른 글

9일차 2023-03-20 Java  (2) 2023.03.20
8일차 2023-03-17 Java  (0) 2023.03.17
6일차 2023-03-15 Java  (0) 2023.03.15
5일차 2023-03-14 Java  (2) 2023.03.14
4일차 2023-03-13 Java  (0) 2023.03.13