본문 바로가기
코리아 IT아카데미/Java

7일차 | Marine·Zealot·Zergling설계, 랜덤·캘린더 유틸 사용, 싱글톤 패턴 만들기

by Sharon kim 2021. 10. 26.
복습 순서
메모
ch09>
Employee
EmployeeMainTest
MainTest2





ch10>
Marine
Zealot
Zergling
MainTest1
GateWay
GateWayMainTest
Hatchery
HatcheryMainTest
ch11>
Company
MainTest1






 

사번 생성하는 클래스 설계

package ch09;

public class Employee {

		public static int serialNum = 1000;
		
		private int employeeId;
		private String employeeName;
		private String department;
		
		public Employee() {
			
			serialNum++;
			employeeId = serialNum;
		}
		
		public int getEmployeeId() {
			return employeeId;
		}
		//static메서드 활용
		public static int getSerialNum() {
			//주의 : static 메서드 안에서는 멤버 변수를 사용할 수 없다
			//why : 객체가 만들어지기 전 (new)에 접근해서 사용할 수 있는
			//static이기 때문
			//객체가 생성되기 전에 실행 될 수 있는 메서드
//			department = "개발팀";
			return serialNum;
		}
		
}//end of class

사번 부여

package ch09;

public class EmployeeMainTest {

	public static void main(String[] args) {
		//2.
		int temp = Employee.getSerialNum();//static 메서드
		System.out.println(temp);//1000
//		Employee test1 = new Employee();
//		test1.getEmployeeId; // <---일반 메서드
		//1.
		//serialNum -> static 변수
		Employee employee1 = new Employee();
		System.out.println(employee1.serialNum);//1001
		
		System.out.println(employee1.getEmployeeId());//1001
		
		Employee employee2 = new Employee();//1002
		Employee employee3 = new Employee();//1003
		Employee employee4 = new Employee();//1004
		Employee employee5 = new Employee();//1005
		System.out.println("-----------------------");
		System.out.println(employee5.getEmployeeId());
		
		System.out.println(employee5.serialNum);
		System.out.println(employee1.serialNum);
		System.out.println(employee2.serialNum);
		System.out.println(employee3.serialNum);
		//멤버변수와 스테틱 변수는 다르다
		System.out.println("-----------------------");
		//static변수, 멤버변수, 지역변수 -> 메모리 위치 확인
		
		//Q1
		//employee1~5 : 인스턴스 변수로 접근해서 getSerialNum()
		//실행 
		
		System.out.println(employee1.getSerialNum());
		System.out.println(employee2.getSerialNum());
		System.out.println(employee3.getSerialNum());
		System.out.println(employee4.getSerialNum());
		System.out.println(employee5.getSerialNum());
		
		//Q2 
		//클래스 이름으로 접근해서 getSerialNum() 메서드 사용
		System.out.println("-------------------------");
		System.out.println(Employee.getSerialNum());
		System.out.println(Employee.getSerialNum());
		System.out.println(Employee.getSerialNum());
		System.out.println(Employee.getSerialNum());
		System.out.println(Employee.getSerialNum());
		System.out.println(Employee.getSerialNum());
	}//end of main

}//end of class

 


랜덤 클래스 사용

java.util 패키지(Package)는 Java 프로그래밍에 유용한 클래스들을 모아둔 것

package ch09;

import java.util.Random;

public class MainTest2 {

	public static void main(String[] args) {

		//JDK 만들어준 도구
		Random r = new Random();
		int value = r.nextInt(20);//정수값을 랜덤으로 만들어줌
		System.out.println("value : " + value);
		
		//Source > generate getters and setters 자동완성
		
	}
}

Marine, Zealot, Zergling 클래스 설계

package ch10;

public class Marine {

	private int power;
	private int hp;
	private String name;

	public Marine(String name) {
		this.name = name;
		this.power = 5;
		this.hp = 100;
	}
	
