JAVA

[JAVA] Object class, 객체지향기법의 활용

멍정 2023. 9. 18. 15:19

멍하

갑자기 크롬이 죽어버려서 처음부터 시작하는 자바 7일차..

오늘은 자바를 끝내보아요!

22강 Object 클래스

https://youtu.be/PX0s8kuDA_A?si=bzxi_QgFnp4GzLta

객체 (Object) 클래스 : 모든 객체의 조상, 모든 클래스는 object class를 상속받고 있음

// object class에는 number, boolean, character 들이 들어있기 때문에 extends를 해주지 않아도 이미 상속받고 있음

 

Archer 형 인스턴스를 2개 생성하여 두 인스턴스가 동일한지 비교한다.

두 인스턴스는 다른 값이 때문에 archer1 == archer2로 비교하면 false가 출력된다.

//main.java
public class Main {

	public static void main(String[] args) {

		Archer archer1 = new Archer("궁수1", "상");
		Archer archer2 = new Archer("궁수1", "상");
		
		System.out.println(archer1 == archer2); //두 인스턴스는 다른 인스턴스이기 때문에
		System.out.println(archer1.equals(archer2)); //내부적으로 갖고있는 값
		
	}

}

두 archer 인스턴스의 값을 비교하기 위해 Archer class에 equals 메소드를 생성하여 두 객체의 값을 비교하면 true 값을 반환받는 것을 알 수 있다.

//Archer.java
public class Archer {

	String name;
	String power;
	
	public Archer(String name, String power) {
		this.name = name;
		this.power = power;
	}
	
	public boolean equals(Object obj) {
		
		Archer temp = (Archer) obj; //obj를 archer형으로 변환
		if(name == temp.name && power == temp.power)
		{ //obj의name이랑 this.name가 동일한지 비교
			return true;
		}
		else 
		{
			return false;
		}
		
	}
}

그런데 모든 class가 object class를 상속하고 있는거랑 equals 메소드를 사용하여 두 인스턴스의 값을 비교하는게 무슨 관계가 있나요?


23강 객체지향기법의 활용

https://youtu.be/WwgQvyrDaII?si=Jl0uLPo5VG2mk7qi

간단한 게임의 흐름을 살펴보자

용사 타입을 Hero class로 선언하여 이름, 기본 스킬 메소드를 생성해준다.

//Hero.java
public class Hero {
	String name;
	
	public Hero(String name) {

		this.name = name;
	}
	
	public void attack() {
		System.out.println("주먹지르기");
	}
}

전사, 궁수, 마법사 클래스를 생성하여 Hero 클래스를 상속받은 후 각자 고유 스킬을 추가해준다.

//Warrior.java
public class Warrior extends Hero{

	public Warrior(String name) {
		super(name); //부모클래스의 생성자, 부모클래스가 갖고 있는 값을 초기화해줌?
		// TODO Auto-generated constructor stub
	}
	public void groundCutting() {
		System.out.println("대지가르기!");
	}
		
}
//Archer.java
public class Archer extends Hero{

	public Archer(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	public void fireArrow() {
		System.out.println("불화살!");
	}
}
//Wizard.java
public class Wizard extends Hero{

	public Wizard(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}
	public void freezing() {
		System.out.println("얼리기!");
	}
}

Main에서 각각 출력해준다.

//Main.java
public class Main {

	public static void main(String[] args) {
		
		Hero[] hero = new Hero[3];
		hero[0] = new Warrior("전사");
		hero[1] = new Archer("궁수");
		hero[2]	= new Wizard("마법사");
		
		for(int i = 0; i < hero.length; i++)
		{
			hero[i].attack();
			if(hero[i] instanceof Warrior) { //지금 접근하는 인스턴스가 warrior라면
				Warrior temp = (Warrior)hero[i];
				temp.groundCutting();
			}
			else if (hero[i] instanceof Archer) {
				Archer temp = (Archer)hero[i];
				temp.fireArrow();
			}
			else if (hero[i] instanceof Wizard) {
				Wizard temp = (Wizard)hero[i];
				temp.freezing();
			}
		}
	}
}

+ instanceof : 객체 타입을 확인하는 연산자

hero[i]가 Warrior 형이라면 true를 아니라면 false를 반환한다.

hero[i] instanceof Warrior


대략적인 자바 문법은 이걸로 얼추 마무리를 한 것 같은데 주석처리나 더 확장된 내용은 코드 읽으면서 배울 수 있겠죠

누구한테 알려주기 위해 자세히 설명을 적은게 아니라 강의 그대로 옮겨적어서 누구에게 도움이 될 것 같지는 않지만 아무튼 얼렁뚱땅 자바 기초 끝!