1. OOP란?
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 객체(object)를 기반으로 프로그램을 작성하는 방법입니다. 객체는 데이터와 이를 처리하는 메서드(method)의 묶음으로 구성되며, 객체 간의 상호작용을 통해 프로그램이 동작합니다.
객체 지향 프로그래밍은 현실 세계의 객체를 모델링하는 방식으로, 객체를 중심으로 코드를 구성하고 관리하는 방법을 제공합니다. 객체는 속성(attribute)과 행위(behavior)를 가지며, 속성은 객체의 상태를 나타내고, 행위는 객체가 수행하는 작업을 나타냅니다. 예를 들어, '자동차'라는 객체는 '속도', '연비', '색상' 등의 속성과 '전진', '후진', '정지' 등의 행위를 가지고 있습니다.
객체 지향 프로그래밍의 주요한 특징은 상속(inheritance), 다형성(polymorphism), 캡슐화(encapsulation)입니다. 상속은 기존의 클래스를 확장하여 새로운 클래스를 만들 수 있도록 해주며, 다형성은 같은 이름의 메서드가 서로 다른 객체에서 다른 동작을 수행할 수 있도록 해줍니다. 캡슐화는 객체의 속성과 메서드를 외부에서 직접 접근하지 못하도록 보호하는 것을 의미합니다.
객체 지향 프로그래밍은 코드의 재사용성과 확장성을 높일 수 있어 대규모 프로그램을 작성하는 데 매우 유용합니다. 또한 객체 지향 프로그래밍은 객체 간의 관계를 명확하게 표현하고, 디버깅과 유지보수가 쉬우며, 코드의 가독성을 높일 수 있어 프로그래밍의 생산성을 향상시킵니다.
2. 배경
객체 지향 프로그래밍이 개발된 배경에는 여러 가지 요인이 있습니다.
먼저, 기존의 프로그래밍 패러다임인 절차적 프로그래밍(procedural programming)은 프로그램의 구조와 데이터를 분리시키는 방식으로, 프로그램의 복잡성이 증가할수록 코드의 유지보수가 어려워지는 문제가 있었습니다. 이에 대한 해결책으로 객체 지향 프로그래밍은 데이터와 프로그램의 구조를 하나로 묶어서 관리하고, 코드의 재사용성과 유지보수성을 향상시키는 방식으로 발전하게 되었습니다.
또한, 프로그램의 규모가 커짐에 따라 소프트웨어의 신뢰성과 안정성이 중요한 이슈가 되면서, 객체 지향 프로그래밍에서 제공하는 캡슐화와 추상화 등의 개념이 소프트웨어의 품질을 향상시키는데 큰 역할을 했습니다.
또한, 객체 지향 프로그래밍은 현실 세계의 문제를 컴퓨터로 모델링하는 방식으로, 문제 해결에 대한 이해도와 코드의 가독성을 높일 수 있는 장점을 가지고 있습니다.
따라서, 객체 지향 프로그래밍은 기존의 프로그래밍 패러다임의 한계를 극복하고, 소프트웨어의 품질과 생산성을 높일 수 있는 혁신적인 방법론으로 개발되었습니다.
3.요소
객체지향 프로그래밍은 기존의 절차지향 프로그래밍(Procedural Programming)과는 다른 방식으로 코드를 구성합니다. 절차지향 프로그래밍은 문제를 해결하기 위해 일련의 절차를 단계별로 나누고, 각 단계를 함수로 구현하여 실행하는 방식입니다. 이와는 달리, 객체지향 프로그래밍에서는 문제를 해결하기 위해 객체를 생성하고, 객체 간의 상호작용을 통해 해결합니다.
객체지향 프로그래밍에서는 다음과 같은 개념들이 중요합니다.
- 캡슐화(Encapsulation): 객체의 속성과 메서드를 외부에서 직접 접근할 수 없도록 보호하는 개념입니다. 객체를 사용할 때는 객체의 메서드를 호출하여 원하는 작업을 수행합니다. 이를 통해 객체의 내부 구현 방식을 숨길 수 있고, 객체를 더 안전하게 사용할 수 있습니다.
- 상속(Inheritance): 이미 정의된 클래스의 특성을 그대로 물려받아 새로운 클래스를 만드는 개념입니다. 부모 클래스의 특성을 그대로 물려받아 새로운 클래스를 만들 수 있기 때문에 코드의 재사용성이 높아지며, 새로운 클래스를 만들 때 기존의 코드를 수정하는 것보다는 간편하게 새로운 클래스를 만들 수 있습니다.
- 다형성(Polymorphism): 같은 이름의 메서드를 다양한 방식으로 구현하는 개념입니다. 다형성을 사용하면 같은 이름의 메서드를 호출하지만, 실제로 실행되는 메서드는 호출한 객체의 클래스에 따라 달라집니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있습니다.
객체지향 프로그래밍은 대규모 프로그램 개발에서 특히 유용합니다. 객체지향 프로그래밍으로 설계된 프로그램은 각 객체가 독립적으로 작동하기 때문에, 여러 명의 개발자가 동시에 작업할 수 있고, 코드의 수정이나 유지보수가 용이합니다. 또한 객체지향 프로그래밍은 소프트웨어 개발에서 모듈화와 추상화를 적용할 수 있어, 소프트웨어의 구조를 명확하게 이해하고 구현할 수 있도록 도와줍니다.
4.SOLID
객체 지향 프로그래밍(OOP)의 다섯 가지 기본 원칙은 SOLID라는 약어로 정리됩니다. 각 원칙은 소프트웨어 설계 및 유지보수를 쉽고 유연하게 만드는데 도움이 됩니다.
1.SRP (Single Responsibility Principle, 단일 책임 원칙)
각 클래스는 한 가지 책임만 가지도록 설계해야 합니다. 이것은 클래스가 변경될 경우 다른 책임을 가진 클래스에 영향을 미치지 않도록 하는 것을 의미합니다.
2.OCP (Open-Closed Principle, 개방-폐쇄 원칙)
소프트웨어의 구성요소는 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 합니다. 즉, 새로운 요구사항이나 기능이 추가되더라도 기존 코드를 변경하지 않고도 쉽게 대응할 수 있어야 한다는 것을 의미합니다.
3.LSP (Liskov Substitution Principle, 리스코프 치환 원칙)
서브 타입은 언제나 자신의 기반 타입으로 대체될 수 있어야 합니다. 이것은 하위 클래스가 상위 클래스와 동일하게 작동해야 함을 의미합니다.
4.ISP (Interface Segregation Principle, 인터페이스 분리 원칙)
클라이언트는 사용하지 않는 메서드에 의존하지 않아야 합니다. 즉, 한 인터페이스에서 많은 기능을 정의하는 대신 작은 인터페이스 여러 개를 정의하는 것이 더 나은 설계입니다.
5.DIP (Dependency Inversion Principle, 의존성 역전 원칙)
추상화에 의존해야 하며 구체화에는 의존하지 않아야 합니다. 즉, 상위 모듈은 하위 모듈에 의존해서는 안 되며, 추상화된 것은 구체적인 것에 의존해서는 안 된다는 것을 의미합니다.
'CS > 개발지식' 카테고리의 다른 글
[CS] 개발자 기술면접 질문 정리 - DB (1) | 2023.11.05 |
---|---|
[CS] 개발자 기술면접 질문 정리 - Java (1) | 2023.11.04 |
[CS] 클래스, 인터페이스 (0) | 2023.03.23 |