-
객체 지향 프로그래밍(OOP)이란 무엇일까?프로그래밍 기초 공부 2022. 9. 16. 18:01
세번째로 포스팅하게 될 내용은 객체 지향 프로그래밍에 대한 내용입니다.
[ 객체 지향 프로그래밍이란? ]
객체
객체란 말 그대로 대상을 나타내는 단어입니다.
예를 들어, 사람 개인 한 명 한 명을 모두 객체라 할 수 있고, 책 한 권 한 권을 객체라 할 수 있습니다.
사람은 생김새와 성격이 똑같을 수는 없기 때문에 개개인을 객체라 할 수 있으며,
책도 내용이 같을지라도 한 권의 책에 메모를 한다고 해서 모든 책들이 전부 메모가 되는 것이 아니기 때문에 한 권 한 권을 객체라 할 수 있습니다.
클래스
사람들은 일반적으로 같은 속성들을 갖고 있습니다.
사람, 책 같은 객체들이 공통적으로 갖는 속성들을 모아서 정의내린 것을 클래스라고 합니다.
즉 사람이라는 클래스는 눈, 코, 입 등의 속성이 존재하고
객체들은 눈, 코, 입의 생김새가 다르기 때문에 다른 객체로 분류됩니다.
객체 지향 프로그래밍
객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고
각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것입니다.
객체 지향 프로그램은 객체와 객체 간의 연결로 되어 있으며
각각의 객체 안에 자료구조와 알고리즘이 들어가 있습니다.
[ 절차지향과 객체지향 ]
절차 지향 프로그래밍은 개체를 순차적으로 처리하여 프로그램 전체가 유기적으로 연결되어있는 것을 말합니다.
객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고
각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말합니다.
비교적 대형 프로그래밍의 경우 많은 기능을 수반하기 때문에 절차 지향보다는 객체 지향이 적합하고,
소형 프로그래밍의 경우 작은 기능을 수반하기 때문에 객체 지향보다는 절차 지향이 적합합니다.
[ 객체 지향 프로그래밍의 특징 ]
1. 추상화 ( abstraction )
- 공통의 속성이나 기능을 묶는 것
- 객체 지향 관점에서 클래스를 생성하는 것이 추상화
- 사자, 토끼, 호랑이가 있을 때 이것을 객체라 하고 객체들을 동물이나 포유류로 묶는 것을 추상화
2. 캡슐화 ( encapsulation )
- 데이터와, 데이터를 처리하는 행위를 묶는 것
- 함수이름을 sum으로 지정하고, 그 행위를 sum함수에 구현해서 sum함수를 호출할 때 어떻게 구현되는지 모른다
- 구현이 어떻게 되어 있는지 알 수 없기 때문에 정보를 은닉 가능하다
- 코드의 중복을 피하고, 데이터를 처러하는 동작 방식을 외부에서 알 필요가 없다
3. 상속성 ( inheritance )
- 하나의 클래스가 가진 특징을 다른 클래스가 그대로 물려받는 것
- 기존 코드를 재활용해서 사용
- 자동차라는 기름이 필요하고 달리는 기능을 하는 부모클래스가 있다
- 지붕이 열리는 기능을 추가하고 싶으면 기존 자동차에서 스포츠카를 새로 생성한다
4. 다형성 ( polymorphism )
- 다른 방법으로 동작하는 함수를 같은 이름으로 호출하는 것
- 부모 클래스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩 되어 사용되는 것
[ 장단점 ]
- 신뢰성 있는 소프트웨어를 손쉽게 작성할 수 있다.
- 코드를 재사용하기 쉽다.
- 업그레이드가 쉽다.
- 디버깅이 쉽다.
- 실세계에 대한 모델링을 좀 더 쉽게 한다.
- 보안성이 높다.
- 절차지향 프로그래밍에 비해 실행속도가 느리다.
- 필요한 메모리양이 크다.
[ OOP의 5대원칙 ]
OOP의 5대원칙은 SRP, OCP, LSP, ISP, DIP 5가지가 존재하고,
각각의 앞글자를 따서 SOLID법칙 이라고도 합니다.
SRP - 단일 책임 원칙
클래스는 한가지 기능만 가지며 한가지 책임을 수행하는데 집중 되어야 한다.
하나의 클래스에 역할과 책임을 너무 많이 주지 않는다.
클래스에 모든 기능을 다 넣어두지 말고 목적과 취지에 맞게 속성과 Method를 구상함으로 관련 책임만 만드는 것이다.
OCP - 개방 폐쇄 원칙
소프트웨어의 구성요소(클래스, 모듈, 함수 등등..)는 확장에는 열려있고, 변경에는 닫혀있어야 한다.
개방 폐쇄 원칙을 함으로써 객체지향 프로그래밍의 큰 장점인 유연성, 재사용성, 유지보수성을 얻는다.
객체지향 프로그래밍에서 반드시 지켜야 할 원칙이다.
LSP - 리스코프 치환 원칙
사용자의 관점에서 기능에 영향을 미치지 않고 서브클래스를 부모 클래스로 대체 할 수 있어여 한다.
프로젝트에서 추가적인 부분이나 변경되어야 하는 상황에 대해서 많은 부분을 수정해야 하는 상황이 생기지만
LSP가 추구하는 원칙대로만 설계한다면 구현체만 변경함으로써 나머지 부분은 그대로 가져갈 수 있는 장점이 있습니다.
ISP - 인터페이스 분리 원칙
한 클래스에서 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다.
어떤 클래스가 다른 클래스를 상속받았을때 최소한의 인터페이스만을 사용해야합니다.
ISP는 일반적인 한개의 인터페이스보다 구체적인 여러가지의 인터페이스를 구현하는 원칙입니다.
기존 클라이언트에 변화를 주지 않으면서 인터페이스만을 분리하여 구현해야 한다.
그렇게 인터페이스를 분리함으로서 의존성을 약화시켜 리팩토링 및 구조 변경에 용이하게 만들어줍니다.
DIP - 의존 관계 역전 원칙
프로그래머는 추상화에 의존해야하지 구체화에 의존하면 안된다.
DIP는 각각의 Class 또는 모듈 간의 의존성을 끊고 상위 레벨에서 정의한 추상을 하위레벨 모듈이 구현하게 하는 원칙으로 외부에서 의존성을 주입받아 Low Coupling을 만들게 하는게 목표입니다.
이 원칙들을 준수한다면 더 유연해지고 유지 관리가 편해지지만새로운 클래스 구현 및 추상화 측면에서 복잡성이 발생합니다.
'프로그래밍 기초 공부' 카테고리의 다른 글
HTTP란? (2) 2022.09.23 API와 REST API (0) 2022.09.19 JSON과 XML (0) 2022.09.19 interface란 (0) 2022.09.12 git과 git workflow (0) 2022.09.12