개발/[Basic]

[Basic] 객체 지향 특성

바켱서 2020. 6. 10. 17:19

객체 지향 프로그래밍(OOP : Object Oriented Programming)의 특성

1. 추상화 ( Abstaction ) 

 어떤 것을 필요로 하는 속성이나 행동을 추출하는 작업

  • 사물들의 공통적인 특징, 즉 추상적인 특징을 파악해 인식의 대상으로 삼는 행위를 말한다.
  • 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(클래스)로 다룬다.

위의 그림은 <한국어인은 한국어 속성> 외국인도 한국어를 할 수 있는 것을 제외 했다.                                  출처 : http://www.omnibuscode.com/board/board_engineering/7132                                                      

 -> 각 객체의 구체적인 개념에 의존하지 않고 추상적인 개념에 의존해야만 설계를 유연하게 할 수 있다.

 

2. 캡슐화 ( Encapsulation )

캡슐화는 정보 은닉을 통해 낮은 결합도와 높은 응집도를 갖도록 한다.

  • 정보 은닉
    • 필요가 없는 정보는 외부에서 접근하지 못하도록 한다. (prviate)
  • private VS public 사용법
    • private 
      • 변하기 쉬운 것은 감추자.외부에서 변해도 영향을 안받는다.
      • Field, 자료구조들
    • public
      • 변하기 어려운 것들은 드러내자.변하기 어려우니까 외부에서 사용하지만 변경될 일이 적음
      • private를 변경하거나 얻을 수 있는 메소드들 , ETC..

3. 일반화 관계 ( Generalization )

여러 객체들이 가진 공통된 특성을 부각시켜 하나의 개념으로 성립시키는 과정

  • 일반화는 OOP 관점에서 "상속 관계" 라 한다.
  • 속성이나 기능의 재사용만 강조해서 사용하는 경우가 많다.

일반화 VS 추상화

일반화: 여러가지 객체로 부터 공통된 점을 추출하여 새로운 객체를 만들어 내는 것. 예를 들어 남학생과 여학생을 일반화 한다면 학생 이라는 개념으로 일반화 시킬 수 있다.


추상화: 어떤 실제 객체로 부터 관심이 있는 부분만을 추출하고 나머지 부분은 무시하는 것(또는 숨기는 것). 대표적인 추상화의 예로 지하철 노선도를 들 수 있다. 지하철 노선도는 실제 지하철 노선 지도로 부터 각 지하철역의 위치 관계만을 추출한 것이다.

출처: http://egloos.zum.com/coart/v/725809

일반화는 또 다른 캡슐화?


출처 : https://gmlwjd9405.github.io/2018/07/05/oop-features.html

일반화 관계와 위임( Delegation )

  • 어떤 클래스의 일부 기능만 재사용 하고 싶다면 위임 ( Delegation ) 을 사용하라.
    • 자신이 직접 기능을 실행하지 않고 다른 클래스의 객체가 기능을 실행하도록 위임하는 것.
    • 일반화 관계는 클래스 사이의 관계이지만 위임은 객체 사이의 관계 이다.
      • 위임을 쓰는 방법 ( 간단하게 생각하자! 객체 사이의 관계라 하였다! )
        • 1. Extends를 지우고 부모 클래스 였었던 즉, 사용할 클래스를 인스턴스화 하자!
          •  Ex) Stack<String> instance = new Stack<>();
        • 2. 자신의 메서드에서 부모 클래스로 사용했던 메소드가 있다면 모두 instance로 참조하자!
          • Ex) instance.add("add");
        • 3. 공통적으로 가지고 싶은 메서드를 추가(위임) 해주자!

4. 다형성 ( Polymorphism )

다형성은 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력이다.

  • 오버라이딩 
  • 오버로딩
  • 다형적 변수

 

참고문헌

https://gmlwjd9405.github.io/2018/07/05/oop-features.html