정리/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