	public void showInfo() {
		System.out.println("=====정보창=====");
		System.out.println("이름 : " + this.name);
		System.out.println("공격력 : " + this.power);
		System.out.println("체력 : " + this.hp);
		System.out.println("===============");
	}
	
	// 공격당합니다.
	public void beAttacked(int power) {
		this.hp -= power;
		if(this.hp <= 0) {
			System.out.println(this.name + "은  사망했습니다.");
			this.hp = 0;
		}
	}
	
//attackZealot
//	// 1.마린이 질럿을 공격
//
//	public void attackZealot(Zealot zealot) {
//		String targetName = zealot.getName();
//		System.out.println(this.name + "이 " + targetName +"을 공격");
//		zealot.beAttacked(this.power);
//	}
//attackZergling
//	// 2. 마린이 저글링을 공격
//	public void attackZergling(Zergling zergling) {
//		String targetName = zergling.getName();
//		System.out.println(this.name + "이 " + targetName +"을 공격");
//		zergling.beattacked(this.power);
//	}
	//getName
	public String getName() {
		return name;
	}
	
	//메서드 오버로딩을 사용해 보자
	public void attack(Zealot zealot){
		String targetName = zealot.getName();
		System.out.println(this.name + "이 " + targetName +"을 공격");
		zealot.beAttacked(this.power);
	}
	
	public void attack(Zergling zergling) {
		String targetName = zergling.getName();
		System.out.println(this.name + "이 " + targetName +"을 공격");
		zergling.beattacked(this.power);
	}
	
}// end of class

클래스 사용 : 서로 공격하고 공격 받은 정보창 출력

package ch10;

public class MainTest1 {
	// main function start of code
	public static void main(String[] args) {

		Zealot zealot1 = new Zealot("질럿1");
		Zealot zealot2 = new Zealot("질럿2");
		Marine marine1 = new Marine("마린1");
		Marine marine2 = new Marine("마린2");
		Zergling zergling1 = new Zergling("저글링1");
		Zergling zergling2 = new Zergling("저글링2");

//		zealot1.showInfo();
//		marine1.showInfo();
//		zergling1.showInfo();

		zealot1.attack(marine1);
		zealot2.attack(marine2);
		zealot1.attack(marine1);
		zealot2.attack(marine2);

		marine1.showInfo();

		zealot1.attack(zergling1);
		zealot2.attack(zergling2);
		zealot1.attack(zergling1);
		zealot2.attack(zergling2);
		zealot1.attack(zergling1);

		zergling1.showInfo();

		marine1.attack(zergling1);
		marine2.attack(zergling2);
		marine1.attack(zergling1);
		marine2.attack(zergling2);

		zergling1.showInfo();

		marine2.attack(zealot2);
		marine1.attack(zealot1);
		marine2.attack(zealot2);
		marine1.attack(zealot1);

		zealot1.showInfo();

		zergling2.attack(marine2);
		zergling1.attack(marine1);
		zergling2.attack(marine2);
		zergling1.attack(marine1);
		zergling2.attack(marine2);

		zergling1.showInfo();

		zergling1.attack(zealot1);
		zergling2.attack(zealot2);
		zergling1.attack(zealot1);

		zealot1.showInfo();
		
		//문제 저글링 , 질럿, 마린 체력이 
		//0 또는 이하라면 사망했습니다.
			
		zealot2.attack(zergling2);
		zergling2.showInfo();
		
		//
//		System.out.println("----------------------");
//		System.out.println("가나다");
//		System.out.println(1);
//		System.out.println(0.5);
//		System.out.println('A');

	}// end of main

}// end of class

질럿 생산 하는 클래스 설계

package ch10;

public class GateWay {
	
	public static int zealotCount = 0;
	private int gateWayId;
	private String name;
	
	public GateWay(int id) {
		this.gateWayId = id;
		name = "게이트웨이";
	}
	
