명령형 프로그래밍 및 객체 지향 프로그래밍
명령형 프로그래밍은 상태를 변경하는 명령어의 시퀀스로 계산을 표현하며, 객체 지향 프로그래밍은 이러한 상태와 동작을 캡슐화되고 메시지를 주고받는 객체로 조직화합니다.
Definition
명령형 프로그래밍은 할당과 제어 흐름을 통해 프로그램 상태를 변경하는 일련의 문장으로 계산을 기술합니다. 객체 지향 프로그래밍은 상태와 연산이 메서드 호출을 통해 상호 작용하는 객체로 묶이는 구조화 원칙입니다.
Scope
이 주제는 변경 가능한 변수, 할당, 명시적 제어 흐름을 기반으로 하는 명령형 계산 모델과 객체, 클래스, 상속, 캡슐화, 동적 디스패치를 중심으로 명령형 프로그램을 구조화하는 객체 지향 원칙을 다룹니다. 여기에는 서브타이핑 및 행동적 대체 가능성, 디자인 패턴, 객체와 추상 데이터 타입 간의 관계가 포함됩니다.
Core questions
- 캡슐화는 변경 가능한 상태의 복잡성을 어떻게 제어하는가?
- 하나의 타입이 다른 타입의 행동적 서브타입(behavioral subtype)이라는 것은 무엇을 의미하는가?
- 상속은 언제 도움이 되고 언제 취약한 결합(fragile coupling)을 초래하는가?
- 객체는 추상 데이터 타입 및 모듈과 어떻게 관련되는가?
Key theories
- 행동적 서브타이핑 (리스코프 치환 원칙)
- 리스코프(Liskov)와 윙(Wing)은 서브타입의 객체가 슈퍼타입의 객체를 안전하게 대체할 수 있는 경우를 공식화하며, 서브타입이 슈퍼타입에 기대되는 관찰 가능한 행동과 불변성을 보존해야 한다고 요구합니다.
- 구조적 프로그래밍
- 달(Dahl), 다익스트라(Dijkstra), 호어(Hoare)는 이해하기 쉬운 명령형 프로그램의 기초로서 규율 있는 제어 흐름과 단계적 정제(stepwise refinement)를 확립하여, 제한 없는 goto 기반 제어를 대체했습니다.
- 디자인 패턴
- 감마(Gamma)와 동료들은 객체 지향 설계 문제에 대한 반복적인 해결책을 분류하여, 협력하는 객체를 조직화하기 위한 공통 어휘를 제공했습니다.
Clinical relevance
객체 지향 설계는 캡슐화와 다형성이 대규모 모듈식 개발과 코드 재사용을 지원하기 때문에 많은 산업 소프트웨어의 기반이 됩니다. 리스코프 치환 원칙과 디자인 패턴은 유지보수 가능한 클래스 계층 구조와 인터페이스를 구축하기 위한 실용적인 지침으로 남아 있습니다.
History
명령형 프로그래밍은 포트란(Fortran) 및 알골(Algol)과 같은 초기 저장 프로그램 기계 및 언어와 함께 시작되었습니다. 시뮬라 67(Simula 67)은 클래스와 상속을 도입했으며, 스몰토크(Smalltalk)는 1970년대와 1980년대에 순수 객체 지향과 메시지 전달을 대중화했습니다. C++와 이후 자바(Java)는 객체 지향을 주류 산업으로 가져왔고, 리스코프(Liskov)의 데이터 추상화 연구와 1994년 디자인 패턴(Design Patterns) 서적은 객체 지향 방법론을 체계화했습니다.
Debates
- 상속 대 구성
- 설계자들은 구현 상속(implementation inheritance)과 객체 구성(object composition) 중 어느 것이 재사용성과 유연성을 더 잘 촉진하는지에 대해 논쟁하며, 이후의 많은 관행은 구성과 인터페이스 기반 설계를 선호하는 경향이 있습니다.
Key figures
- Barbara Liskov
- Ole-Johan Dahl
- Kristen Nygaard
- Alan Kay
- Edsger Dijkstra
Related topics
Seminal works
- goldberg1983
- liskov1994
- dahl1972
- gamma1994
Frequently asked questions
- 리스코프 치환 원칙(Liskov Substitution Principle)이란 무엇인가요?
- 이 원칙은 서브타입의 객체가 프로그램의 정확성을 해치지 않으면서 슈퍼타입의 객체가 예상되는 모든 곳에서 사용될 수 있어야 한다고 명시하며, 이는 서브클래스가 동작을 재정의하는 방식을 제한합니다.
- 객체 지향 프로그래밍은 본질적으로 명령형인가요?
- 고전적인 객체 지향 프로그래밍은 변경 가능한 객체 상태에 의존하므로 명령형 프로그래밍의 한 형태입니다. 하지만 객체 지향 기능은 함수형 및 불변형 스타일과도 결합될 수 있습니다.