미래 지향적인 웹 앱 구축: The Codest의 전문가 팀이 제공하는 인사이트
The Codest가 최첨단 기술로 확장 가능한 대화형 웹 애플리케이션을 제작하고 모든 플랫폼에서 원활한 사용자 경험을 제공하는 데 탁월한 성능을 발휘하는 방법을 알아보세요. Adobe의 전문성이 어떻게 디지털 혁신과 비즈니스를 촉진하는지 알아보세요...
객체 지향 프로그래밍을 배우면서 객체, 필드, 메서드의 기본을 익힌 후에는 상속을 배우는데 대부분의 시간을 할애합니다. 상속이란 기본 클래스에서 구현의 일부를 가져오는 것을 의미합니다. 비공개가 아닌 모든 필드와 메서드를 상속하려면 기본 클래스의 서브클래스를 만들어야 합니다.
자동차와 비행기는 모두 탈 것이므로 이 두 클래스는 Vehicle이라는 공통 기본 클래스에서 확장되어야 한다는 것은 분명합니다. 이것은 전형적인 학문적 예이지만 이러한 클래스를 상속 관계로 바인딩하는 것을 결정할 때 몇 가지 결과를 염두에 두어야 합니다.
그림 1 상속 관계의 구현.
이 경우 클래스는 서로 밀접하게 연결되어 있으므로 기본 클래스를 변경하여 모든 클래스의 동작을 변경할 수 있습니다. 코드. 이는 장점일 수도 있고 단점이 될 수도 있는데, 어떤 종류의 동작을 기대하는지에 따라 달라집니다. 상속이 잘못된 시점에 적용되면 새 함수를 추가하는 과정에서 생성된 클래스 모델에 맞지 않아 구현에 어려움을 겪을 수 있습니다. 코드를 복제하거나 모델을 재구성하는 것 중 하나를 선택해야 하는데, 이 과정에서 시간이 많이 소요될 수 있습니다. 상속 관계를 실행하는 코드를 "개방형-폐쇄형"이라고 부를 수 있는데, 이는 확장을 위해서는 열려 있지만 수정을 위해서는 닫혀 있다는 의미입니다. Vehicle 클래스에 모든 차량의 일반적인 엔진 작동이 정의되어 있다고 가정할 때, 클래스 계층 구조에 엔진이 없는 차량(예: 자전거) 모델을 추가하려면 클래스에 심각한 변경을 수행해야 합니다.
Vehicle 클래스
def start_engine
end
def stop_engine
end
end
클래스 Plane < Vehicle
def move
start_engine
...
stop_engine
end
end
기존 클래스의 동작 중 일부에만 관심이 있는 경우 상속을 위한 좋은 대안은 컴포지션을 사용하는 것입니다. 모든 동작(필요한 동작과 전혀 필요하지 않은 동작)을 상속하는 서브클래스를 만드는 대신 필요한 기능을 분리하고 객체에 이를 참조하는 함수를 장착할 수 있습니다. 이렇게 하면 객체가 다음과 같다는 생각을 버릴 수 있습니다. 의 유형입니다. 를 기본 객체로 지정하여 다음과 같은 주장을 지지합니다. 여기에는 다음이 포함됩니다. 속성의 일부만 사용할 수 있습니다.
그림 2 컴포지션 사용
이 접근 방식에 따라 엔진 작동을 담당하는 코드를 Engine이라는 자율 클래스로 분리하고 엔진이 있는 차량을 나타내는 클래스에만 참조를 배치할 수 있습니다. 컴포지션을 사용하여 함수를 분리하면 Vehicle 클래스 구조가 더 단순해지고 개별 클래스의 캡슐화가 강화됩니다. 이제 차량이 엔진에 영향을 미칠 수 있는 유일한 방법은 공용 인터페이스를 사용하는 것뿐이며, 더 이상 엔진 구현에 대한 정보가 없기 때문입니다. 또한 다른 차량에서 다른 유형의 엔진을 사용할 수 있으며 프로그램이 실행되는 동안에도 교환할 수 있습니다. 물론 컴포지션을 사용한다고 해서 완벽한 것은 아니며, 느슨하게 연결된 클래스 세트를 만들어 쉽게 확장할 수 있고 수정할 수 있도록 개방되어 있습니다. 그러나 동시에 각 클래스는 다른 많은 클래스와 연결되어 있으며 인터페이스에 관한 정보가 있어야 합니다.
클래스 차량
끝
클래스 엔진
def start
end
def stop
end
end
클래스 Plane < Vehicle
def initialize
엔진 = Engine.new
end
def move
@engine.start
@engine.stop
end
def change_engine(new_engine)
엔진 = new_engine
end
end
설명한 두 가지 접근 방식 모두 장단점이 있는데 어떻게 선택해야 할까요? 상속은 전문 분야이므로 "is-a" 유형 관계가 있는 문제에만 적용하는 것이 가장 좋으므로 실제 유형 계층 구조를 다룹니다. 상속은 클래스를 서로 긴밀하게 연결하기 때문에 먼저 컴포지션을 사용할지 여부를 항상 고려해야 합니다. 컴포지션은 "has-a" 타입 관계가 있는 문제, 즉 클래스가 많은 파트를 가지고 있지만 클래스의 집합 그 이상인 문제에 적용해야 합니다. 비행기는 부품으로 구성되어 있지만 그 자체로 비행과 같은 추가 능력이 있는 그 이상의 무언가입니다. 이 예에서 더 나아가 개별 부품은 서로 다른 전문 변형으로 나타날 수 있으며, 이때 상속을 사용하기에 좋은 순간입니다.
상속과 컴포지션은 프로그래머가 마음대로 사용할 수 있는 도구일 뿐이므로 특정 문제에 적합한 도구를 선택하려면 경험이 필요합니다. 그러니 연습하고 실수로부터 배우도록 하세요 🙂.