★국비지원 9일차(객체)★

1. 객체
이번 글에는 수업시간에 배운 객체에 대한 개념을 정리하고, 객체를 생성하여 클래스를 통해 객체를 호출하는 방법을 작성하려고 한다.

public class MyClass01 {
	
	//객체 생성
	//객체의 메소드 호출
	public String name;
	public int age;
	

public void introduce() {
		this.name = "메소드 안에서 만든 이름 ㅎㅋ";//this: 현재 객체 (public string name에 있는 name을 가르키는 거임)
		System.out.println("안녕 나는 MyClss01 타입이야");
		System.out.println("내 이름은 "+ name);
		System.out.println("내 나이는 "+ age);
	}
	
public void myMethod01() {
		System.out.println("MyClass01의 mymethod01 호출됨 ...");
		
	}
	
	
	
public void myMethod02() {
		System.out.println("MyClass의 myMethod02 호출됨 ...");
		
	}
}

위에서 작성한 this
this: 현재 객체 (public string name에 있는 name을 가르킴
지역변수 vs 필드(==인스턴스변수,전역변수,클래스변수,멤버변수)
-서로 같은 이름을 사용할 수 있다.
-메소드 안에서는 지역변수가 선택된다.
-this.변수명으로 써주면 필드가 선택된다.



import practice.MyClass01;

public class Run {
	public Run () {}

	public static void main(String[] args) {

		System.out.println("Run 클래스의 main 메소드 호출됨...");
		System.out.println("=========================");
		
		//객체 생성(MyClass01 클래스 파일을 이용해서 객체 생셩)
			MyClass01 mc01 = new MyClass01(); //클래스가 mc01이라는 참조변수의 타입이 될 수 있다. mc01은 main메소드 내부안에 있는 변수이므로 지역변수ok.
			
		//객체의 메소드 호출(MyClss01 클래스 파일의 myMethod01 호출)
			mc01.myMethod01(); //.은 해당 객체에 접근하기 위함이다. mc01이라는 참조변수를 통해 .객체를 생성하고 그 주소값이 mc01에 들어가서 mc01(리모콘)을 통해 객체 myMethod에 접근하겠다.
			mc01.myMethod02(); //한 객체를 통해 여러가지 메소드를 호출할 수 있다. (myMethod01, myMethod02```)
		
		
		//객체생성
		MyClass01 mc = new MyClass01();
		mc.age = 20;
		mc.name = "홍길동";
		mc.introduce();

		
	}

}

위와 같이 MyClass01클래스 파일의 main메소드를 실행할 Run클래스 파일을 만들어준 다음 각 메소드를 참조변수를 통해 9(.) 호출해주면

Run 클래스의 main 메소드 호출됨...

=========================
MyClass01의 mymethod01 호출됨 ...
MyClass의 myMethod02 호출됨 ...
안녕 나는 MyClss01 타입이야
내 이름은 메소드 안에서 만든 이름 ㅎㅋ
내 나이는 20

이런 결과가 나온다.




.
.
.
.

🚩 객체를 배우면서 알게된 점은


-지역변수는 stack에
-인스턴스변수(멤버변수)는 heap에
-클래스변수(static)은 static에
-클래스내부 -->멤버변수
-메소드내부 -->지역변수 (메소드 실행시 메모리에 생성되었다가 메모리 종료시에 사라진다.)


또, 객체와 인스턴스는 같은 개념이고, 객체는 heap메모리에 할당이 되는 것을 알 수 있다.



2. 객체를 이용한 서비스, 게임 만들기
일주일 전에 제어문을 이용하여 가위바위보 게임과, 업다운 게임을 만들었는데 객체를 이용하여서도 보다 더 복잡한 게임을 간결하게 만들 수 있었다.

(1) up&down 게임

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

public class GameManagerUpDown {
	
	public final String gameName = "업다운";
	
	public void gameStart() {
		System.out.println(gameName + " 게임시작 ~~~");
		
		// 컴퓨터가 랜덤 숫자 하나 생각하게 하고
		// 정수 하나 받고
		// 업다운 얘기해주고
		// 틀리면 다시하게 하고
		// 맞추면 정답입니다 
		
		//랜덤숫자
//		int a = (int) ((Math.random()*100) + 1);
		
		
		int a = new Random().nextInt(50);
//		Random randomObject = new Random();
//		int r = randomObject .nextInt(50);
		
		
		//입력
		Scanner sc = new Scanner(System.in);
		
		//업다운 판단
		while(true) {
			int input = sc.nextInt();
			if(input > a ) {
				System.out.println("다운");
			} else if( input < a) {
				System.out.println("업");
			} else if( input == a ) {
				System.out.println("정답입니다.");
			} else {
				System.out.println("다른 수를 입력해주세요");
			}

	}

	
	}
	
}
  • 제어문을 통해서 컴퓨터의 랜덤값을 받았을 때는 Math.random함수를 이용하여 double형 값을 직접 형변환을 통해 랜덤값을 받았는데,

  • 객체로 만들면,

    int a = new Random().nextInt(50);
    // Random randomObject = new Random();
    // int r = randomObject .nextInt(50);

  • 이와 같은 객체를 만들어 보다 다른 방법으로 쉽게 랜덤값을 받을 수 있다는 점이 새로웠다.



(2) 가위바위보 게임과 up&down 게임 mix 하기

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

public class GameManagerRcp {
	
	public final String gameName = "가위바위보";
			
	public void gameStart() {
		System.out.println(gameName + " 게임 시작 ~~~");
		
		//가위바위보 게임
		
		//컴퓨터 패 선택
		int comNum = new Random().nextInt(3) + 1;
		String com = "";
		
		switch(comNum) {
		case 1 : com  = "가위"; break;
		case 2 : com  = "바위"; break;
		case 3 : com = "보"; break;
		default : System.out.println("errer !!!");
		}
		
		
		
		//사용자 입력
		Scanner sc = new Scanner(System.in);
		String user = sc.nextLine();
		
		System.out.println("com: "+com);
		System.out.println("user: "+user);
		
		
		//판단
		//문자열끼리 비교하려면, 문자열.equals(문자열);
		if(com.equals("가위")) {
	         if(user.equals("가위")) {
	            System.out.println("비김");
	         }else if(user.equals("바위")) {
	            System.out.println("사용자 승");
	         }else {
	            System.out.println("컴퓨터 승");
	         }
	      }
	      else if(com.equals("바위")) {
	         if(user.equals("가위")) {
	            System.out.println("컴퓨터 승");
	         }else if(user.equals("바위")) {
	            System.out.println("비김");
	         }else {
	            System.out.println("사용자 승");
	         }
	      }
		
   }//main
}//class

위 결과를 Run 클래스를 통해 호출하면

public class RunRcp {

	public static void main(String[] args) {

		GameManagerRcp gm = new GameManagerRcp();
		gm.gameStart();
	}

}

게임이 잘 작동되는 것을 확인할 수 있다.

(3) 카페 서비스 이용하기

public class CounterEmployee {
	
	//카운터 직원
	
	
	/*/
	 * <객체지향>
	 * -닉네임
	 * -시급 :시급 9천원
	 * -주문 받는 기능
	 * -계산 기능
	 * 
	 */
	public String nick;
	public int money;
	
	
	public void order() {
		System.out.println("주문받기 ~~~");
		
	}
	public void calc() {
		System.out.println("계산하기 ~~~");
		
	}
	
}
public class KitchenEmployee {
	
	//주방직원
	
	/*/
	 * -닉네임
	 * -시급: 만원
	 * -음료 제조 기능
	 * -음료 건내는 기능
	 * 
	 * 
	 */
	public String nick;
	public int money;
	
	
	public void cook() {
		System.out.println("음료제조 ~~~");
	}
	public void complete() {
		System.out.println("음료완성 ~~~");
	}
	
	
	
}

Run 클래스를 통해 위 두개의 클래스를 호출해보면,

import cafe.employee.CounterEmployee;
import cafe.employee.KitchenEmployee;

public class Run {

	public static void main(String[] args) {
		
		//객체의 메소드 사용
		//객체의 데이터 (변수) 접근 가능

		
		System.out.println("cafe open ~~~");
		System.out.println("======================");
		
		CounterEmployee ce = new CounterEmployee();
		KitchenEmployee ke = new KitchenEmployee();
		
		ce.order();
		ce.calc();
		ke.cook();
		ke.complete();
		
		ce.nick = "홍길동";
		ke.nick = "베철수";
				
		System.out.println("카운터 직원 닉네임 : " + ce.nick);
		System.out.println("주방 직원 닉네임 : " + ke.nick);
		
		
		//기본형 자료형의 경우 기본값이 false ,0 ,0.0f 등등이 있지만 참조형 변수는 기본값이 null
        //(0은 휴지심만 남아있는 것, null 휴지심조차 없이 아무것도 없는 상태이다.)
	}

}
cafe open ~~~
======================
주문받기 ~~~
계산하기 ~~~
음료제조 ~~~
음료완성 ~~~
카운터 직원 닉네임 : 홍길동
주방 직원 닉네임 : 베철수

잘 호출이 되는 것을 알 수 있다.

좋은 웹페이지 즐겨찾기