[CS] 객체지향이란?

do_large·2020년 11월 24일
0

cs

목록 보기
6/9
post-thumbnail

1. 객체지향 프로그래밍란?

객체
컴퓨터 과학에서 객체(object)는 물리적으로 존재하거나 추상적으로 생각할수 있는 것 중에서 자신의 속성을 가지고 있고 다른것과 식별 가능한것을 말한다.
_
객체 모델링
현실세계의 객체를 소프트웨어 객체로 설계하는 것
즉, 현실 객체의 속성과 동작을 추려내서 소프트웨어 객체의 필드와 메서드로 정의하는 과정이라고 할 수 있다.

OOP(Object Oriented Programming)

실제 세계를 모델링하여 '객체'들의 상호작용으로 서술하는 프로그래밍 기법

  • 인간 중심적 프로그래밍 패러다임
  • 프로그램을 객체단위로 나누어 이들이 연결되도록 함
  • 객체의 핵심은 기능제공

2. 객체지향의 4가지 특징

1) 추상화(Abstraction)

객체의 공통적인 속성과 기능을 추출하여 정의하는 것

  • 현실세계의 사물을 객체로 보고 필요한 공통특성만 다루어 현실의 복잡성을 제거하고 목적에 집중할수 있도록 함
  • 토끼, 강아지, 사자 등을 포유류로 추상화

2) 캡슐화(Encapsulation)

  • 객체 수행 목적에 따라 데이터 구조 및 처리방법(객체의 필드 및 메서드)을 결합시켜 묶어서, 외부에 내부기능구현내용을 감추고 이용방법만 알려줌
  • 외부객체는 객체내부의 구조를 알지 못하며, 객체가 노출해서 제공하는 필드와 메서드만 이용할수 있음
  • 캡슐화를 하는 이유

캡슐화에서 중요한 키워드 ☆☆☆은닉화☆☆☆

은닉화란?

  • 외부로부터 객체 내부에 대한 접근을 제한하기 위해 은닉 혹은 격리시키는것
  • 내부의 중요사항이 외부에 노출되지 않도록 막음
  • 캡슐화의 한 개념으로 더 구체적인 개념
  • 변수의 접근제한자를 private로 지정하고 setter, getter로 접근, 제어함

결론적으로 은닉화된 상태에서 외부에서 기능을 사용할수 있게 제공하고 책임짐

3) 상속(Inheritance)

상위 개념의 특징을 하위 개념이 물려받아 사용하는것

  • 재사용으로 인해 코드의 길이가 줄어든다
  • 상속은 코드의 재사용관점이 아닌 기능의 확장개념으로 생각해야함

4) 다형성(Polymorphism)

상속과 연관있는 개념으로 한 객체가 다른 여러형태(객체)로 재구성되는것

  • 오버라이딩
    : 상속받은 자식클래스에서 부모클래스의 (추상)메서드의 내부로직을 재작성한다. 부모클래스의 외부구현내용(메소드명, 반환타입, 매개변수)은 그대로 유지한다

  • 오버로딩
    : 하나의 클래스에서 같은 이름을 가진 오퍼레이션을 여러개 정의할수 있다. 하지만 매개변수는 무조건 달라야하고, 반환타입은 매개변수가 다르다면 아무상관없다.

3. 장점

1 ) 재사용성 : 상속을 통해 프로그래밍시 코드의 재사용성을 높일수 있음
2) 생산성 향상 : 잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬수 있음
3) 자연적인 모델링 : 일상생활 모습의 구조가 객체에 자연스럽게 녹아들어있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할수 있음
4) 유지보수의 우수성 : 기존 기능을 수정 시 함수를 새롭게 바꾸더라도 캡슐화와 그 함수의 세부정보가 은폐되어 있어 주변에 미치는 영향을 최소화 함. 새로운 객체의 종류를 추가 시에는 상속을 통하여 기존의기능을 활용하고 존재하지 않은 새로운 속성만 추가하면 되므로 매우 경제적임.

4. 단점

1) 많은 오버헤드가 발생 가능성: 객체간의 정보교환이 모두 메시지 교환을 통해 일어나기 때문.

오버헤드란?
어떤 처리를 하기위해 소모되는 간접적인 처리 시간, 메모리 등

2) 상태를 가지는 객체로 인한 버그 발생 가능성 : 내부 변수로 인해 객체가 예측할 수 없는 상태를 갖게되기 때문.

5. OOP 5대 원칙:SOLID

1) SRP(Single Responsibility Principle) : 단일 책임 원칙

클래스는 단 하나의 책임을 가져야 하며, 클래스를 변경하는 이유는 단 하나여야 함.

  • 변화에 대한 유연성 확보
  • 낮은 결합도, 높은 응집도 추구

2) OCP(Open-Closed Principle) : 개방-폐쇄 원칙

  • 모듈은 확장에는 열려있어야 하고, 변경에는 닫혀있어야 한다
  • 기능을 변경 또는 확장할 수 있으면서 그 기능을 사용하는 코드는 수정하지 않아야 한다.

3) LSP(Likov Substitution Principle) : 리스코프 치환 원칙

상위타입의 객체를 하위타입의 객체로 치환해도 상위타입을 사용하는 프로그램은 정상적으로 동작해야함.

  • B가 A의 자식 타입이면 부모 타입인 A 객체는 자식 타입인 B로 치환해도, 작동에 문제가 없어야 한다
  • 부모 클래스 타입인 A를 사용하는 기존의 프로그램 코드가 자식 클래스 B로 대입 시켰을 때도 문제 없이 작동하도록 하기 위해서,
    자식 클래스는 부모 클래스가 따르던 계약 사항을 자식도 따라야한다

4) ISP(Interface Segregation Principle) : 인터페이스 분리 원칙

  • 어떤 클래스를 인터페이스를 사용하여 구현할 때 사용하지 않는 메소드를 가지고 있는 인터페이스에 의존하게 하지 말아야 함
  • 클래스가 사용하는 기능만 제공하도록 인터페이스를 분리하는 것
  • 하나의 일반적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 나음

5) DIP(Dependency Inversion Principle) : 의존 역전 원칙

  • 의존관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것 보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 원칙
  • 상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높기에 하위 클래스나 구체 클래스가 아닌 상위클래스, 인터페이스, 추상 클래스를 통해 의존하라는 것

참고사이트
https://mizzo-dev.tistory.com/entry/OOP
http://wonwoo.ml/index.php/post/1780

0개의 댓글