코드의 재사용
두 클래스를 부모와 자식으로 관계를 맺어줌
조상의 모든 맴버를 상속 받는다.
자손의 변경은 조상에 영향을 미치지 않는다.
java는 단일상속만 허용한다.
class TvDVD extends Tv, DVD { ----->// 2개 상속 못받음 2개중 1개 골라야 한다.
}
클래스의 맴버로 참조변수를 선언하는 것
작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
class Circle {
Point c = new Point();
int r;
}
상속받은 조상의 메서드를 자신에 맞게 변경하는 것 (voerride : 덮어쓰다)
메서드를 상속 받았는데 그 메서드를 오버라이딩 할 경우 오버라이딩한 메서드가 호출 된다.
인스턴스 메서드(생성자)내에만 존재
조상맴버와 자신의 맴버를 구별할 때 사용
super, this 로 구별
(붙이지 않으면 가까운쪽 불러온다.)
조상생성자 호출할 때 super()이용
{중요!!}-생성자의 첫줄에 반드시 생성자를 호출해야한다.
그렇지 않으면 컴파일러가 생성자의 첫줄에 super()를 삽입한다.
final 클래스 - 확장될 수 없는 클래스(다른 클래스의 조상이 될 수 없다.)
final 메서드 - 오버라이딩을 통해 재정의 될 수 없다.
final 맴버변수, 지역변수 - 값을 변경할 수 없다.(상수)
private : 같은 클래스 내에서만 접근이 가능하다.
(default) : 같은 패키지 내 내에서만 접근이 가능하다.
protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
public : 접근 제한이 전혀 없다.
public class Time {
public int hour; // 범위 0~23
public int minute; // 범위 0~59
public int second; // 범위 0~59
}
Time t = new Time();
t.hour = 25; //멤버변수에 직접 접근
이런식으로 멤버변수에 직접 접근 할 경우 변수에 들어가는 값에 제한을 둘 수 없다.
public class Time {
private int hour;
private int minute;
private int second;
public void setHour(int hour) {
if (isNotValidHour(hour)) return;
this.hour = hour;
}
// 매개변수로 넘겨진 hour가 유효한지 확인해서 알려주는 메서드
private boolean isNotValidHour(int hour) {
return hour < 0 || hour > 23;
}
public int getHour() { return hour; }
그러므로 접근 제어자 private를 이용해서 접근을 막고 메서드를 통해서만 접근할 수 있게 함으로써 들어가는 값에 제한을 둘 수 있다. 이를 캡슐화라고 함
조상 타입 참조 변수로 자손 타입 객체를 다루는 것
Tv t = new SmartTv();
//조상 참조변수 /자손 객체
조상 자손 관계의 참조변수는 서로 형변환 가능
단 !!!!!, 같을 경우 불가능
Car c = new Car();
FireEngine f = (FireEngine)c
참조변수 c는 Car객체를 가르키고 있는데 멤버변수가 4개이다.
그런데 여기서 FireEngine f는 멤버변수를 5개 가지고 있기때문에 5개에서 4개를 가르키기 때문에 java.lang.ClassCastException 오류가 뜬다.
package chapter7;
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!!!");
}
}
----------------------------------------------------------
public class 형변환 {
public static void main(String[] args) {
class Practice {
void doWork(Car c) { //다형성 Car c = new Car(), new FireEngine()
if(c instanceof FireEngine) { //형변환 가능한지, 조상Car로(리모콘) 형변환 가능한지 물어보면 자손들은 조상보다 객체수가 많기 때문에 참이 된다.
System.out.println("< if 문 >");
System.out.println(c instanceof FireEngine); //형변환 가능한지 true, false로 알려줌 이때는 (형변환)필요없음
System.out.println(c instanceof Car);
FireEngine fe = (FireEngine)c; //조상 참조변수이지만 가르키고있는 객체는 자손객체이다. 그렇기 때문에 형변환이 가능하다.
fe.water(); // 4개만 사용할 수 있지만 가르키고있는 객체는 5개이다. 그래서 위와같이 형변환이 가능.
}else {
System.out.println("< else 문 >");
System.out.println(c instanceof FireEngine);
System.out.println(c instanceof Car);
FireEngine Fire = (FireEngine)c; //이미 만들어진 객체는 조상객체로 4개 속성가지고 있다.
//그런데 자손은 그것보다 더 많은 5개를 가지고 있고 4개를 가지고있는 객체를 가리키게되면 오류가 생기게 된다.
}
}
}
Practice p = new Practice();
p.doWork(new FireEngine());
System.out.println("-----------------------");
p.doWork(new Car());
}
}
//====== 실행 결과 ========
< if 문 >
true
true
water!!!
-----------------------
< else 문 >
false
true
Exception in thread "main" java.lang.ClassCastException: chapter7.Car cannot be cast to chapter7.FireEngine
at chapter7.형변환$1Practice.doWork(형변환.java:79)
at chapter7.형변환.main(형변환.java:91)