OOP랑 소프트웨어 디자인

심지혜·2024년 4월 4일
0

소프트웨어 공학

목록 보기
4/5

객체 지향 프로그래밍이란?

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로서, 실제 세계의 사물을 객체(Object)로 보고 이들이 서로 상호작용하는 방식으로 프로그램을 설계하고 구현하는 방법론이다. 이러한 설계 기법은 프로그램을 더욱 체계적이고 유연하게 만들어주며, 코드의 재사용성을 높이고 유지보수를 용이하게 한다.

객체 지향 프로그래밍 패러다임

객체 지향 프로그래밍은 여러 가지 특징을 가지고 있으며, 이러한 특징들은 프로그래밍을 통한 문제 해결을 보다 효과적으로 만든다. 이러한 특징들에는 Identity, Classification, Abstraction, Inheritance, Polymorphism, Persistence 등이 있다.

Identity

객체 지향 프로그래밍에서 Identity는 각각의 객체를 서로 구분하는 데 사용되는 고유 식별자를 의미한다. 실제 세계에서도 모든 사물과 생명체는 그들을 구분하는 고유한 식별자를 가지고 있다. 프로그래밍에서 이러한 개념을 빌려와, 동일한 속성이나 동작을 가진 여러 객체를 서로 구분하고, 객체 간의 상호작용을 정의할 수 있다.

Classification

Classification은 객체의 분류를 담당하는 기능이다. 이는 객체를 그룹화하고, 그룹 간의 관계를 설명하는 데 사용된다. 클래스(Class)는 객체의 특성(속성, Properties)과 행동(메소드, Methods)을 정의하는 템플릿 또는 청사진으로서 작동한다. 같은 클래스에 속한 객체들은 동일한 속성과 행동을 공유한다.

Abstraction

Abstraction은 복잡한 시스템을 단순화시키는 과정이다. 프로그래머는 시스템의 복잡성을 효과적으로 관리하고, 시스템의 주요 기능에만 집중할 수 있게 해준다. 추상화를 통해, 우리는 복잡한 로직을 단순하고 이해하기 쉬운 인터페이스로 변환할 수 있다.

Inheritance

Inheritance는 클래스 간의 관계를 정의하는 메커니즘이다. 하위 클래스(Subclass)는 상위 클래스(Superclass)의 속성과 메소드를 상속받는 것을 의미한다. 이를 통해 코드의 재사용성이 향상되고, 프로그램의 복잡성이 줄어든다. 상속을 통해 프로그래머는 기존 클래스의 기능을 확장하거나 변경할 수 있다.

Polymorphism

Polymorphism은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 하나의 인터페이스를 통해 다양한 타입의 객체를 조작할 수 있도록 해준다. 이는 프로그램의 유연성과 확장성을 향상시킨다. 다형성은 메소드 오버로딩과 오버라이딩을 통해 구현할 수 있다.

Persistence

Persistence는 객체의 상태가 프로그램의 실행 주기를 넘어서 유지되는 성질을 의미한다. 프로그램이 종료되더라도 객체의 상태를 보존하고, 다시 프로그램이 시작되었을 때 그 상태를 불러오는 것이 가능하다. 이는 데이터베이스, 파일 시스템, 클라우드 스토리지 등을 통해 구현할 수 있다.

객체 지향 프로그래밍은 이러한 패러다임을 통해 프로그램의 구조를 보다 효과적으로 관리하고, 프로그램의 유지 보수를 용이하게 한다. 이러한 이유로 객체지향 프로그래밍은 많은 프로그래머들에게 선호되는 방법론 중 하나가 되었다.

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

  1. 재사용성: 객체 지향 프로그래밍에서는 클래스와 객체를 통해 코드를 재사용할 수 있습니다. 같은 기능이 필요할 때 마다 코드를 반복적으로 작성하는 대신, 이미 작성된 클래스나 객체를 재사용하여 효율적으로 코드를 작성할 수 있습니다.

  2. 유지보수성: 객체 지향 프로그래밍은 코드의 유지보수를 쉽게 만듭니다. 특정 기능을 변경하거나 업데이트해야 할 경우, 해당 기능이 구현된 클래스나 객체만을 수정하면 되므로 유지보수가 간편해집니다.

  3. 보안: 객체 지향 프로그래밍에서는 데이터를 객체 내부에 숨겨두고, 해당 객체에서만 접근 가능하도록 제한할 수 있습니다. 이를 캡슐화라고 하며, 이를 통해 데이터의 보안을 강화할 수 있습니다.

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

  1. 처리 속도: 객체 지향 프로그래밍은 처리 속도가 절차 지향 프로그래밍에 비해 상대적으로 느릴 수 있습니다. 이는 객체 간의 메시지 전달, 객체 생성과 소멸 등에 시간이 소요되기 때문입니다.

  2. 설계 시간: 객체 지향 프로그래밍은 다른 프로그래밍 방법론에 비해 설계 시간이 더 많이 필요할 수 있습니다. 클래스와 객체, 그리고 이들간의 관계를 정확하게 설계하는 것이 필요하기 때문입니다.

  3. 난이도: 객체 지향 프로그래밍은 절차 지향 프로그래밍에 비해 학습 난이도가 높을 수 있습니다. 클래스, 객체, 상속, 다형성 등의 개념을 이해하고 잘 활용해야 하기 때문입니다.

