객체 지향 프로그래밍(Object - Oriented Programming)OOP는 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
객체는 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장 할 변수와 작업을 수행 할 메소드를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 할 수 있다.
객체지향 프로그래밍을 레고에 빗대 표현 할 수 있는데, 객체가 레고의 조각이 될 것이고 레고의 조각을 조립해서 무언가를 만드는 방식이 객체지향 프로그래밍이라고 할 수 있다.
객체는 또한 레고 조각과도 비슷하게 여러군데에서 재사용 할 수 있는데 이는 부품화 와 재사용성 이라는 객체 지향 프로그래밍의 특징을 보여주기도 한다.
객체 지향 언어 | 절차 지향 언어 | |
---|---|---|
장점 | 코드의 재사용성이 용이하다. 개발이 간단하다. 유지보수가 쉽다. 대규모 프로젝트에 적합하다. | 처리속도가 빠릅니다. 컴퓨터의 처리구조와 비슷해 실행속도가 빠릅니다. |
단점 | 처리속도가 느리다. 객체에 따른 용량이 증가한다. 설계 단계에서 시간이 많이 소요된다. | 유지보수가 힘듭니다. 대규모 프로젝트에 적합하지 않습니다. 프로젝트 분석이 어렵습니다. |
연관있는 변수와 메소드를 묶어주는 작업을 말하며, 클래스의 접근을 제한하는 것과 관계있습니다.
객체 내에서만 접근이 가능하도록(정보 은닉) 해줍니다.
속성과 기능을 정의하는 변수와 메소드를 클래스라는 캡슐에 넣어서 분류하는 것으로 재활용이 원활하다는 장점이 있고 캡슐화를 통해서 정보은닉 을 활용 할 수도 있다. (접근제어자의 활용)
추상화는 객체의 상위개념(예시 오리의 상위개념 동물)에 객체에서 공통된 속성과 행위를 추출하여 타입을 정의하는 과정입니다.
클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것을 말합니다.
어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질입니다.
즉, 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할수 있는 객체 지향의 특성을 의미합니다. 대표적인 예로 우리가 앞서 본 메서드 오버라이딩과 메서드 오버로딩(method overloading)이 있습니다
클래스 단위로 모듈화시켜서 개발하기 때문에 업무 분담이 편리하고 대규모 소프트웨어 개발에 적합하다.
클래스 단위로 수정이 가능하기 때문에 유지 보수가 편리하다.
클래스를 재사용하거나 상속을 통해 확장함으로써 코드 재사용이 용이하다.
처리속도가 상대적으로 느리다.
객체의 수가 많아짐에 따라 용량이 커질 수 있다.
설계시 많은 시간과 노력이 필요하게 될 수 있다.
객체 지향 프로그래밍의 반대는 절차 지향 프로그래밍이다?
객체 지향 프로그래밍은 절차 지향 프로그래밍과 장단점이 겹치는 부분이 있기 때문에 그렇게 생각이 들 수 있다. 하지만 절차지향은 순차적으로 실행에 초점이 되어있고 객체지향은 관계/조직에 초점을 맞추고 있다는 초점의 차이일 뿐이다.
절차적 프로그래밍이라고 해서 객체를 다루지 않는 것이 아니고, 객체지향 프로그래밍이라고해서 절차가 없는 것도 아니다.
객체 지향적으로 설계하기 위해 SOLID 라 불리는 다섯 가지 원칙이 있다.
하나의 클래스는 단 하나의 책임만 가져야 한다.
단일 책임 원칙을 지키지 않을 경우 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈 수 있다.
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
기능을 변경하거나 확장할 수 있으면서 기능을 사용하는 코드는 수정하지 않는다.
프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
범용 인터페이스 하나보다 클라이언트를 위한 여러 개의 인터페이스로 구성하는 것이 좋다.
인터페이스는 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
클라이언트가 필요로 하는 인터페이스로 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 있어도 영향을 받지 않도록 만들어야 한다.
추상화에 의존해야지 구체화에 의존하면 안된다.
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고 저수준 모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화
JONGMINFIRE.DEV - 객체지향 프로그래밍이란?