정리/Java

자바의 정석 79~강 캡슐화, 다형성, 참조변수 형변환, instanceof 연산자,

민발자 2023. 8. 6. 00:47
728x90

ch 7-22 캡슐화

1. 캡슐화와 접근 제어자

접근 제어자를 사용하는 이유

- 외부로부터 데이터를 보호하기 위함, 외부에서 직접 접근하는 것을 막고 메서드를 이용 간접 접근을 허용시킴

- 외부에는 불필요한, 내부적으로 사용되는 부분을 감추기 위해서 사용


ch 7-23 다형성

1. 다형성★

조상 타입 참조 변수로 자손 타입 객체를 다루는 것

Tv t = new SmartTv();
// 타입이 불일치하지만 가능
// 조상 타입 참조변수인 t로 자손 타입 객체 SmartTv를 다룰수 있음
// 반대인 경우 불가능(자손 타입 참조변수로 조상 타입 객체를 다룰수 없음)

조상 타입 참조변수로 자손 객체를 다루면 조상 멤버만 사용가능 ex)Tv 5개 SmartTv 7개면 5개 사용가능

 


ch 7-24~25 참조변수의 형변환

1. 참조변수의 형변환

기본형의 형변환처럼 값이 변경되는 것이 아닌 사용할 수 있는 멤버의 갯수를 조절함

조상 자손 관계의 참조변수는 서로 형변환 가능

class Car { 4개 멤버 }
class FireEngine extends Car { 1개 멤버 }
class Ambulance extends Car { }

FireEngine f = new FireEngine(); // 5개

Car c = (Car)f; // 부모로 형변환 4개
FireEngine f2 = (FireEngine)c; // 자식으로 형변환 5개

Ambulance a = (Ambulance)f; // 에러 상속관계가 아닌 클래스는 형변환 불가

 

2. 형변환시 주의사항

Car c = new Car(); //4개의 멤버

FireEngine f = (FireEngine)c;

f.water(); 
// 형변환 실행 에러 java.lang.ClassCasrException
// 컴파일러는 타입이 일치하기때문에 에러 발생 안함

// 형변환을 했어도 객체 자체가 Car이기 때문에
// 실제로 어떤 객체인지가 중요

 

 

+) 어려워서 예시로 실행해봄

class Ex7_7 {
	public static void main(String args[]) {
		Car c1 = new Car();
		Car c2 = new FireEngine();
		c1.drive(); // 4개 
		c2.drive(); // 4개 리모컨(참조변수) 자체가 car이기 때문 
		
		FireEngine f1 = new FireEngine();
		f1.drive(); // 5개 리모컨(참조변수) 자체가 FireEngine이기 때문 
		f1.water(); // 가능
        
		// 부모 -> 자식 형변환
		// FireEngine f2 = (FireEngine)new Car(); // 형변환 실행 에러 
		//f2.drive(); 형변환 실행에러로 불가능
		
		// 자식 -> 부모 형변환
		Car c3 = (Car)f1;
		c3.drive(); // 4개 객체는 FireEngine 리모컨(참조변수)는 car
	}
}

class Car {
	String color;
	int door;

	void drive() {
		System.out.println("drive, Brrrr~");
	}

	void stop() {	
		System.out.println("stop!!!");	
	}
}

class FireEngine extends Car {
	void water() {
		System.out.println("water!!!");
	}
}

ch 7-26 instanceof 연산자

1. instancof 연산자

참조변수의 형변환 가능 여부 확인 → 조상과 자신 true 반환

참조변수를 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위함


ch 7-27~28 매개변수 다형성

1. 다형성의 장점

  • 다형적 매개변수
  • 하나의 배열로 여러 종류 객체 다루기

 

2. 다형성 정리

  • 조상 타입으로 자식 타입을 다룰 수 있음
  • 참조변수의 형변환(리모컨 바꾸기, 사용가능한 멤버 갯수 조절)
  • instanceof 연산자로 형변환 가능 여부 확인

 

3. 매개변수의 다형성

참조형 매개변수는 메서드 호출시 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음

 

class Product{
	int price;
	int point;
}

class Tv extends Product {}
class Computer extends Product {}
class Audio extends Product {}

class Buyer {
	int money = 1000;
	int point = 0;
    
	// 매개변수를 부모타입으로 넘겨줌 다형성으로 computer, tv, audio 모두 구매 가능
	void buy(Product p) { 
		money -= p.price;
		point += p.point;
	}
}

ch 7-29~30 여러종류 객체를 배열로 다루기

1. 여러 종류 객체를 배열로 다루기

조상타입 배열에 자손들의 객체를 담을 수 있음

// 조상 타입의 배열에 자손들의 객체를 담을 수 있음
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
728x90