Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[자바의정석] Chap 7. 객체지향 프로그래밍3 본문

Java

[자바의정석] Chap 7. 객체지향 프로그래밍3

JH_Lucid 2020. 12. 28. 15:34

5.3) instanceof 연산자

해당 연산자를 이용하여 a instanceof b의 결과를 보면,

a가 b를 상속한다면 true, 아니면 false를 반환한다. 이를 이용하여 해당 인스턴스가 어떤 클래스를 상속하는지 여부를 확인하고, 형변환이 가능한지 확인할 수 있다.

package test_java;

public class InstanceofTest {

	public static void main(String[] args) {
		FireEngine1 fe = new FireEngine1();
		Car1 car = new Car1();
		
		if(car instanceof FireEngine1) {
			System.out.println("this is a fireEngine instance and I want this sentence not printing");
		}
		
		if(car instanceof Car1) {
			System.out.println("this is a fireEngine instance and I want this sentence not printing");
		}
		
		if(fe instanceof FireEngine1) {
			System.out.println("this is a fireEngine instance");
		}
		if(fe instanceof Car1) {
			System.out.println("this is a car instance");
		}
		if(fe instanceof Object) {
			System.out.println("this is an object");
		}
		System.out.println(fe.getClass().getName());
	}

}
class Car1 {}
class FireEngine1 extends Car1 {}

첫번째 실행문은 car이 FireEngine을 상속하는게 아니므로 출력이 되지 않는다. 출력 부분(if문 내)에 형변환 연산자를 넣는 방식으로 형변환을 활용할 수 있을 것으로 판단된다.

 

 

5.4) 참조변수와 인스턴스의 연결

메서드는 참조변수의 타입에 관계없이 인스턴스의 메서드(오버라이딩된 메서드)가 호출되지만, 멤버변수의 경우 참조변수(클래스 타입)에 따라 달라진다.

 

public class BindingTest {

	public static void main(String[] args) {
		Parent p = new Child();
		Child c = new Child();
		
		System.out.println("p.x = " +p.x);
		p.method();
		
		System.out.println("c.x = " +c.x);
		c.method();
	}

}
class Parent {
	int x = 100;
	
	void method() {
		System.out.println("parent method");
	}
}
class Child extends Parent {
	int x = 200;
	
	void method() {
		System.out.println("child method");
	}
}

p, c 둘 다 메서드는 child의 메서드가 오버라이딩 되어 호출된다.

하지만 안의 멤버변수의 경우 참조변수의 타입에 따라 달라진다. p는 자신의 클래스의 값인 100, c는 자신의 클래스의 값인 200이 출력

 

물론 자녀 클래스에 부모와 겹치지 않는 멤버변수의 호출은 당연히 부모의 멤버변수가 호출이 된다.

 

+ 자녀 클래스 내부에서, 부모 클래스의 멤버 변수를 구분하는데에는 super(부모꺼), this(자신꺼)가 사용된다.

 

5.6) 객체 배열 사용 및 Vector 클래스 사용

아래 코드는 Buyer 내부의 Vector 배열을 이용하여 물건을 저장하고 관리하는 부분을 추가했다.

Vector 클래스는 내부적으로 Object 타입의 배열을 가지고 있어서, 이 배열에 객체를 추가하거나 제거할 수 있다. 또한 배열 크기를 알아서 관리해주기 때문에 인스턴스 개수에 신경 쓰지 않아도 된다.

 

+추가로 아래 두 문장은 동일한 역할을 하지만, 두 번째 처럼 사용하면 제네릭 뭐시기가 뜬다.

벡터로 쓸 데이터 타입을 제네릭으로 정의해줘라 이런말 같다.

 

// Vector<Product> item = new Vector<Product>(); // 구입한 제품을 저장하기 위한 배열
Vector item = new Vector(); // 구입한 제품을 저장하기 위한 배열

package test_java;
import java.util.*;

class Product {
	int price;
	int bonusPoint;
	
	Product(int price) {
		this.price = price;
		bonusPoint = (int)(price/10.0);
	}
	//얘는 왜 추가하는지 아직 모르겠다.
	Product() {} // 기본 생성
}

class Tv extends Product {
	Tv() {
		super(200);
	}
	public String toString() { return "Tv"; }
}

class Computer extends Product {
	Computer() {
		super(300);
	}
	public String toString() { return "Computer"; }
}

class Buyer {
	int money = 1000;
	int bonusPoint;
//	Vector<Product> item = new Vector<Product>(); // 구입한 제품을 저장하기 위한 배열
	Vector item = new Vector(); // 구입한 제품을 저장하기 위한 배열
	
	int i = 0; // product 배열 item에 사용될 인덱
	
	void buy(Product p) {
		if(money < p.price) {
			System.out.println("돈없쪙");
			return;
		}
		money -= p.price;
		bonusPoint += p.bonusPoint;
		item.add(p);
		System.out.println(p +"를 구매하였습니다.");
	}
	void refund(Product p) {
		if(item.remove(p)) { //제품을 vector에서 제거
			money += p.price;
			bonusPoint -= p.bonusPoint;
			System.out.println(p +"를 반품하셨습니다.");
		} else {
			System.out.println("구입 물품 중 해당 제품은 없습니다.");
		}
	}
	void summary() { // 구매한 물품에 대한 정보를 요약해서 보여주기 위함
		int sum = 0; // 구입한 물품의 가격 합
		String itemList =""; // 구입한 물품 목록 
		
		if(item.isEmpty()) { // vector가 비어있는지 확인, 비어있으면 true, 아니면 false
			System.out.println("구입한 제품이 없습니다.");
			return;
		}
		
		//반복문을 통해 구입한 물품의 총 가격과 목록을 만든다.
		for(int i = 0; i<item.size(); i++) {
			Product p = (Product)item.get(i); // vector의 i번째 객체를 얻어온다.
			sum += p.price;
			itemList += (i == 0) ? p : ", " + p;
		}
		System.out.println("all price : " + sum);
		System.out.println("item list : " + itemList);
	}
}
public class PolyArgumentTest3 {

	public static void main(String[] args) {
		Buyer b = new Buyer();
		Tv tv = new Tv();
		Computer com = new Computer();
		
		b.buy(tv);
		b.buy(com);
		b.summary();
		System.out.println();
		b.refund(com);
		b.summary();
	}
}

 

Comments