포함과 상속 (java와 비교)

혜쿰·2023년 10월 13일
0
post-thumbnail

📘 포함

포함(Composition)이란? 객체 지향 프로그래밍에서 사용되는 개념으로, 하나의 클래스가 다른 클래스의 인스턴스를 포함하는 관계를 의미한다. 이것은 클래스 간의 관계를 표현하고, 코드 재사용과 모듈화를 촉진하는데 사용된다.

포함의 주요 개념은 다음과 같다.

  1. 클래스 구성
    포함 관계에서는 한 클래스가 다른 클래스의 인스턴스를 멤버 변수로 가진다. 이를 통해 클래스 간의 관계를 형성한다. 이렇게 포함된 클래스를 포함 클래스의 멤버로 사용할 수 있다.

  2. 모듈화
    포함은 코드를 모듈화하는데 도움을 준다. 즉, 각 클래스는 자체적으로 기능을 제공하고 관리하며, 포함 관계를 통해 다양한 모듈을 조합하여 더 큰 시스템을 구축할 수 있다.

  3. 코드 재사용
    포함은 코드 재사용성을 높인다. 포함된 클래스는 다른 클래스에서 사용될 수 있으므로 유사한 기능을 가진 여러 클래스 간의 중복 코드를 피할 수 있다.

  4. 관리와 유지 보수
    포함은 코드를 논리적으로 구분하여 관리 및 유지보수를 쉽게 만든다. 각 클래스는 자체적으로 독립적인 역할을 수행하므로 시스템을 이해하고 수정하기가 더 용이하다.

📖 python

  1. 구문
    파이썬에서는 클래스 내에서 다른 클래스의 객체를 인스턴스 변수로 저장하고 초기화하는 방식으로 포함을 구현한다. 이는 자바와 유사하다. Python은 클래스의 생성자 내에서 다른 클래스의 객체를 생성하고 사용할 수 있으며, 이 객체는 해당 클래스의 멤버 변수로 포함된다.

  2. 접근
    파이썬에서는 객체의 접근을 훨씬 유연하게 다룬다. 객체의 변수 및 메서드에 대한 접근을 일반적으로 제한하지 않는다. 클래스 내에 포함된 객체는 클래스의 메서드에서 직접 사용할 수 있다.

class Engine:
	pass
    
class Car:
    def __init__(self):
        self.engine = Engine()  # Engine 클래스의 객체를 포함

    def start(self):
        self.engine.start()  # 포함된 객체의 메서드 호출
.

📖 java

  1. 구문
    자바에서는 클래스 내에서 다른 클래스의 객체를 선언하고 초기화하는 방식으로 포함을 구현한. 이를 통해 객체를 클래스의 멤버 변수로 포함시킬 수 있다.

  2. 접근 지정자
    자바에서는 포함된 객체의 접근 권한을 제어하기 위해 적절한 접근 지정자를 사용한. 보통은 private으로 선언하여 캡슐화를 유지한다.

3.메서드 호출
포함된 객체의 메서드를 호출할 때는 해당 객체의 참조를 사용하여 호출합니다.

public class Car {
    private Engine engine; // Engine 클래스의 객체를 포함

    public Car() {
        engine = new Engine(); // 포함된 객체 초기화
    }

    public void start() {
        engine.start(); // 포함된 객체의 메서드 호출
    }
}

📍 요약

요약하면, 자바와 파이썬 모두 클래스의 포함을 통해 다른 클래스의 객체를 사용할 수 있지만, 자바에서는 접근 지정자를 사용하여 접근을 제한하는 경향이 있고, 파이썬에서는 보다 유연한 접근을 허용하는 특성이 있다.

📘 상속

상속(Inheritance)은 객체 지향 프로그래밍에서 중요한 개념 중 하나로, 클래스 간의 관계를 나타내는 메커니즘이다. 상속은 기존 클래스(부모 클래스 또는 슈퍼 클래스)의 특성을 새로운 클래스(자식 클래스 또는 서브 클래스)에서 재사용하거나 확장하는 것을 가능하게 한다. 이로써 코드 재사용성이 증가하며, 클래스 간의 계층 구조를 구성할 수 있다.

상속의 주요 개념은 다음과 같다

  1. 부모 클래스 (슈퍼 클래스)
    상속의 대상이 되는 클래스를 의미한다. 부모 클래스는 이미 정의된 속성(멤버 변수)과 메서드(함수)를 포함한다.

  2. 자식 클래스 (서브 클래스)
    부모 클래스로부터 상속받은 특성을 사용하거나 확장하는 클래스를 의미한다. 자식 클래스는 부모 클래스의 특성을 상속하고, 자체 고유한 특성을 추가할 수 있다.

  3. 상속 관계
    자식 클래스는 부모 클래스의 멤버 변수와 메서드를 상속받는다. 이것은 자식 클래스가 부모 클래스의 모든 속성과 동작을 이용할 수 있음을 의미한다.

  4. 재정의 (Overriding)
    자식 클래스에서 부모 클래스의 메서드를 다시 정의하거나 재정의할 수 있다. 이로써 자식 클래스는 부모 클래스의 메서드를 수정하거나 확장할 수 있다.

  5. 다중 상속
    몇몇 프로그래밍 언어에서는 하나의 클래스가 여러 부모 클래스로부터 상속을 받을 수 있다. 이를 다중 상속이라고 한다. Python은 다중 상속을 지원하는 언어 중 하나이다.

