본문 바로가기
IT의 모든것/소프트웨어공학

(소프트웨어공학) 객체지향 프로그래밍 구성요소

by coldbrew_ 2023. 6. 15.

객체지향의 정의

  • 실세계의 개체(Entity)를 속성(Attribute)과 메소드(Method)로 결합한 객체(Object)로 표현하는 개념
  • 프로그램을 객체라는 기본 단위로 분할하고 객체들의 상호작용을 통해 서술하는 방식

객체지향의 등장배경

개발 측면 - 전통적인 개발 방법론의 문제점 극복
  - 저품질, 고위험요소로 인한 개발 생산성 저하
  - 소프트웨어 위기를 해결하기 위한 필요성 증대
  - 재사용성과 확장성의 필요성
사용자 측면 - 사용자들의 욕구 증대
  - 더 많은 기능, 단순성, 사용 편의성 요구
소프트웨어 위기 극복 - 낮은 생산성, 납기 지연과 경영 환경의 변화
규칙 혼선 발생 - 사용자 요구사항 조사시 명확한 요구사항 제시 부족
  - 짧은 개발 주기와 더 많은 융통성을 원하는 사용자
  - 초기 요구사항에 대한 반영이 부족
위험관리 실패 가능성 증가 - 전통적인 Waterfall 방법은 문제 발견이 늦어질 수 있음
소프트웨어 복잡성 증가 - 시스템의 규모가 커지면서 전체 이해가 어려워짐
  - 소프트웨어는 계속 진화하며 확장됨

객체지향의 구성요소

클래스(Class) - 공통적인 속성(Attribute)과 행위(Method)를 추상화한 자료형
  - 객체를 생성하는 구조와 정보를 가지고 있는 틀
  - 재사용 가능하며, 외부 클래스와 독립적으로 설계
객체(Object) - 문제 영역에서 잘 정의된 역할을 가지고 각각 구분할 수 있는 단위
  - 데이터와 함수로 구성
인스턴스(Instance) - 클래스에서 생성된 객체로 클래스의 속성과 성질을 가진 실제적인 개체
속성(Attribute) - 클래스가 가지는 데이터 또는 멤버 변수
메소드(Method) - 객체의 속성을 조작하기 위한 함수
메시지(Message) - 객체 간 상호작용을 위한 방법으로, 다른 객체에 특정 행위를 요청하는 신호
  - 객체명 / 메소드명 / 매개변수로 구성

객체지향의 기본원리

캡슐화(Encapsulation) 서로 연관된 데이터와 관련된 메소드를 한 묶음으로 처리 - 객체 간 인터페이스를 이용하여 종속성 최소화
추상화(Abstraction) 불필요한 부분을 생략하고 핵심적인 것에 일반화하여 개략적으로 표현 - 클래스를 이용하여 데이터와 행위 추상화
다형성(Polymorphism) 다른 객체가 동일한 메시지에 대해 고유한 방식으로 응답 - 오버로딩, 오버라이딩
정보은닉(Information Hiding) 객체의 상세한 내용을 외부에 숨기고 메시지만을 통해 객체 간 상호작용 - 클래스와 객체의 접근 제어
상속(Inheritance) 상위 클래스의 속성과 메소드를 하위 클래스에서 재사용하고 확장하는 것 - 클래스 체계화와 확장의 용이성

 

객체지향 프로그래밍의 장단점

장점

  • 재사용성, 신뢰성, 신속한 설계, 개발 용이성, 선언형 명세 설계, 캡슐화로 인한 유지보수 용이성, 설계 독립성 

단점

  • 프로그래밍 구현을 지원해주는 정형화된 분석 및 설계 방법이 없음
  • 실행 시간이 지연될 수 있음
  • 유지보수의 어려움으로 인해 다형성, 상속, 오버로딩, 다중 상속 등 객체지향 특성이 제한될 수 있음

구조적 설계와 객체지향 설계의 비교

접근방법 Top Down Bottom Up
설계방향 프로세스 중심(기능 위주) 데이터 중심(데이터 + 연산)
확장성/재사용성 확장이 어려움, 중복이 많음 확장 용이, 재사용성 높음

상속과 위임

상속(Inheritance)

  • "is-a" 관계를 나타냄
  • 구현이 쉽지만 부모 클래스가 변경되면 자식 클래스에도 영향을 줌
  • 결합도(커플링)가 강함
  • 상속은 "is-a" 관계보다 한 객체가 다른 객체처럼 행동할 때 사용

위임(Delegation)

  • "has-a" 관계를 나타냄
  • 런타임에 행동의 복합을 가능하게 하고 방식을 변경할 수 있음
  • 주로 인터페이스(interface)를 통해 구현됨
  • 결합도가 약함

상속과 위임의 비교

상속(Inheritance)위임(Delegation)

클래스 간의 관계 인스턴스 간의 관계 동적인 관계
정적인 관계 동적인 관계 실행 타임에 변경 가능
결합도 부모 클래스가 변경되면 자식 클래스에 영향을 줌 변경에 유연하고, 클래스 간의 결합도가 낮음
사용 사례 상속 관계보다 한 객체가 다른 객체처럼 행동할 때 사용 런타임에 객체의 행동을 조정하고, 객체의 행동을 다른 객체에 위임할 때 사용

이와 같이 객체지향 프로그래밍은 객체를 중심으로 한 개발 방법론으로, 캡슐화, 추상화, 다형성, 정보은닉, 상속 등의 원리를 통해 유지보수 용이성과 재사용성을 강조합니다. 구조적 설계와 비교했을 때 객체지향 설계는 데이터 중심으로 접근하며 확장성과 재사용성이 높은 특징을 가지고 있습니다. 또한, 상속과 위임은 객체 간의 관계를 나타내는 방법으로, 상속은 "is-a" 관계를, 위임은 "has-a" 관계를 표현합니다.

댓글