window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster가 이미 존재합니다') } else { w.LeadBooster = { q: [], on: 함수 (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: 함수 (n) { this.q.push({ t: 't', n: n }) }, } } })() 가질 것인가, 될 것인가? - The Codest
The Codest
  • 회사 소개
  • 서비스
    • 소프트웨어 개발
      • 프론트엔드 개발
      • 백엔드 개발
    • Staff Augmentation
      • 프론트엔드 개발자
      • 백엔드 개발자
      • 데이터 엔지니어
      • 클라우드 엔지니어
      • QA 엔지니어
      • 기타
    • IT 자문
      • 감사 및 컨설팅
  • 산업 분야
    • 핀테크 및 뱅킹
    • E-commerce
    • 애드테크
    • 헬스 테크
    • 제조
    • 물류
    • 자동차
    • IOT
  • 가치
    • CEO
    • CTO
    • 배달 관리자
  • 우리 팀
  • Case Studies
  • 방법 알아보기
    • 블로그
    • 모임
    • 웹 세미나
    • 리소스
채용 정보 연락하기
  • 회사 소개
  • 서비스
    • 소프트웨어 개발
      • 프론트엔드 개발
      • 백엔드 개발
    • Staff Augmentation
      • 프론트엔드 개발자
      • 백엔드 개발자
      • 데이터 엔지니어
      • 클라우드 엔지니어
      • QA 엔지니어
      • 기타
    • IT 자문
      • 감사 및 컨설팅
  • 가치
    • CEO
    • CTO
    • 배달 관리자
  • 우리 팀
  • Case Studies
  • 방법 알아보기
    • 블로그
    • 모임
    • 웹 세미나
    • 리소스
채용 정보 연락하기
뒤로 화살표 뒤로 가기
2016-09-10
소프트웨어 개발

가질 것인가, 될 것인가?

카타리나 자루가

객체 지향 프로그래밍을 배우면서 객체, 필드, 메서드의 기본을 익힌 후에는 상속을 배우는데 대부분의 시간을 할애합니다. 상속이란 기본 클래스에서 구현의 일부를 가져오는 것을 의미합니다. 비공개가 아닌 모든 필드와 메서드를 상속하려면 기본 클래스의 서브클래스를 만들어야 합니다.

자동차와 비행기는 모두 탈 것이므로 이 두 클래스는 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" 타입 관계가 있는 문제, 즉 클래스가 많은 파트를 가지고 있지만 클래스의 집합 그 이상인 문제에 적용해야 합니다. 비행기는 부품으로 구성되어 있지만 그 자체로 비행과 같은 추가 능력이 있는 그 이상의 무언가입니다. 이 예에서 더 나아가 개별 부품은 서로 다른 전문 변형으로 나타날 수 있으며, 이때 상속을 사용하기에 좋은 순간입니다.

상속과 컴포지션은 프로그래머가 마음대로 사용할 수 있는 도구일 뿐이므로 특정 문제에 적합한 도구를 선택하려면 경험이 필요합니다. 그러니 연습하고 실수로부터 배우도록 하세요 🙂.

관련 문서

소프트웨어 개발

미래 지향적인 웹 앱 구축: The Codest의 전문가 팀이 제공하는 인사이트

The Codest가 최첨단 기술로 확장 가능한 대화형 웹 애플리케이션을 제작하고 모든 플랫폼에서 원활한 사용자 경험을 제공하는 데 탁월한 성능을 발휘하는 방법을 알아보세요. Adobe의 전문성이 어떻게 디지털 혁신과 비즈니스를 촉진하는지 알아보세요...

최신
소프트웨어 개발

라트비아에 본사를 둔 10대 소프트웨어 개발 기업

최신 기사에서 라트비아 최고의 소프트웨어 개발 기업과 그들의 혁신적인 솔루션에 대해 알아보세요. 이러한 기술 리더들이 어떻게 귀사의 비즈니스를 향상시키는 데 도움을 줄 수 있는지 알아보세요.

thecodest
엔터프라이즈 및 스케일업 솔루션

Java 소프트웨어 개발 필수 사항: 성공적인 아웃소싱을 위한 가이드

The Codest로 효율성을 높이고 전문 지식을 활용하며 프로젝트 성공을 이끌 수 있는 성공적인 outsourcing Java 소프트웨어 개발에 대한 이 필수 가이드를 살펴보세요.

thecodest
소프트웨어 개발

폴란드 아웃소싱을 위한 최고의 가이드

폴란드에서 outsourcing가 급증한 것은 경제, 교육, 기술 발전으로 인한 IT 성장과 비즈니스 친화적인 환경이 조성된 덕분입니다.

더코데스트
엔터프라이즈 및 스케일업 솔루션

IT 감사 도구 및 기술에 대한 완벽한 가이드

IT 감사는 안전하고 효율적이며 규정을 준수하는 시스템을 보장합니다. 전체 기사를 읽고 그 중요성에 대해 자세히 알아보세요.

The Codest
야쿱 야쿠보비치 CTO & 공동 설립자

지식창고를 구독하고 IT 분야의 전문 지식을 최신 상태로 유지하세요.

    회사 소개

    The Codest - 폴란드에 기술 허브를 둔 국제 소프트웨어 개발 회사입니다.

    영국 - 본사

    • 사무실 303B, 182-184 하이 스트리트 노스 E6 2JA
      영국 런던

    폴란드 - 현지 기술 허브

    • 파브리츠나 오피스 파크, 알레야
      포코주 18, 31-564 크라쿠프
    • 뇌 대사관, 콘스트럭터스카
      11, 02-673 바르샤바, 폴란드

      The Codest

    • 홈
    • 회사 소개
    • 서비스
    • Case Studies
    • 방법 알아보기
    • 채용 정보
    • 사전

      서비스

    • IT 자문
    • 소프트웨어 개발
    • 백엔드 개발
    • 프론트엔드 개발
    • Staff Augmentation
    • 백엔드 개발자
    • 클라우드 엔지니어
    • 데이터 엔지니어
    • 기타
    • QA 엔지니어

      리소스

    • 외부 소프트웨어 개발 파트너와의 협력에 대한 사실과 오해
    • 미국에서 유럽으로: 미국 스타트업이 유럽으로 이전을 결정하는 이유
    • 테크 오프쇼어 개발 허브 비교: 테크 오프쇼어 유럽(폴란드), 아세안(필리핀), 유라시아(터키)
    • CTO와 CIO의 주요 과제는 무엇인가요?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • 웹사이트 이용 약관

    저작권 © 2025 by The Codest. 모든 권리 보유.

    ko_KRKorean
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek ko_KRKorean