상속의 주요 목적은 코드 재사용과 계층 구조 생성이다. 부모 클래스에서 공통적인 특성을 정의하고, 자식 클래스에서는 이러한 특성을 확장하거나 변경하여 다양한 클래스를 정의할 수 있다. 이로써 유지 보수가 쉽고 확장 가능한 코드를 작성할 수 있다.

다음은 파이썬과 자바의 상속에 대한 차이점에 대해 알아보겠다.

1. 다중 상속

  • 파이썬
    파이썬은 다중 상속을 지원한다. 즉, 하나의 클래스가 여러 부모 클래스로부터 상속을 받을 수 있다. 이는 다양한 클래스에서 기능을 조합하고 코드를 재사용할 수 있는 장점을 제공한다. 다만 다중 상속을 사용할 때 충돌하는 메서드나 변수 이름에 대한 조심이 필요하다.

  • 자바
    자바는 단일 상속만을 지원한다. 클래스는 오직 하나의 클래스만을 상속할 수 있다. 이러한 제한으로 인해 다중 상속으로 인한 복잡성과 충돌을 피할 수 있으나, 코드 재사용에 제약을 가한다.

2. 추상 클래스와 인터페이스

  • 파이썬
    파이썬에서는 추상 베이스 클래스(Abstract Base Class, ABC)를 사용하여 추상 메서드를 정의하고, 서브클래스가 이러한 메서드를 구현하도록 할 수 있다. 추상 베이스 클래스는 다중 상속을 지원하고 다른 클래스에서 공통적인 메서드를 정의하는 데 사용된다. 그리고 파이썬에서는 인터페이스가 없다.
    추상메소드를 사용하기 위해서는 @abstractmethod 데코레이터(Decorator)를 사용해야한다.
  • 자바
    자바는 인터페이스를 사용하여 추상 메서드를 정의하고 다른 클래스에서 구현하도록 요구한다. 클래스는 여러 인터페이스를 구현할 수 있으며, 이는 다중 상속을 어느 정도 모방할 수 있게 한다.
    추상메소드를 사용하기 위해서는 abstract 키워드를 사용해야 한다.

3. 메서드 오버라이딩:

  • 파이썬
    파이썬에서 메서드 오버라이딩(Overriding)은 부모 클래스의 메서드를 서브클래스에서 재정의할 수 있으며, 부모 클래스의 메서드를 호출하려면 super()를 사용할 수 있다.
  • 자바
    자바에서도 메서드 오버라이딩이 가능하며, @Override 어노테이션을 사용하여 명시적으로 오버라이딩한 메서드임을 표시한다. super 키워드를 사용하여 부모 클래스의 메서드를 호출할 수 있다.

4. 상속 계층 구조:

  • 파이썬
    파이썬에서는 모든 클래스가 object 클래스를 암묵적으로 상속받는다. 이는 모든 클래스가 최소한 object 클래스의 메서드를 가지고 있음을 의미한다.
  • 자바
    자바에서는 클래스가 명시적으로 Object 클래스를 상속받아야 합니다. 모든 클래스는 Object 클래스의 메서드를 상속받는다.

📖 python

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass  

class Dog(Animal): # Animal 클래스 상속 
    def speak(self): # 오버라이딩
        return f"{self.name} says Woof!"

class Cat(Animal):
    def speak(self):
        return f"{self.name} says Meow!"

# 상속된 클래스의 인스턴스 생성
dog = Dog("Buddy")
cat = Cat("Whiskers")

# 메서드 호출
print(dog.speak())  # "Buddy says Woof!"
print(cat.speak())  # "Whiskers says Meow!"

자식 클래스에서 괄호안에 부모 클래스의 이름을 적으면 클래스를 상속한다.

📖 java

class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    void speak() {
        System.out.println("Animal sound");
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    void speak() {
        System.out.println(name + " says Woof!");
    }
}

class Cat extends Animal {
    Cat(String name) {
        super(name);
    }

    void speak() {
        System.out.println(name + " says Meow!");
    }
}

public class Main {
    public static void main(String[] args) {
        // 상속된 클래스의 인스턴스 생성
        Dog dog = new Dog("Buddy");
        Cat cat = new Cat("Whiskers");

        // 메서드 호출
        dog.speak(); // "Buddy says Woof!"
        cat.speak(); // "Whiskers says Meow!"
    }
}

0개의 댓글