ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서브클래싱(Subclassing)과 서브타이핑(Subtyping)이란?
    Design Pattern/객체지향 2024. 4. 14. 00:15
    반응형

     서브클래싱(Subclassing)서브타이핑(Subtyping)은 객체지향 프로그래밍에서 중요한 개념으로, 비슷하게 들리지만 각각 다른 의미를 가집니다.

    서브클래싱 (Subclassing)

     서브클래싱은 한 클래스가 다른 클래스의 기능을 상속받아 확장하는 방법입니다. 이것은 "is-a" 관계를 형성하며, 서브클래스는 슈퍼클래스의 모든 특성(필드, 메소드)을 상속받습니다. 서브클래싱을 통해 코드의 재사용성을 높이고, 복잡한 시스템을 더 쉽게 관리할 수 있습니다. 예를 들어, "Dog" 클래스가 "Animal" 클래스를 상속받으면, "Dog"는 "Animal"의 모든 특성을 이어받아 "Animal"의 특수한 형태로서 기능을 확장할 수 있습니다.

    서브타이핑 (Subtyping)

     서브타이핑은 서브클래싱과 유사하게 보일 수 있지만, 이는 주로 타입 시스템과 관련된 개념으로 인터페이스의 구현을 포함합니다. 서브타이핑에서는 하위 타입이 상위 타입의 계약을 만족해야 하며, 상위 타입을 대체할 수 있어야 합니다 (리스코프 치환 원칙). 즉, 하위 타입은 상위 타입의 모든 동작을 수행할 수 있어야 하며, 클라이언트는 상위 타입을 사용하는 것과 동일한 방식으로 하위 타입을 사용할 수 있어야 합니다. 예를 들어, 인터페이스 "Shape"를 구현하는 "Circle"과 "Square" 클래스는 "Shape"의 모든 메소드를 구현하고, "Shape"로서 기대하는 모든 기능을 제공해야 합니다.

     

    Java에서의 서브클래싱과 서브타이핑 예시

    Java는 클래스 상속을 통한 서브클래싱과 인터페이스를 통한 서브타이핑을 지원합니다. 다음은 각각에 대한 예시입니다.

    서브클래싱 예시

    class Animal {
        public void eat() {
            System.out.println("This animal eats food.");
        }
    }
    
    class Dog extends Animal {
        public void bark() {
            System.out.println("The dog barks.");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Dog myDog = new Dog();
            myDog.eat();  // 상속받은 메소드
            myDog.bark(); // 추가된 메소드
        }
    }

    여기서 Dog 클래스는 Animal 클래스로부터 eat 메소드를 상속받고, 자신만의 메소드인 bark를 추가합니다.

    서브타이핑 예시

    interface Shape {
        void draw();
    }
    
    class Circle implements Shape {
        public void draw() {
            System.out.println("Drawing a circle.");
        }
    }
    
    class Square implements Shape {
        public void draw() {
            System.out.println("Drawing a square.");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Shape shape1 = new Circle();
            Shape shape2 = new Square();
            shape1.draw();
            shape2.draw();
        }
    }

     

    여기서 Circle과 Square는 Shape 인터페이스를 구현합니다. 이는 서브타이핑의 예로, 다형성을 이용하여 다양한 형태의 객체를 동일한 인터페이스로 조작할 수 있습니다.

    Go에서의 서브타이핑 예시

    Go는 전통적인 클래스 기반 상속을 지원하지 않으며, 인터페이스를 통한 서브타이핑에 의존합니다.

    서브타이핑 예시

    package main
    
    import "fmt"
    
    type Shape interface {
        Draw()
    }
    
    type Circle struct {}
    
    func (c Circle) Draw() {
        fmt.Println("Drawing a circle.")
    }
    
    type Square struct {}
    
    func (s Square) Draw() {
        fmt.Println("Drawing a square.")
    }
    
    func main() {
        var shape1 Shape = Circle{}
        var shape2 Shape = Square{}
        shape1.Draw()
        shape2.Draw()
    }

     Go에서는 Shape 인터페이스를 정의하고 Circle과 Square 구조체가 이를 구현합니다. 이는 인터페이스를 통한 서브타이핑의 좋은 예로, 구조체는 필요한 메소드를 구현함으로써 인터페이스의 계약을 만족시킵니다.

     Go에서는 상속과 같은 개념이 없기 때문에, 서브클래싱에 해당하는 직접적인 예시를 제공하기 어렵습니다. 대신, 구조체 임베딩을 통해 비슷한 결과를 얻을 수 있지만 이는 상속과는 다른 개념입니다.

     

    차이점

    • 서브클래싱은 구현 상속을 통해 코드를 재사용하는 것에 중점을 두고, 서브클래스가 슈퍼클래스의 모든 속성을 상속받습니다.
    • 서브타이핑은 인터페이스의 계약을 만족하는 것에 초점을 맞추며, 인터페이스를 구현하는 각 클래스가 해당 인터페이스의 계약을 충실히 이행해야 합니다.

    두 개념은 간혹 혼용되기도 하지만, 각각의 역할과 적용 범위를 명확히 이해하는 것이 중요합니다. 서브클래싱은 구현의 관점에서 접근하는 반면, 서브타이핑은 인터페이스와 행동의 호환성을 중시합니다.

    반응형

    'Design Pattern > 객체지향' 카테고리의 다른 글

    다형성(Polymorphism)이란?  (1) 2024.04.12
    상속(Inheritance)이란?  (0) 2024.04.12
    추상화(Abstraction)란?  (0) 2024.04.12
    캡슐화(encapsulation)란?  (0) 2024.04.10
    인스턴스(Instance)란?  (0) 2024.04.10
Designed by Tistory.