[Java] 상속

전주은·2023년 3월 10일
0
post-thumbnail

✔ 상속이란?

  • 특정 클래스를 구성할 때 기존 클래스의 데이터와 메소드를 부모 클래스에서 그대로 물려받아 중복적인 코드를 줄이는 것 이다.
  • 하나의 변수 타입으로 여러 종류의 객체를 의미하는 추상화된 방식의 프로그램을 가능하게 해준다.
  • 상속 방법
        접근제어자 class 클래스명 extends 부모클래스명 {
        }

✔ 자식클래스와 부모클래스

  • 자식클래스(subclass): 상속을 받는 클래스

  • 부모클래스(parent class, super class): 상속을 해주는 클래스

    public class Animal {
        private String name;
        private int age;
    
        public Animal(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public int getAge() {
            return age;
        }
    }
    
    public class Dog extends Animal {
        private String breed;
    
        public Dog(String name, int age, String breed) {
            super(name, age);
            this.breed = breed;
        }
    
        public String getBreed() {
            return breed;
        }
    }
    

    여기서 Animal이 부모, Dog가 자식 클래스이다.

✔ 다형성과 오버라이딩

자바에서는 상속을 통해 다형성을 구현할 수 있다. 다형성은 상위 클래스에서 정의된 메서드를 하위 클래스에서 오버라이딩하여 다양한 동작을 수행할 수 있도록 하는 개념이다.

⚠ 오버로딩 vs 오버라이딩

  • 오버라이딩: 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용(시그니처까지 같아야 한다.)
  • 오버로딩: 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르게 정의해서 사용 :(시그니처가 다르다.)
  • 오버라이딩 예제

    public class Animal {
        // 생략
    
        public void speak() {
            System.out.println("Animal is speaking...");
        }
    }
    
    public class Dog extends Animal {
        // 생략
    
        @Override
        public void speak() {
            System.out.println("Dog is barking...");
        }
    }
    

✔ 업캐스팅과 다운캐스팅

캐스팅이란 타입을 변환하는 것을 뜻합니다. 자바의 상속관계에 있는 부모와 자식 클래스 간에는 서로 간의 형변환이 가능합니다.
1. 업캐스팅: 자식클래스가 부모클래스로 형변환되는 것 (부모의 틀을 갖는 객체)

Animal animal = new Cat();
  1. 다운캐스팅: 부모클래스타입에서 다시 자식클래스로 복구 시키는 것(원상태로 돌리는 것: 업캐스팅 이후 사용하는 것)
if (animal instanceof Cat) {
    Cat cat = (Cat) animal;
    cat.meow();
}

부모 클래스가 자식 클래스의 인스턴스를 참조하면, 같은 부모 클래스 타입으로 여러 자식 클래스들을 다룰 수 있게 된다.

✔ 파이썬과의 차이점

  1. 다중 상속의 지원 여부
    자바는 단일 상속만을 지원하지만 파이썬은 다중 상속을 지원한다.
    자바에서는 클래스의 다중 상속을 지원하지 않기 때문에 인터페이스를 이용하여 다중 상속을 구현할 수 있다.

  2. 생성자 호출 방식
    자바의 경우 하위 클래스의 생성자에서 상위 클래스의 생성자를 호출 할 때 super() 메서드를 사용하여 수행하지만, 파이썬에서는 super() 대신에 __init__() 메서드를 사용한다.

  3. 메서드 오버라이딩
    자바와 파이썬 모두 메서드 오버라이딩을 지원한다. 하지만 자바에서는 메서드를 오버라이딩할 때 @Override 어노테이션을 사용하여 오버라이딩임을 명시해야 한다. 반면, 파이썬에서는 메서드를 오버라이딩할 때 특별한 명시가 필요하지 않다.

  4. 추상 클래스와 인터페이스
    자바에서는 추상 클래스와 인터페이스를 사용하여 추상화를 구현할 수 있다. 추상 클래스는 추상 메서드를 하나 이상 포함하는 클래스로, 인터페이스는 추상 메서드만을 포함하는 형태이다. 반면, 파이썬에서는 추상 클래스와 인터페이스가 없다. 즉, 클래스나 인터페이스에 추상 메서드가 존재하더라도, 해당 메서드를 강제로 구현하도록 하지 않는다.

  • 예시코드
from abc import ABC, abstractmethod

# 인터페이스 선언
class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

# Shape 인터페이스를 구현하는 클래스
class Square(Shape):
    def __init__(self, side):
        self.side = side

    def area(self):
        return self.side ** 2

# Shape 인터페이스를 구현하는 클래스
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2
  1. 오버로딩
    자바에서는 오버로딩을 지원하지만, 파이썬에서는 오버로딩을 지원하지 않습니다. 대신 파이썬에서는 인자의 개수를 가변적으로 받을 수 있는 가변 인자 함수를 지원한다.

0개의 댓글