2023. 12. 13. 09:04ㆍC++/개념
프로그래밍 기법
- 절차 지향 프로그래밍 / C
가장 초기부터 사용된 기법
프로그램은 코드의 흐름(위에서부터 아래로 순서대로)에 따라 실행.
이러한 하향식 설계로 인해서 코드의 순서가 바뀌면 동일한 결과를 보장할 수 없다.
프로그램의 규모가 커질수록 비구조적인 구성 때문에 유지보수가 힘들어진다.
순차적인 코드의 실행 방법이 컴퓨터의 작업 처리 방법과 유사하여 실행 속도가 빠르다.
절차지향 프로그래밍에서 프로그램은 단순히 컴퓨터 명령어의 집합이다. - 구조적 프로그래밍
절차지향 프로그래밍의 단점을 보완하기 위해 코드를 기능 단위로 묶었다.(함수)
절차지향 프로그래밍에 비해 유지보수가 수월하지만 여전히 하향식 설계라는 단점이 존재한다. - 객체 지향 프로그래밍 / C++
공통된 속성과 메서드들을 각각 독립된 '객체'라는 단위로 묶어 프로그래밍을 한다.
이렇게 객체를 만드는 행위를 '추상화'라고 하며 실제 세계의 사물에 비유된다.
객체지향 프로그래밍에서 프로그램은 이러한 객체들의 상호작용의 결과물이라고 본다.
대규모 프로그램 개발에 많이 사용되며 유지보수에도 용이하다. - 컴포넌트 지향 프로그래밍 / Unreal
컴포넌트란 프로그래밍에서 재사용이 가능한 각각의 독립된 모듈을 뜻한다.
객체는 눈에 보이지 않는 개념들까지 포함한다면 컴포넌트는 특정 기능을 수행 가능한 최소한의 기능적 단위.
이러한 컴포넌트들을 조립하여 프로그램을 개발하는 방법이 컴포넌트 지향 프로그래밍이다.
객체 지향의 5원칙 SOLID
S 단일 책임 원칙(Single responsibility principle)
한 클래스가 제공하는 모든 서비스는 하나의 책임을 수행하는데 집중되어야 한다.
O 개방 폐쇄 원칙(Open/closed principle)
소프트웨어의 모든 구성요소는 확장에는 열려있으나, 변경에는 닫혀있어야 한다.
클래스를 설계할 때 변할 부분과 변하지 않을 부분을 구분해야 한다.
L 리스코프 치환 원칙(Liskov substitution principle)
클래스는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
부모 클래스의 포인터에 해당 클래스의 자식 클래스를 할당하더라도 모든 기능이 정상적이어야 한다.
I 인터페이스 분리 원칙(Interface segregation principle)
하나의 큰 인터페이스보다 작은 단위로 분리시켜 놓은 인터페이스에서 꼭 필요한 인터페이스만 상속받아야 한다.
인터페이스의 단일 책임을 강조.
D 의존관계 역전 원칙(Dependency inversion principle)
구체적인 클래스가 아닌 추상화한 클래스에 의존하여야 한다.
객체 지향의 5가지 특성
1. 추상화(abstraction)
객체들의 공통적인 특징(기능, 속성)들을 묶어서 표현함.
class를 정의하는 것 자체가 추상화.
2. 캡슐화(encapsulation)
실제로 구현되는 부분을 외부로 드러내지 않게하여 은닉하는 것.
private, public, protected
3. 상속성(inheritance)
하나의 클래스가 가진 특징(데이터, 함수)들을 다른 클래스가 물려받는 것.
이미 존재하는 클래스를 기반으로 새로운 클래스를 생성.
코드의 재활용.
4. 다형성(polymorphism)
어떠한 한 요소(데이터, 함수)에 여러가지 개념이 존재하도록 하는 것.
동일한 명령에 대한 해석을 연결된 객체에 의존하도록 함.
Overriding: 같은 이름과 같은 파라미터를 사용하여 내부 동작 방법을 재정의하여 사용하는 것.
Overloading: 같은 이름이지만 파라미터를 다르게 하여 같은 이름에 대한 함수를 경우에 따라 다르게 사용하는 것.
5. 동적바인딩(Dynamic Binding)
가상 함수: 클래스 내에서 오버라이딩(재정의) 될 수 있는 함수.
가상함수를 호출하는 코드를 컴파일할 때, 바인딩을 실행시간에 결정하는 것.
자식 클래스의 객체에 대해 부모 클래스의 포인터로 가상 함수가 호출될 때 일어난다(자식 클래스에서 재정의한 함수의 호출을 보장).