답변:
객체 지향 프로그래밍의 가장 중요한 특징은 복잡성 관리라는 것 입니다.
인간의 두뇌는 한 번에 많은 개념을 가질 수 있습니다. 7 +/- 2 개의 독립적 인 항목을 기억하는 데 종종 인용되는 한계가 떠 오릅니다.
직장에서 600kloc 시스템을 작업 할 때 한 번에 모든 것을 머리에 담을 수 없습니다. 그렇게해야한다면 훨씬 작은 시스템 에서만 작업 할 수있을 것 입니다.
다행히도, 난 필요가 없습니다. 우리가 그 프로젝트에서 사용한 다양한 디자인 패턴과 다른 구조는 전체 시스템을 한 번에 처리 할 필요가 없다는 것을 의미합니다. 개별적인 부분을 선택하여 더 넓은 애플리케이션에 적합하다는 것을 알고 작업 할 수 있습니다. 잘 정의 된 방식으로.
중요한 모든 OO 개념은 복잡성을 관리하는 방법을 제공합니다.
캡슐화 -서비스가 어떻게 구현되는지 걱정하지 않고 다양한 서비스를 제공하는 외부 API를 다루겠습니다.
추상화 -필수 특성에 집중하고 관련성이없는 것을 무시하겠습니다.
구성 -새로운 조합으로 이미 작성된 구성 요소를 재사용 할 수 있습니다.
다형성 -다른 객체가 다른 방식으로 서비스를 제공하는 방법에 대해 걱정하지 않고 서비스를 요청할 수 있습니다.
상속 -인터페이스 나 구현을 재사용하여 이전과 다른 부분 만 제공합니다.
단일 책임 원칙 -각 개체의 목적을 명확하고 간결하게 유지하므로 추론하기 쉽습니다.
Liskov Substitution Prinicple- 홀수 종속성을 도입하여 서로 함정을 배치하지 마십시오
개방 / 폐쇄 원칙 -기존 코드를 위반할 위험이없는 방식으로 확장 및 수정을 허용합니다.
의존성 주입 -컴포지션을 한 단계 더 발전시키고 구성 요소를 훨씬 나중에 함께 모 읍시다.
인터페이스 지향 개발 -추상화를 다음 단계로 나아가고 구체적인 구현에 의존하지 않고 추상화에만 의존하도록합시다.
그래픽 사용자 인터페이스. 80 년대 후반, 90 년대 초, Mac, Amigas, Atari ST, Windows 및 GEM이 문자 기반 사용자 인터페이스를 대체하기 시작했을 때 C와 같은 언어는 GUI 프로그램을 작성하기에 적합하지 않다는 것이 분명해졌습니다. 전통적인 데이터 처리는 절차 적 언어로도 수행 될 수있는 "입력 데이터-> 처리-> 출력 데이터"스키마로 간주되지만, OO 기능은 GUI의 고유 한 복잡성을 처리하는 데 편리했습니다.
캡슐화에서 제공하는 데이터 숨기기.
다른 답변 중 아직 언급되지 않은 기능 : 도메인 모델링 . 사람들은 객체로 또는 객체로하는 일과 본질적인 속성을 가진 객체에 대해 생각하는 경향이 있기 때문에 객체 지향 소프트웨어를 사용하여 문제 나 워크 플로를 모델링하는 것은 매우 쉽습니다. 기본적으로 코드에서 명사, 동사 및 형용사를 처리하는 기존 기능을 사용할 수 있습니다.
상속이 OOP의 가장 중요한 포인트라고 생각합니다.
[게임 개발에서] 렌더링 메서드 및 속성을 사용하여 Drawable 클래스와 같은 것을 만들고 Drawable에서 상속되는 Spaceship and Planet 클래스를 만들 수 있습니다. 그 [및 다른 Sprite 자식]에서 모든 객체를 가져 와서 drawableObjArray를 던져 모든 객체에 대해 draw 메소드를 호출하십시오. Drawable이라는 것을 알아야합니다.
불필요한 것을 숨기고 필요한 서비스를 제공합니다. 내 설명을 참조하십시오- 추상화 란 무엇입니까?
그것은 인간의 마음의 사물 조직을 사물에 사용하도록 장려하기 때문에 다소 성공합니다. 사람들은 일반적으로 차이점, 유사점 및 행동과 같은 사물의 관계를 보는 데 능숙합니다. OO는 세계의 인간 개념화를 모방하는 소프트웨어 개발을 장려합니다.
우리가 세상을 보는 것과 비슷한 방식으로 소프트웨어 개발을하면 마음이 복잡성을 쉽게 처리 할 수 있습니다.
여기에서 " ADT vs objects "가 여러 번 요청되었습니다. 한 줄의 대답은 "ADT와 객체는 서로의 역수입니다. 하나는 다른 하나는 깔끔하게 추상화 할 수 없으며, 각각 다른 방식으로 유연성을 허용합니다."
자세한 답변은 William Cook의 데이터 이해 이해에 관한 재검토를 참조하십시오 . 간단히 말해서 객체를 사용하면 일부 데이텀의 여러 구현 / 표현을 쉽게 사용할 수 있습니다 (목록처럼 보이는 것은 배열 또는 자체 균형 트리 또는 ...).하지만 새 작업을 추가하기가 어렵습니다 (왜냐하면 ADT를 사용하면 데이터 유형에 새 작업을 쉽게 추가 할 수 있지만 여러 구현을 수행하기 어렵습니다.
편집 : 메시지 전달이 OO를 성공적으로 만들었다 고 말했습니다. 사람들이 OO로 생각하는 대부분의 언어는 메시지 전달을 사용하지 않기 때문에 Jonas의 의견을 바탕으로 옳지 않습니다. 그것이 옳지 않기 때문에 나는 내 대답에서 그것을 뽑았습니다.
나의 3 대 특징. 개체 구성-개체를 공동 작업 할 수 있습니다. 다형성-런타임시 동적 동작을 지원합니다. 상속-코드를 재사용하고 메소드 재정의를 통해 동작을 수정합니다.
ADT-Pascal과 같은 객체 지향이 아닌 언어에서도 사용할 수 있습니다. 스택 또는 큐는 ADT의 예입니다.
간단히 말해서 OOP는 재사용 성 및 캡슐화의 핵심으로, API를 호출하고 가장 자주 원하는 날을 할 수 있기 때문에이 시대의 프로그래머가 쉽게 생활 할 수 있도록하는 큰 프레임 워크를 생성합니다.
질문은 OOP의 4 가지 기능에 관한 것이므로
1. 메시지 전달과 3. 다형성은 실제로 2. 상속과 4. 캡슐화를 지원합니다.
제 생각에 마지막 세 가지 기능은 OOP의 광범위한 사용에 영향을 준 가장 중요한 기능입니다.
2. Inheritance
3. Polymorphism
4. Encapsulation
편집 : 또 다른 요점은 Visual Studio 및 Eclipse와 같은 IDE 및 그래픽 인터페이스 개발 환경입니다. OOP 언어를 수용함에 따라 점점 더 많은 디자인이 OOP를 향한 경향이 있습니다.
물론 SOLID Principles 는 소프트웨어 제품 ROCK를 견실하게 제공 할 수있는 시대입니다. :)