본문 바로가기
컴퓨터 과학

객체지향 프로그래밍 (Object-Oriented Programming, OOP)

by 문_지기 2024. 1. 31.

1. 개요:
객체지향 프로그래밍은 소프트웨어 개발 패러다임 중 하나로, 현실 세계의 객체(Object)와 그 객체 간의 상호 작용에 중점을 둔 프로그래밍 방법론입니다. 이는 코드의 재사용성, 유지보수성, 확장성을 향상하게 시키며, 복잡한 소프트웨어 시스템을 구축하는 데에 적합한 방법론으로 인정받고 있습니다.

2. 객체와 클래스:

객체(Object): 현실 세계에서 존재하는 실체로, 속성(Attributes)과 행위(Methods)를 가지고 있는 개념입니다. 예를 들어, 자동차, 동물, 사람 등이 객체가 될 수 있습니다.
클래스(Class): 객체를 생성하기 위한 틀이며, 객체의 속성과 행위를 정의하는 설계도입니다. 클래스는 객체를 생성하기 위한 일종의 템플릿이며, 객체의 타입을 정의합니다.
3. 캡슐화(Encapsulation):
객체지향 프로그래밍에서는 캡슐화를 통해 객체의 상태(속성)와 행위(메서도)를 하나로 묶어 정보 은닉을 구현합니다. 객체의 내부 구현은 외부에서 직접 접근할 수 없으며, 특정 인터페이스를 통해서만 상호 작용이 가능합니다. 이는 객체의 내부를 보호하여 안정성과 보안성을 높이는 데에 도움이 됩니다.

4. 상속성(Inheritance):
상속성은 기존 클래스의 속성과 머세드를 다른 클래스에서 재사용하거나 확장할 수 있게 해주는 개념입니다. 부모 클래스(상위 클래스)의 특징을 자식 클래스(하위 클래스)가 물려받아 사용할 수 있고, 이를 통해 코드의 재사용성을 높이고 소프트웨어의 확장성을 증진합니다.

5. 다형성(Polymorphism):
다형성은 하나의 인터페이스나 머세드가 다양한 형태로 동작할 수 있는 특성입니다. 이는 머세드 오버 로딩, 머세드 오버 주행을 통해 구현됩니다. 다형성은 코드의 가독성을 높이고, 유연성을 제공하여 다양한 객체들을 일관적으로 처리할 수 있게 합니다.

6. 객체지향 설계 원칙:

단일 책임 원칙(Single Responsibility Principle, SRP): 클래스는 하나의 책임만 가져야 하며, 변경 이유는 하나여야 합니다.
개방-폐쇄 원칙(Open-Closed Principle, OCP): 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하고, 변경에는 폐쇄적이어야 합니다.
리 스코프 치환 원칙(Liskov Substitution Principle, LSP): 어떤 타입의 객체든지 해당 타입의 하위 타입으로 교체할 수 있어야 합니다.
인터페이스 분리 원칙(Interface Segregation Principle, ISP): 클라이언트는 자신이 사용하지 않는 체계에 의존 관계를 맺으면 안 됩니다.
의존 역전 원칙(Dependency Inversion Principle, DIP): 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 합니다.
7. 장점:

재사용성(Re usability): 코드의 재사용성이 높아지며, 유지보수가 용이합니다.
유연성(Flexibility): 변경이 쉽고, 새로운 기능 추가가 용이합니다.
가독성(Readability): 객체지향 코드는 현실 세계와 유사하여 가독성이 뛰어나고 이해하기 쉽습니다.
8. 단점:

성능 부하: 일부 프로그래머들은 객체지향 프로그래밍이 성능 부하를 일으킬 수 있다고 주장합니다.
배우기 어려움: 초보자에게는 학습 곡선이 높을 수 있습니다.
메모리 사용량: 객체의 생성 및 유지에 따른 메모리 사용량이 증가할 수 있습니다.

객체지향 프로그래밍은 현실 세계의 모형화를 통해 소프트웨어를 개발하는 데에 있어 효율적이고 유지보수가 쉬운 방법론입니다. 캡슐화, 상속성, 다형성 등의 개념을 적절히 활용하여 소프트웨어의 품질을 향상하고, 복잡한 시스템을 더욱 효율적으로 구축할 수 있습니다.

객체지향 프로그래밍(OOP)은 소프트웨어를 현실 세계의 객체와 그 객체 간의 상호 작용으로 모형화하는 프로그래밍 패러다임입니다. 이러한 접근 방식은 코드의 재사용성, 유지보수성, 확장성을 강화하며, 각 객체는 데이터와 관련 기능을 캡슐화하여 시스템을 보다 모듈화하고 이해하게 쉽게 만듭니다. 클래스와 객체, 캡슐화, 상속성, 다형성 등의 개념을 기반으로 하는 OOP는 효율적인 소프트웨어 개발과 유연한 코드 구조를 지향하여 다양한 언어에서 활용되고 있습니다.