면접때 객체지향 프로그래밍을 어떻게 생각하는지 말해보라는 질문에 당황했었다.

그냥 객체 하나하나 프로그래밍 한다?. 라고 생각만 가지고 있었고,

따로 머리속에 정의해 놓고 있지 않았다.

그래서 망함... ㅋ

디자인 패턴을 공부하기 앞서 OOP를 정리함.


객체지향 개념

구조적 방법의 문제점을 극복하고, 인간이 사고하는 방식대로 프로그램을 개발하려는 노력으로 부터 탄생

현실 세계에 존재하는 실체 및 개념들을 객체라는 독립된 단위로 구성하고,

객체들이 메시지를 통하여 상호작용함으로써 전체 시스템이 운영되는 개념


객체

객체란 우리가 살아가는 세계에 존재하거나 생각할 수 있는 것을 말함

현실세계에 존재하는 개념들 중 소프트웨어 개발 대상이 되는 것들은 모두 객체라고 할 수 있다


클래스

클래스는 객체를 생성할 수 있는 구조와 정보를 가지는 틀이라고 정의할 수 있다

붕어빵 기계를 클래스라고 하면 이 기계에서 나오는 붕어빵은 객체

클래스는 개념적인 의미이며, 객체는 구체적인 의미

클래스에서 생성된 객체들은 같은 속성과 같은 오퍼레이션(기능)에 대한 정의를 갖음


메시지

객체들 사이의 상호작용 수단이 바로 메시지

메시지는 어떤 한 객체가 다른 객체에게 특정 작업을 요청하는 신호

메시지를 보내는 객체를 송신 객체(Sender)라하고, 메시지를 받아서 동작을 수행하는 객체를 수신 객체(Receiver)라한다.


객체지향 특성

캡슐화

자료와 이자료를 처리하는 오퍼레이션이 한 틀안에서 결합되어 객체라는 단위로 묶여서 사용되는것

객체 외부에서는 객체 내부정보를 직접 접근하거나 조작할 수 없고, 외부에서 접근할수 있도록 정의된 오퍼레이션을 통해서만 관련 데이터에 접근

캡슐화를 통하여 정보은닉이 가능하다

정보은닉은 보다 높은 독립성, 유지보수성 그리고 향상된 이식성을 제공


상속성

객체지향의 기본 개념으로, 프로그램을 쉽게 확장할 수 있도록 도와주는 수단

상위 클래스의 모든 특성을 하위 클래스가 이어받음으로써 이미 정의한 클래스를 재사용하고 확장할 수 있도록 지원하는 개념

상위 클래스의 속성을 상속받아 하위 클래스에서 실체화시키는 관게를 특수화라고 하고,

반대로 하위 클래스의 공통적인 특성을 추상화하여 상위 클래스로 정의하는 것을 일반화라 한다


다형성

여러 클래스에 같은 이름의 함수가 존재하지만 동작은 다르게 수행함을 의미

객체지향 언어에서 메서드 오버라이딩방식으로 구현

상위 클래스에 메서드가 정의되고 그 메서드를 하위 클래스에서 상속받아 그대로 사용할 수 있지만,

하위 클래스의 객체가 다른 방법으로 동작을 해야 하는 경우에는 상속받은 메서드를 같은 이름으로 재정의함으로써

생성된 객체가 상위 클래스의 정의와는 다른 동작을 할 수 있도록 구현


추상화

객체지향의 4가지 특성을 실제로 구현함에 있어서 반드시 알아야 할 것이 추상 클래스(Abstract Class)와 인터페이스(Interface)


- 추상 클래스 -

추상 클래스는 클래스의 명칭과 메서드는 있으나 메서드의 처리 내용은 없다.

상속을 통해서 메서드가 구체화(Implementation)

추상 클래스를 상속받은 하위 클래스에서는 추상적인 기능 구현


- 인터페이스 -

인터페이스는 상수와 추상 메서드만을 가진다.

클래스는 하나의 상위 클래스로서만 상속받을 수 있지만, 인터페이스는 여러 개의 인터페이스로 부터 상속받을 수 있기 때문에 다중상속의 기능 제공


# OOP(Object Oriented Programming)

현실에 있는 모든 객체를 코드로 만들 수 있게 설계되었다.

객체 지향 프로그래밍은 현실에 존재하는 사물과 대상, 그리고 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍이다.


- 객체지향의 원칙 -

하나의 갹체는 하나의 책임을 가진다. 그 하나의 책임에 의해서만 변경된다.

바뀌는 부분은 캡슐화한다.

상속보다는 구성을 활용한다.

구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.


- 디자인 패턴 핵심 정리 -

객체지향 기초지식만 가지고는 훌륭한 객체지향 디자이너가 될 수 없습니다.

훌륭한 객체지향 디자인이라면 재사용성, 확장성, 관리의 용이성을 갖춰야 합니다.

패턴은 훌륭한 객체지향 디자인 품질을 갖추고 있는 시스템을 만드는 방법을 제공해 줍니다.

패턴은 검증 받은 객체지향 경험의 산물입니다.

패턴이 코드를 바로 제공해 주는 것은 아닙니다. 디자인문제에 대한 일반적인 해법을 제공해주죠. 특정 애플리케이션에 패턴을 적용하는 것은 여러분이 해야 할 일입니다.

많은 경우에 시스템에서 바뀌는 부분을 골라내서 캡슐화시켜야 합니다.

패턴은 다른 개발자들과의 의사소통의 가치를 극대화시킬 수 있는 전문 용어 역할을 합니다.



공부할 책 : Head First Design Patterns (스토리가 있는 패턴 학습법)에 잘 정리됨.

반응형