등장 배경
초기 프로그래밍은 주로 절차적 방식으로 이루어졌습니다. 이는 입력을 받아 명시된 순서대로 처리하고 결과를 내는 방식이었는데, 주요한 관심사는 프로그램의 논리적 구성과 실행 순서였습니다. 하지만, 프로그램이 복잡해질수록 관리하기 어려운 스파게티 코드가 만들어지는 문제가 있었습니다. 복잡성이 증가함에 따라 기존의 절차적 프로그래밍으로는 한계에 부딪혔습니다.
이에 대한 대안으로 구조적 프로그래밍이 등장했습니다. 이 방식은 프로그램을 여러 함수 단위로 나누어 각 함수가 서로를 호출하는 형태였습니다. 큰 문제를 작은 함수로 쪼개 해결하는 탑-다운(하향식) 접근 방식이었죠.
그러나 구조적 프로그래밍도 데이터를 효과적으로 구조화하는 데에는 한계가 있었습니다. 전역 네임스페이스의 과부하 문제, 특히 GUI 프로그램에서의 실행 컨텍스트 저장 문제 등이 있었습니다.
이러한 문제를 해결하기 위해 객체지향 프로그래밍(OOP)이 등장했습니다. OOP는 큰 문제를 작은 부분으로 나누는 것이 아니라, 작은 문제들을 해결할 수 있는 객체들을 먼저 만들고 이를 조합하여 큰 문제를 해결하는 상향식(Bottom-up) 접근법을 채택했습니다. 객체를 독립적이고 신뢰성 있게 만들어 재사용성을 높이고 개발 기간 및 비용을 줄이는 효과를 가져왔습니다.
객체 지향 프로그래밍(OOP)
객체 지향 프로그래밍(OOP)은 컴퓨터 프로그램을 단순한 명령어의 집합으로 보는 것이 아닌, 여러 독립적인 객체들이 서로 유기적으로 협력하고 결합하여 프로그램을 구성하는 프로그래밍 패러다임입니다.
이는 마치 자동차가 수많은 부품들이 모여 하나의 완전한 구조를 이루는 것과 유사합니다. 객체 지향적인 소프트웨어 설계는 프로그램의 각 부분을 작은 객체로 만들고, 이 객체들을 조합하여 완성된 프로그램을 구축하는 방식을 의미합니다. 이러한 방식에서는 프로그램을 이루는 각 객체들의 역할과 상호작용이 중요합니다.
객체
객체 지향 프로그래밍에서 객체는 가장 기본적인 단위이자 출발점입니다. 객체 지향의 기본 전제는 실제 세계가 다양한 객체로 구성되어 있고, 모든 현상과 사건은 이러한 객체들 간의 상호작용을 통해 발생한다는 것입니다.
그렇다면 객체는 구체적으로 무엇을 의미할까요? 우리 주변을 둘러보면 책상, 의자, 시계, 전등, 책 등과 같은 구체적인 사물들이 보일 것입니다. 객체 지향 프로그래밍에서는 이런 실체가 있는 모든 대상들을 '객체'로 간주합니다.
하지만 객체의 범위는 유형의 대상에만 국한되지 않습니다. 눈에 보이지 않는 논리, 사상, 철학, 개념, 공식 등 무형의 대상도 객체에 포함될 수 있습니다. 간단히 말해, 객체는 우리가 보고, 느끼고, 인지할 수 있는 모든 것을 포함합니다.
public class Pizza
{
private float _salt;
private float _cheese;
private int _onion;
private int _mushroom;
private int _salami;
private int _tomato;
private int _potato;
public Pizza(float salt, float cheese, int onion, int mushroom, int salami, int tomato, int potato)
{
_salt = salt;
_cheese = cheese;
_onion = onion;
_mushroom = mushroom;
_salami = salami;
_tomato = tomato;
_potato = potato;
}
public void Print()
{
Console.WriteLine("===만든 피자 재료===");
Console.WriteLine($"소금 : {_salt}g | 치즈 : {_cheese}g | 양파 : {_onion}개 | 버섯 : {_mushroom}개 | 햄 : {_salami}개 | 토마토 : {_tomato}개 | 감자 : {_potato}개 ");
}
}
객체 지향 프로그래밍에서는 이러한 각 객체를 추상화하여 속성(상태, state)과 기능(행동, behavior)으로 분류합니다. 이후 이들을 변수(variable)와 함수(function)로 정의하여 프로그래밍에 활용합니다. 이런 방식으로, 프로그램은 실제 세계의 다양한 객체들을 모델링하고, 그 객체들 간의 상호작용을 통해 복잡한 기능과 프로세스를 구현할 수 있게 됩니다.
객체 지향 프로그래밍의 4대 특징
추상화(Abstraction)
- 객체들의 공통된 속성과 행위를 추출하는 과정입니다.
- 불필요한 정보는 숨기고 중요한 정보만을 표현하여 프로그램을 단순화합니다.
- 예를 들어, 아우디, 니싼, 볼보는 모두 '자동차'라는 추상적 개념에 해당됩니다. 추상화를 통해 '자동차'라는 클래스를 만들고, 자동차가 가진 공통적인 특징을 정의할 수 있습니다.
캡슐화(Encapsulation)
- 데이터 구조와 데이터를 처리하는 방법들을 함께 묶는 것을 의미합니다.
- 클래스 내의 변수와 함수를 하나로 묶어 관리합니다.
- 캡슐화를 통해 정보 은닉이 가능하며, 이는 재사용이 가능하고 낮은 결합도를 유지하는 데 도움이 됩니다.
상속(Inheritance)
- 클래스의 속성과 행위를 다른 클래스가 물려받는 것입니다.
- 코드 재사용성 증가, 범용성 확보 등의 장점이 있으며, 단점으로는 상위 클래스 변경의 어려움, 불필요한 클래스 증가 가능성 등이 있습니다.
다형성(Polymorphism)
- 하나의 변수나 함수가 상황에 따라 다양한 의미를 가질 수 있음을 의미합니다.
- 오버라이딩(Overriding): 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것
- 오버로딩(Overloading): 같은 이름의 메서드가 매개변수의 종류나 개수에 따라 다른 기능을 하는 것
객체지향 프로그래밍의 장•단점
장점
- 코드 재사용 용이: 다른 개발자가 만든 클래스를 가져와 사용할 수 있고, 상속을 통해 새로운 기능을 추가하여 확장 사용할 수 있습니다.
- 유지보수 용이: 절차 지향 프로그래밍에서는 코드 수정 시 일일이 찾아 수정해야 하지만, 객체 지향 프로그래밍에서는 클래스 내의 멤버 변수나 메서드를 수정하는 것만으로도 충분합니다.
- 대형 프로젝트에 적합: 클래스 단위로 모듈화가 가능하여, 많은 사람들이 참여하는 대형 프로젝트에서 업무 분담과 협업이 용이합니다.
단점
- 처리 속도 저하: 객체 지향 프로그래밍은 절차 지향 프로그래밍에 비해 처리 속도가 상대적으로 느릴 수 있습니다.
- 메모리 사용량 증가: 많은 객체를 사용하게 되면 프로그램의 용량이 커질 수 있습니다.
- 설계에 시간 및 노력 요구: 객체 지향적 설계는 초기 설계 단계에서 많은 시간과 노력이 필요합니다.
'프로그래밍 이론' 카테고리의 다른 글
[SWF] 객체 지향 설계 원칙(SOLID) (0) | 2024.04.05 |
---|---|
[SDM] CBD 방법론( Component Based Developement) (0) | 2024.04.04 |