상속과 다형성

심야·2022년 9월 15일
0

웹 개발

목록 보기
14/46

상속

클래스 이름 옆에 extends 부모 클래스 이름을 적어주면 멤버(변수, 메소드)를 물려준다. 물려주는 클래스를 부모 클래스, 물려받는 클래스를 자식 클래스라 한다. 아래 코드와 같이 "Dog extends Animal"라고 하면 Animal 클래스를 확장한다는 의미이다. 부모 클래스인 Animal에 선언되어 있는 public 및 protected로 선언되어 있는 모든 변수와 메소드를 자식 클래스가 갖고 있는 것처럼 사용할 수 있다. package private으로 선언된 멤버는 같은 패키지 내에서만 사용할 수 있다.

public class Main()
{
	public static void main(String[] args)
    {
    	Animal ani = new Animal();
        ani.printName();
        Dog dog = new Dog();
        dog.printName();
    }
}

class Animal
{
	public Animal()
    {
    	System.out.println("Animal Constructor");
    }
    public void printName()
    {
		System.out.println("Animal");    
    }
}

class Dog extends Animal
{
	public Dog()
    {
    	System.out.println("Dog Constructor");
    }
}

생성자 실행 순서


Dog dog = new Dog();
dog.printName();

Dog 생성자가 실행되어 "Dog Constructor"가 출력될 것 같지만 상속을 받았기 때문에 부모 클래스 생성자도 실행된다. 이 때 생성자 실행 순서는 부모 클래스 생성자 > 자식 클래스 생성자 순이다.

super();

자식 클래스에서 부모 클래스 생성자를 명시적으로 지정하는 예약어

public class Animal
{
    public String name;
    public String kind;
    public int legCount;
    public boolean hasWing;
    
    public Animal(String name, String kind, int legCount, boolean hasWing) {
          this.name = name;
          this.kind = kind;
          this.legCount = legCount;
          this.hasWing = hasWing;
      }
}

public class Dog extends Animal {
    public Dog() {
        System.out.println("강아지가 태어났습니다.");
    }
}

위 코드의 Dog 클래스 생성자를 실행하면 Animal 클래스의 매개 변수가 없는 기본 생성자가 없다는 에러가 발생한다. 이러한 문제가 발생하는 이유는 Animal 클래스의 상속을 받은 Dog 클래스 생성자가 Animal() 기본 생성자를 찾는데 Animal 클래스에 정의한 생성자는 매개변수가 있는 생성자만 있기 때문이다. 매개변수가 있는 생성자가 만들어져 있으면 기본 생성자는 자동으로 만들어지지 않는다. 따라서 자식 클래스에서 부모 클래스 생성자를 명시적으로 지정하는 super()를 사용해야 한다.

public class Animal
{
    public String name;
    public String kind;
    public int legCount;
    public boolean hasWing;
    
    public Animal(String name, String kind, int legCount, boolean hasWing) {
          this.name = name;
          this.kind = kind;
          this.legCount = legCount;
          this.hasWing = hasWing;
      }
}

public class Dog extends Animal {
    public Dog() {
    	super("멍멍이", "개", 4, false);
        System.out.println("강아지가 태어났습니다.");
    }
}

Polymorphism(다형성)

Polymorphism은 다형성을 의미한다. 상속 관계에 있는 클래스에서 상위클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체지향 원리(개념)이다. 하나의 참조 변수로 여러 타입의 객체를 참조할 수 있는 것으로 상위 타입 참조변수로 하위 타입 객체를 다룬다. 상속관계에 있는 클래스 간에 사용한다. 상위타입 참조변수로 하위타입 인스턴스를 참조할 수 있지만, 반대로 하위타입 참조변수로 상위타입 인스턴스를 참조할 수 없다.

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글