티스토리 뷰
상속 ( Inheritance ) 이란 ?
부모클래스를 재사용하여 새로운 자식클래스를 작성하는 것
부모클래스의 field와 method를 내려받고, 자식클래스들의 중복되는 member들은 부모클래스에서 작성/관리함으로써 중복을 줄일 수 있습니다.
메소드 오버라이딩 ( 메소드 재정의 )
-
부모클래스에서 상속받은 메소드를 자식클래스에서 확장하거나 변형하는 것
-
이름 동일, 리턴타입 동일, 파라미터 동일
-
@Override 애노테이션을 사용하여 재정의한다는 것을 표시해줍니다.
코드로 이해하기
부모클래스 Car.java
public class Car {
private String color;
private int speed;
public Car() {
}
public Car(String color) {
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public void accelPedal() {
System.out.println("속도가 올라갑니다.");
this.speed += 10;
}
public void breakPedal() {
this.speed -= 10;
if (this.speed == 0)
System.out.println("멈췄습니다.");
else
System.out.println("속도가 줄어듭니다.");
}
@Override
public String toString() {
return "현재 속도는 " + speed + "입니다.";
}
}
Car 클래스를 상속받는 자식클래스 SportsCar.java 와 Truck.java
public class SportsCar extends Car {
public SportsCar() {
}
public SportsCar(String color) {
setColor(color);
}
@Override
public void accelPedal() {
System.out.println("속도가 빠르게 올라갑니다.");
setSpeed(getSpeed() + 15);
}
@Override
public void breakPedal() {
setSpeed(getSpeed() - 15);
if (getSpeed() == 0)
System.out.println("멈췄습니다.");
else
System.out.println("속도가 빠르게 내려갑니다.");
}
@Override
public String toString() {
return getColor() + "의 현재 속도는 " + getSpeed() + "입니다.";
}
}
public class Truck extends Car {
public Truck() {
}
public Truck(String color) {
setColor(color);
}
@Override
public void accelPedal() {
System.out.println("속도가 느리게 올라갑니다.");
setSpeed(getSpeed() + 5);
}
@Override
public void breakPedal() {
setSpeed(getSpeed() - 5);
if (getSpeed() == 0)
System.out.println("멈췄습니다.");
else
System.out.println("속도가 느리게 내려갑니다.");
}
@Override
public String toString() {
return getColor() + "의 현재 속도는 " + getSpeed() + "입니다.";
}
}
메인메소드가 있는 MTest.java
public class MTest {
public static void main(String[] args) {
Car car1 = new Car();
car1.accelPedal();
car1.accelPedal();
System.out.println(car1);
car1.breakPedal();
System.out.println(car1);
car1.breakPedal();
System.out.println("------------------------------------");
Car car2 = new SportsCar("빨간색");
car2.accelPedal();
car2.accelPedal();
System.out.println(car2);
car2.breakPedal();
car2.breakPedal();
System.out.println("------------------------------------");
Car car3 = new Truck("파란색");
car3.accelPedal();
car3.accelPedal();
System.out.println(car3);
car3.breakPedal();
car3.breakPedal();
}
}
다형성 ( Polymorphism ) 이란 ?
여러가지 타입을 한 가지 타입으로 처리하는 것
-
부모 타입으로 자식 객체를 생성할 수 있습니다.
Parent p = new Child();
-
부모 타입에 자식을 대입할 수 있습니다.
Child c = new Child();
Parent p = c;
-
부모의 메소드를 통해 자식 메소드를 호출할 수 있습니다.
public class Parent {
public void hello() {
System.out.println("부모의 hello()");
}
}
public class Child extends Parent {
@Override
public void hello() {
System.out.println("오버라이딩한 hello()");
}
public void bye() {
System.out.println("자식의 bye()");
}
}
Parent p = new Child();
p.hello(); // 오버라이딩된 부모의 메소드이므로 접근 가능
//p.bye(); // 컴파일에러! -> 부모타입으로 자식 메소드에 접근할 수 없다.
컴파일 에러인 경우
같은 부모클래스를 가지고 있는 자식클래스들끼리 형변환하려고 할 때
Child c1 = new Child1();
Child c2 = new Child2();
c1 = (Child) c2; // 컴파일 에러!
컴파일 시에는 가능한데 런타임 시에 ClassCastException을 발생시키는 경우
부모클래스를 자식클래스로 형변환하려고 할 때
Parent p = new Parent();
Child c = (Child) p; // ClassCastException!
'JAVA > 이론' 카테고리의 다른 글
[JAVA] 컬렉션 ( Collection ) Framework - List, Set, Map (0) | 2019.12.03 |
---|---|
[JAVA] [OOP] 추상 클래스 ( Abstract Class ) 와 인터페이스 ( Interface ) (0) | 2019.11.28 |
[JAVA] [OOP] 생성자 ( Constructor ) 에 대하여 (0) | 2019.11.27 |
[JAVA] [OOP] 클래스 , 객체 , 인스턴스 란 ? (2) | 2019.11.27 |
[JAVA] [OOP] Object Oriented Programming (객체 지향 프로그래밍) 이란 ? (2) | 2019.11.27 |