객체 지향 프로그래밍이 적합한 상황

  1. 복잡한 소프트웨어 개발: 복잡한 소프트웨어 시스템을 개발할 때 객체 지향 방법론을 사용하면, 시스템의 복잡성을 줄이고 코드의 재사용성을 높일 수 있습니다.

  2. 유지보수가 필요한 프로젝트: 프로젝트가 계속해서 업데이트되고 변화해야 하는 경우, 객체 지향 프로그래밍을 사용하면 유지보수가 용이합니다.

  3. 여러 개발자가 참여하는 프로젝트: 여러 개발자가 함께 작업해야 하는 프로젝트에서는 객체 지향 프로그래밍을 사용하면, 각 개발자가 작성한 코드 간의 충돌을 최소화하고 효율적으로 협업할 수 있습니다.

소프트웨어 디자인이란?

소프트웨어 디자인은 요구 사항이나 계획을 개발 단계로 수행하기 위한 절차이다.

소프트웨어 디자인 원칙

  1. “터널 시야”에 매몰되어서는 안된다
    : 목표를 달성하는 것만이 아닌 다른 효과에도 초점을 맞추어야 한다
  2. 분석 모델로 추적 가능해야 한다
    : 고품질의 소프트웨어를 개발하는데 필요한 모든 요구사항을 충족해야 한다
  3. “바퀴의 재발명”을 하지 말아야 한다
    : 이미 존재하는 것을 만드는데 시간과 노력을 낭비해서는 안된다
  4. 지적 거리 최소화
    : 실제 문제와 소프트웨서 솔루션 간의 격차를 줄여야 한다
  5. 균질성 및 통합성 표기
    : 프로세스 전체에서 변경 없는 균일한 디자인이어야 하며, 하위 시스템 전부가 결합되어야 한다
  6. 변경 수용
    : 소프트웨어는 사용자의 필요에 따라 바뀌는 수행방식에 적응해야 한다
  7. 부드러운 저하
    : 실행 중 오류가 발생하더라도 정확하게 작동해야 한다
  8. 평가 또는 품질
    : 평가 중에도 디자인 품질을 확인하고 집중해야 한다
  9. 오류 발견을 위한 검토
    : 설계를 검토하며 오류 유무와 최소화를 위한 전반적인 평가를 수행해야 한다
  10. 디자인은 코딩이 아니다, 코딩은 디자인이 아니다
    : 디자인은 문제 해결을 위한 프로그램의 논리를 설명하는 것이며 코딩은 디자인 구현에 사용되는 일종의 언어다

Composition over Inheritance

Composition over Inheritance은 상속 대신 구성을 사용하는 원칙이다. 이 원칙을 통해 코드의 유연성을 높이고, 재사용성을 증가시킬 수 있다.

Encapsulate what varies

Encapsulate what varies는 변화하는 부분을 캡슐화하는 원칙이다. 이를 통해 코드의 유지 보수를 용이하게 할 수 있다.

Program against abstractions

Program against abstractions는 추상화에 대해 프로그래밍하는 원칙이다. 이 원칙을 통해 코드의 유연성을 증가시키고, 변경에 대한 영향을 최소화할 수 있다.

Hollywood Principle

Hollywood Principle은 "먼저 전화하지 마세요, 우리가 전화할게요"라는 원칙이다. 이 원칙은 시스템 간의 의존성을 줄이고, 유연성과 확장성을 향상시킬 수 있다.

IoC(Inversion of Control) / DI(Dependency Injection)

IoC(Inversion of Control) 또는 DI(Dependency Injection)은 제어의 역전 또는 의존성 주입이라는 원칙이다. 이 원칙은 모듈 간의 결합도를 줄이고, 코드의 테스트와 재사용성을 증가시킬 수 있다.

SOLID

SOLID는 객체 지향 프로그래밍과 설계의 다섯 가지 기본 원칙이다. 이 원칙들은 코드의 유지 보수성, 유연성, 효율성을 향상시킬 수 있다.

DRY

DRY(Don't Repeat Yourself)는 같은 코드를 반복하지 않는 원칙이다. 이 원칙을 통해 코드의 유지 보수성을 증가시키고, 잠재적인 오류를 줄일 수 있다.

YAGNI

YAGNI(You Ain't Gonna Need It)은 필요하지 않은 것은 구현하지 않는 원칙이다. 이 원칙은 불필요한 코드를 줄이고, 개발 시간을 절약할 수 있다.

KISS

KISS(Keep It Simple, Stupid)는 가능한 한 간단하게 유지하는 원칙이다. 이 원칙은 코드의 복잡성을 줄이고, 이해와 유지 보수를 용이하게 할 수 있다.

AHA

AHA(Avoid Hasty Abstraction)은 성급한 추상화를 피하는 원칙이다. 이 원칙은 불필요한 복잡성을 피하고, 코드의 가독성을 향상시킬 수 있다.

LoD(Law of Demeter)

LoD(Law of Demeter)은 데메테르의 법칙이라고도 하며, 객체 간의 상호작용을 최소화하는 원칙이다. 이 원칙은 결합도를 줄이고, 변경에 대한 영향을 최소화할 수 있다.

이렇게 소프트웨어 디자인 원칙들은 효율적인 코드를 작성하는데 도움이 될 수 있다. 이 원칙들을 잘 활용하면, 코드의 품질을 높이는 데 큰 도움이 될 것이다.

0개의 댓글