레이블이 Object-Oriented Programming인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Object-Oriented Programming인 게시물을 표시합니다. 모든 게시물 표시

객체 지향 목적 및 특성

객체 지향에서 객체에 대한 내용을 앞에서 알아보았다.
이제 객체 지향의 목적과 특성은 무엇인지 알아보자.
객체 지향의 목적을 알기 위해서는 우선 특성에 대해서 얘기해보겠다.
객체 지향의 특성으로 크게 3가지로 예를 들 수 있다. 첫 번째는 자료 추상화(Data Abstraction), 두 번째는 상속성(Inheritance), 마지막 세 번째는 다형성(Polymorphism) 이다.
각 특성을 정리하면 아래와 같다.
  1. 자료 추상화 (Data Abstraction)
    • 자료 구조와 함께 그에 해당하는 연산들을 정의
    • 기본형 처럼 프로그래머가 사용
    • 재 사용할 수 있는 소프트웨어 부품화
    • 정보 은닉화
    • 언어의 확장성 증가
  2. 상속성 (Inheritance)
    • Super Class 의 모든 속성이 Sub Class 로 전달되는 기능
    • 클래스의 재 사용성을 증가 시킨다.
  3. 다형성 (Polymorphism)
    • 여러 개의 형태를 갖는다.
    • 다형성은 두 가지가 적용된 형태로 볼 수 있는데 오버로딩과 오버라이딩이다.
    • 오버로딩은 다른 용도로 다시 중복 정의하여 사용 -> 추상 클래스의 추상 메소드를 사용
    • 오버라이딩은 상위 클래스에서 정의된 함수를 무시하고 하위 클래스에서 재 정의해서 사용 -> 추상 클래스 뿐만 아니라 일반 클래스의 메소드를 사용
객체 지향의 특성에 대해서 알아봤다. 이를 통해서 객체 지향 프로그램의 목적은 아래와 같다.
  1. 구현된 코드를 다른 곳에서 재 사용할 수 있도록 한다.
  2. 추상화를 통하여 외부에서는 구현된 코드의 정보를 숨기도록 한다.
  3. 개발 보다 유지 보수에 치중을 두어서 프로그래밍 한다.

객체지향에서 객체란?

객체 지향 언어다, 객체 지향 기법이다. 등 객체 지향에 대한 이야기는 많이 들었을 것이다. 그러나 객체 지향이 무엇인가? 의문을 가질 것이다.
먼저, 객체 지향을 이해하기 위해선 무엇이 객체인지를 먼저 집고 넘어가자. 
객체의 정의는 실 세계에서 존재하거나 생각할 수 있는 것을 통틀어서 이야기한다. 가령, 책상, 의자, 자동차 뿐만 아니라, 수강 신청, 수업 등 모두 객체가 될 수 있다.

위 그림은 객체의 예를 그림으로 나타낸 것이다. 
이제 각 관점에서 객체를 이해해보자.
  1. 모델링 관점에서는 명확한 의미를 담고 있는 대상 또는 개념
  2. 프로그래머 관점에서는 클래스에서 생성된 변수
  3. 소프트웨어 개발 관점에서는 객체의 상태를 나타내는 데이터와 그 데이터를 처리하거나 참조하는 메소드(함수)인 데이터 + 메소드 의 형태
  4. 객체지향 프로그래밍 관점에서는 소프트웨어 관점에서 본 데이터를 속성으로 변경하여 속성과 메소드 형태로 구현
먼저 모델링 관점에서는 명확한 의미를 담고 있는 대상 또는 개념으로 이해를 하기 때문에 앞서 설명했던 것에서 대상으로는 책상, 의자, 자동차 등을 개념으로는 수강 신청이나 수업 등을 예로 들어서 이해할 수 있다.
프로그래머 관점에서 보면, 클래스에서 생성된 변수라는 개념에서 생소한 클래스에 대해서 간단히 알아보자.
클래스의 개념은 공통되는 것들을 묶어서 대표적인 이름을 붙인 것으로 예를 들면 아래 표로 이해할 수 있겠다.

클래스객체
자동차 아반떼,K3,SM3,크루즈
스마트폰 갤럭시S8,G6,iPhone
도형 삼각형,사각형,원

그럼 반대로 클래스인 자동차를 아반떼나 K3 등으로 스마트폰을 갤럭시S8이나 G6 등 클래스를 객체로 구체화 시키는 것을 무엇이라고 할까?
이를 인스턴스 라고 하며, 클래스인 자동차를 구체화 된 객체인 아반떼 로 구체화를 시키거나 스마트폰에서 갤럭시S8를 도형에서 삼각형으로 구체화 시킨 것을 의미한다.
아래 그림은 도형 클래스를 삼각형으로 인스턴스한 것을 나타낸 것이다.


이어서 소프트웨어 관점에서의 객체는 프로그래머의 관점에서 본 클래스 내에 정의된 데이터와 메소드를 정의하는 것으로 이해하면 되고, 객체지향 프로그래밍 관점에서도  클래스 내에 속성과 메소드가 정의하는  것으로 이해하면 될 것이다.
이상으로 객체 지향을 이해하는데 필요한 객체에 대해서 알아보았다.

객체 지향 원칙


  1. 바뀌는 부분은 캡슐화 한다.
  2. 상속보다는 구성을 활용한다.
  3. 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
  4. 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야한다.
  5. 클래스는 확장에 대해서는 열려있지만, 변경에 대해서는 닫혀있어야 한다. (Open-Close Principle)
  6. 추상화 된 것에 의존하라. 구상 클래스에 의존하지 않도록 한다.
  7. 친한 친구들 하고만 이야기 한다.
  8. 먼저 연락하지 마세요. 저희가 연락 드리겠습니다.
  9. 어떤 클래스가 바뀌게 되는 이유는 한 가지 뿐 이어야 한다.
[출처] Head First Design Patterns - 스토리가 있는 패턴 학습법