	//질럿생성하기
	public Zealot createZealot() {
		System.out.println("질럿을 생산합니다.");
		zealotCount++;
		return new Zealot("질럿");
	}
	
}//end of class

생산된 질럿 확인 

package ch10;

public class GateWayMainTest {
	// start of code
	public static void main(String[] args) {
		
		GateWay gateWay1 = new GateWay(1);
		GateWay gateWay2 = new GateWay(1);
		GateWay gateWay3 = new GateWay(1);

		Zealot zealot1 = gateWay1.createZealot();
		Zealot zealot2 = gateWay1.createZealot();
		Zealot zealot3 = gateWay1.createZealot();
		Zealot zealot4 = gateWay1.createZealot();
		Zealot zealot5 = gateWay1.createZealot();
		Zealot zealot6 = gateWay1.createZealot();
		Zealot zealot7 = gateWay1.createZealot();
		Zealot zealot8 = gateWay1.createZealot();
		Zealot zealot9 = gateWay1.createZealot();
	
		gateWay2.createZealot();
		gateWay2.createZealot();
		gateWay2.createZealot();
		gateWay2.createZealot();
		
		gateWay3.createZealot();
		gateWay3.createZealot();
		gateWay3.createZealot();
		gateWay3.createZealot();
		
		zealot1.showInfo();

		// static 변수는 인스턴스들이 공유할 수 있는 변수이다.
		//--> 객체를 생성하지 않고도 클래스 이름을 접근이 가능하다.
		//ex) -> 태양 (객체가 생성되기 전에 메모리에 올라가 있다.)
		
		System.out.println("현재 생성된 질럿 수 : " + GateWay.zealotCount);
	}
}

저글링 생산하는 클래스 설계

package ch10;

public class Hatchery {
	
	//static
	public static int zerglingCount = 1 ;//초기값
	//멤버변수 설계
	private String name;
	//생성자 설계
	public Hatchery(String name) {
		this.name = name;
	}	
	//저글링을 생산하는 메서드 만들어 주세요
	public Zergling createZergling() {
		System.out.println("저글링을 생산합니다.");
		zerglingCount++;
		return new Zergling("저글링" + zerglingCount);
	}
}

생산된 저글링 확인 

package ch10;

public class HatcheryMainTest {

	public static void main(String[] args) {
		
		
		System.out.println(Hatchery.zerglingCount);
		Hatchery hatchery = new Hatchery("해처리1");
		hatchery.createZergling();
		hatchery.createZergling();
		hatchery.createZergling();
		hatchery.createZergling();
		hatchery.createZergling();
		
		
		System.out.println("현재 생성된 저글링 수 : " 
        					+ Hatchery.zerglingCount);
	}

}

싱글톤 패턴 만들기

package ch11;
//싱글톤 패턴 만들기
public class Company {
	
	//1.생성자 private 로 만든다.
	private Company() {
		
	}

	//2. static 변수를 활용해서 내부에서 객체를 생성한다.
	private static Company instance = new Company();//변수선언과 동시에 초기화
	
	//3. 외부에서 유일한 인스턴스를 참조할 수 있는 public 메서드를 제공해야 한다.
	public static Company getInstance() {
		//방어적 코드
		return instance;
	}
}

클래스 사용 , 캘린더 유틸 패키지 사용

package ch11;

import java.util.Calendar;

public class MainTest1 {
	// main function
	public static void main(String[] args) {
		// company 객체 생성 5개
							//생성자가  private라서
		Company company1 = Company.getInstance();
		Company company2 = Company.getInstance();
		Company company3 = Company.getInstance();
		Company company4 = Company.getInstance();
		Company company5 = Company.getInstance();
		//화면에 주소값을 출력해보세요
		System.out.println(company1);
		System.out.println(company2);
		System.out.println(company3);
		System.out.println(company4);
		System.out.println(company5);
		
		Calendar c = Calendar.getInstance();
		System.out.println(c);
	}

}

수업내용

[출처] https://blog.naver.com/devnote1 작성자 devnote1