상속
기대효과
- 반복적인 코드줄임(리팩토링)
- 유지보수의 편리성
- 기존 코드를 활용함으로서 개발시간 단축
많은 사람과 협업해야 하기 때문에 최대한 다른 사람이 편할 수 있도록 중복을 피하는 것이 좋다.
*다중상속 불가능하다.
*private접근제어자는 상속이 불가능하다.
자기 자신의 생성자혹은 부모의 생성자를 호출하는 경우 단 하나만 호출할 수 있다.
**부모의 생성자 호출은 첫번째 줄만 가능하다.**
extends로 class를 상속받을 수 있다.
-자동차클래스
package inheritance;
public class Car {
private int maxSpeed;
private double distance;
public Car(int maxSpeed){
this.maxSpeed = maxSpeed;
}
public void drive() {
this.distance=this.distance+this.maxSpeed*0.5;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public double getDistance() {
return distance;
}
public void setDistance(double distance) {
this.distance = distance;
}
}
자동차 클래스를 상속받은 새로운 자동차.
package inheritance;
public class Newcar extends Car{
private boolean booster;
public Newcar(int maxSpeed) {
super(maxSpeed);
this.booster = false;
}
public Newcar(int maxSpeed,boolean booster) {
super(maxSpeed);
this.booster = booster;
}
@Override //어노테이션 애노테이션 부모를 재정의 한다는 뜻 JVM에게 알려준다.
public void drive() {
if(booster==true) {
setDistance(getDistance()+getMaxSpeed()*0.75);
}else
super.drive();//부모의 drive의 기능 메서드 이름이 바뀌지 않아 코드 작성시 불편함이 최소화 될 수 있다
}
}
메인클래스
package inheritance;
public class CarMain {
public static void main(String[] args) {
Car car = new Car(200);
car.drive();
System.out.println("거리 : "+car.getDistance());
car.drive();
System.out.println("거리 : "+car.getDistance());
Newcar newCar = new Newcar(200,true);//부스터 모드를 추가 하고 싶다.
car.drive();
System.out.println("거리 : "+car.getDistance());
car.drive();
System.out.println("거리 : "+car.getDistance());
}
}
Super 연산자
부모객체에 접근할 경우 사용
부모객체의 생성자 호출 시 사용
Override
부모 클래스의 메소드를 상속받은 자식 클래스에서 재정의하여 사용
반환자료형 인자형식 개수등 모든 구조가 같아야 한다
내부 코드만 재구성하는 것 { 이 안 부분 }
다형성
instanceof
자식클래스가 부모 인스턴스에 접근 하기 위해서는 업캐스팅을 해 준후 해야한다.
package inheritance4;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
List<String> list2 = new LinkedList<>();
//이런것도 다형성이라고 한다.
list1.add("ArrayList");
list2.add("LinkedList");
System.out.println(list1.get(0));
System.out.println(list2.get(0));
Child1 c1 = new Child1();
c1.method01();//부모메서드
c1.method02();//부모-자식 메서드(이 경우 자식메서드가 우선선택됨)
c1.method03();//자식메서드
Parent p = new Parent();
p.method01();
p.method02();
//p.method03(); 자식의 메서드는 올 수 없다.
int intData1 = 10;
double doubleData = intData1;//큰 공간에 작은 공간의데이터를 입력
int intData2 = (int)doubleData;//작은 공간에 큰 공간 데이터를 입력(다운 캐스팅)
Parent p2 = c1; //하위객체의 참조값을 상위객체의 참조변수에 입력(업캐스팅)
p2.method01();
p2.method02();//c1을 받아왔기 때문에 자식 메소드를 호출한다.
System.out.println("주소"+p2+","+c1);
Child1 c11 = (Child1)p2; //다운캐스팅을 한다.(상위객체의 참조값을 하위객체의 참조변수에 입력)
c11.method01();
c11.method02();
c11.method03();
System.out.println();
System.out.println(c11);
//Parent인스턴스에 접근은 자식의 자료형으로는 안된다.
//Child1 c111 = (Child1)p;
//c111.method01();
//c111.method02();
//c111.method03();
//childPrint(new Child1());
//childPrint(new Child2());
//부모가 같다면 메서드를 하나로 합칠 수 있다.
}
public static void childPrint(Parent p) {
//instanceof
p.method01();
p.method02();
if(p instanceof Child1) {
Child1 c1 = (Child1)p;
c1.method03();
}
if(p instanceof Child2) {
Child2 c2 = (Child2)p;
c2.method03();
}
}
// public static void ChildPrint(Child1 c) {
// c.method01();
// c.method02();
// c.method03();
//
// }
// public static void ChildPrint(Child2 c) {
// c.method01();
// c.method02();
// c.method03();
//
// }
}
//Child1클래스
package inheritance;
public class Child1 extends Parent {
public void method02() {
System.out.println("Child1 method02");
}
public void method03() {
System.out.println("Child1 method03");
}
}
//==============================================================
//Child2클래스
package inheritance;
public class Child2 extends Parent {
public void method02() {
System.out.println("Child2 method02");
}
public void method03() {
System.out.println("Child2 method03");
}
}
//==============================================================
//Child1,Child2의 부모클래스
package inheritance;
public class Parent {
public void method01() {
System.out.println("Parent method01");
}
public void method02() {
System.out.println("Parent method02");
}
}
추상클래스
추상 메서드를 가지고 있는 클래스
추상 메서드 구현부분이 없고 그 부분을 자식에게 넘긴다.
인터페이스
기능이 없는 메소드들만 있다. 상속받을 때는 implements