1. 객체 지향 프로그래밍
객체 지향 프로그래밍은 OOP(Object Oriented Programming)
이라고도 한다.
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
🍈 장점
- 코드의 재사용성이 높다.
- 누군가가 만든 클래스를 가져와 사용할 수 있고 상속을 통해 확장할 수도 있다.
- 유지보수 용이 및 코드 재사용
- 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메소드로 존재하기 때문에 해당 부분만 수정하면 된다.
- 각각의 객체는 독립적인 기능을 수행하고 서로 상호작용하므로, 하나의 객체를 수정하더라도 다른 객체에 미치는 영향이 적다.
- 대형 프로젝트에 적합하다.
- 클래스 단위로 모듈화시켜서 개발할 수 있으므로 업무 분담하기가 쉽다.
- 객체간의 상호작용
- 객체지향 프로그래밍에서는 객체들이 서로 메시지를 주고받으며 상호작용
- 이를 통해 복잡한 문제를 분해하여 해결할 수 있다.
🍈 단점
- 처리 속도가 상대적으로 느리다.
- 객체가 많으면 용량이 커질 수 있다.
- 설계 시 많은 노력과 시간이 필요하다.
🍈 객체 지향 프로그래밍의 특징
1) 캡슐화(Encapsulation)
- 서로 연관된 데이터와 함수를 함께 묶어 외부와 경계를 만들고 필요한 인터페이스만을 밖으로 드러내는 기법
- 결합도가 낮아지고 재사용 용이
- 인터페이스가 단순화
- 인터페이스를 제외한 세부 내용이 정보 은닉되어 외부 접근 제한
- 외부 모듈의 변경으로 인한 파급 효과가 적음
- 정보 은닉과 관계가 깊으며 변경 발생시 오류의 파급 효과가 적음
- 결합도 down/ 응집도 up[2020.3회, 4회]
2) 상속성(Inheritance)
- 상위 클래스의 속성과 메서드를 하위 클래스에서 재정의 없이 물려받아 사용하는 기법
- 재사용성을 높이는 중요한 개념
3) 다형성(Polymorphism)
- 하나의 메세지에 대해 각 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 능력
- 상속받은 여러 개의 하위 객체들이 다른 형태의 특성을 갖는 객체로 이용될 수 있는 성질
- 오버로딩, 오버라이딩
ex. ‘+’ 연산자의 경우 숫자 클래스에서는 덧셈, 문자 클래스에서는 문자열의 연결 기능
- 코드 내부 데이터와 메서드를 숨기고 공개 인터페이스를 통해서만 접근이 가능하도록 하는 코드 보안 기술
- 필요하지 않은 정보는 접근할 수 없도록 하여 한 모듈 또는 하부 시스템이 다른 모듈에 구현에 영향을 받지 않게 설계됨(고려되지 않은 영향인 Side-Effect들은 최소화)
- 설계에서 은닉되어야 할 기본 정보로는 IP주소와 같은 물리적 코드, 상세 데이터 구조 등이 존재
- 필요하지 않은 정보는 접근할 수 없도록 하여 한 모듈 또는 하부시스템이 다른 모듈의 구현에 영향을 받지 않게 설계되는 것을 의미한다.
- 정보은닉은 모듈 독립성을 갖추게 해줘 변화에 따른 수정 가능
- 모듈들 사이의 독립성을 유지시키는 데 도움이 된다.
5) 관계성(Relationship)
- 종류로는 연관화, 분류화, 집단화, 일반화, 특수화가 있음
- 두 개 이상의 엔터티 형에서 데이터를 참조하는 관계로 나타내는 기법
연관화
- is-member-of 관계
- 클래스와 객체의 참조 및 이용관계
- 같은 계층에 속하는 클래스 사이의 상호 의존성을 보여주는 비계층적 관계성을 나타낸다.
집단화
- is part of관계, part-whole 관계
- 서로 관련 있는 여러 개의 객체를 묶어 한 개의 상위 객체를 만드는 특징
- 일반화와 달리 상위 클래스의 성질이 하위클래스에 상속되지 않음
분류화
- is instance of 관계
- 공통된 속성에 의해 정의된 객체 구성원들의 인스터스
일반화
- is-a 관계
- 클래스간의 개념적인 포함 관계
- 상위 클래스의 특성을 하위클래스가 상속받음
특수화
- is-a 관계
- 상위 클래스들의 특성들을 상속받으면서 하위 클래스에서 나름대로 수정을 가하고 자기 자신의 고유한 특성을 갖는 관계
6) 다중 상속(Multiple Inheritance)
- 한 개의 클래스가 두 개 이상의 상위 클래스로부터 속성과 연산을 상속받는 것\
🍈 객체지향 설계 원칙(SOLID)
-
단일 책임의 원칙(SRP- Single Responsibility Principle)
: 하나의 클래스는 하나의 목적을 위해 존재
-
개방 폐쇄 원칙(OCP – Open Close Principle)
**: 소프트웨어의 구성요소는 확장에는 열려있고, 변경에는 닫혀있어야**하는 원칙
-
리스코프 치환의 원칙(LSP –Liskov Subsitution)
: 서브 타입(상속받은 하위 클래스)은 어디서나 자신의 기반 타입(상위 클래스)로 교체할 수 있어야 한다는 원칙
- 인터페이스 분리의 원칙(ISP-Interface Segregation Principle)
- 클라이언트는 자신이 사용하지 않는 메서드와 의존관계를 맺으면 안된다.
- 클라이언트가 사용하지 않는 인터페이스 때문에 영향을 받아서는 안된다.[2020 4회]
-
의존성 역전의 원칙(DIP-Dependency Inversion Principle)
: 실제 사용관계는 바뀌지 않으며, 추상을 매개로 메세지를 주고받음으로써 관계를 최대한 느슨하게 만드는 원칙
🍈 객체지향 구성요소
1) 클래스(Class)
- 하나 이상의 유사한 객체들을 묶어 공통된 특성을 표현한 데이터 추상화[2020.1회, 3회]
- 공통된 속성과 연산을 갖는 객체의 집합
- 객체지향 프로그램에서 데이터를 추상화하는 단위 ★
- 각각의 객체들이 갖는 속성과 연산을 정의하고 있는 틀
- 슈퍼 클래스 : 특정 클래스의 상위(부모) 클래스
- 서브 클래스 : 특정 클래스의 하위(자식) 클래스
2) 객체(Object)
- 자신 고유의 데이터를 가지며 클래스에서 정의한 행위를 수행
- 독립적으로 식별 가능한 이름을 갖고 있음
- 객체가 가질 수 있는 조건인 상태(State)는 시간에 따라 변함
- 객체와 객체는 상호 연관성에 의한 관계 형성
- 객체가 반응할 수 있는 메세지의 집합을 행위라고 하며, 객체는 행위의 특징을 나타냄
- 객체는 일정한 기억장소를 가지고 있음
- 실세계 존재하거나 생각할 수 있는 것을 말함
3) 메서드(Method)
- 전통적 시스템의 함수 또는 프로시저에 해당하는 연산
- 클래스로부터 생성된 객체를 사용하는 방법, 객체에 명령을 내리는 메세지
4) 메세지(Message)
- 객체에게 어떤 행위를 하도록 지시하기 위한 방법
5) 인스턴스(Instance)
- 클래스에 속한 각각의 객체
- 클래스로부터 새로운 객체를 생성하는 것을 인스턴스화라고 함
6) 속성(Property)
- 한 클래스 내에 속한 객체들이 가지고 있는 데이터 값들을 단위별로 정의
🍈 객체지향 프로그래밍 언어(Object-Oriented Programming Languages) 종류
- Java: 객체지향 개념을 완전히 구현하고, 플랫폼 독립적인 특성
- C++: 객체지향 프로그래밍 기능을 지원하면서도, 절차 지향 프로그래밍 요소를 포함
- Python: 객체지향 프로그래밍을 완전히 지원하는 동시에 절차 지향 및 함수형 프로그래밍도 지원
- C# (C Sharp): .NET 프레임워크에서 사용되며, 객체지향 프로그래밍을 완벽하게 지원
- Ruby: 객체지향 프로그래밍에 매우 강조를 두는 언어로, 모든 것이 객체로 처리
- Smalltalk: 객체지향 프로그래밍의 순수한 형태를 제공하는 언어 중 하나
2. 절차 지향 프로그래밍**(Procedural Programming)**
절차 지향 프로그래밍은 프로그램을 명령의 순서와 절차에 따라 구성하는 방법으로 주로 C 언어가 이에 해당
🍈 특징
- 프로세스 중심: 절차 지향 프로그래밍은
프로세스나 절차를 중심
으로 프로그램을 구성하며, 프로그램은 함수의 집합으로 구성되며, 순차적인 처리가 중요
- 단순성과 효율성: 작은 프로그램이나 단순한 애플리케이션에서는 절차 지향 프로그래밍이 효율적일 수 있다. 코드의 흐름을 이해하기 쉽고, 실행 속도가 빠를 수 있다.
🍈 절차 지향 프로그래밍 언어(Procedural Programming Languages) 종류
- C: 가장 널리 알려진 절차 지향 프로그래밍 언어로, 시스템 프로그래밍에 주로 사용
- Fortran: 과학 및 공학 계산에 사용되는 고성능의 절차 지향 언어
- Pascal: 교육용으로 널리 사용되는 절차 지향 언어입
- BASIC: 초보자를 위한 간단한 절차 지향 언어
- COBOL: 주로 비즈니스, 금융 및 행정 시스템에서 사용되는 절차 지향 언어
3. 객체지향 프로그래밍과 절차 지향 프로그래밍의 비교
- 코드 구조: 객체지향은 데이터와 기능을 객체 안에 캡슐화하고, 절차 지향은 함수와 프로세스를 통해 프로그램을 구성
- 유지보수성: 객체지향은 코드의 재사용과 유지보수가 용이하지만, 절차 지향은 대규모 프로젝트에서 코드 변경 시 파급 효과가 클 수 있다.
- 성능: 일반적으로
절차 지향 프로그래밍이
객체지향보다 실행 속도가 빠를 수 있다.
- 적용 분야: 객체지향은 대규모 소프트웨어 개발에 적합하고, 절차 지향은 소규모 또는 특정 알고리즘 구현에 적합할 수 있다.