티스토리 뷰

상속 ( Inheritance ) 이란 ?

부모클래스를 재사용하여 새로운 자식클래스를 작성하는 것

 

부모클래스의 field와 method를 내려받고, 자식클래스들의 중복되는 member들은 부모클래스에서 작성/관리함으로써 중복을 줄일 수 있습니다.

 

 

메소드 오버라이딩 ( 메소드 재정의 )

  • 부모클래스에서 상속받은 메소드를 자식클래스에서 확장하거나 변형하는 것

  • 이름 동일, 리턴타입 동일, 파라미터 동일

  • @Override 애노테이션을 사용하여 재정의한다는 것을 표시해줍니다.

 

코드로 이해하기

com.car 패키지의 클래스 다이어그램

 

부모클래스 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!

 

최근에 올라온 글
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Total
Today
Yesterday