본문 바로가기
Software 공학

OOP Concepts

by 개발자J의일상 2022. 7. 26.
반응형

Procedural Programing vs Object Oriented Programming

Procedural Programing

프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러다임으로 프로그램이 프로시저를 이용해서 위에서 아래로 순서대로 수행되는 개발 방법입니다. 대표적으로 C언어가 있습니다.

절차지향언어의 장점
1. 실행 속도가 빠르다. (컴퓨터의 처리방식과 유사)

절차지향언어의 단점
1. 유지보수가 어렵고 시간이 많이 소모된다.
2. 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다.

Object Oriented Programing

객체지향이란 실제 세계를 모델링하여 소프트웨어를 개발하는 방법입니다.
객체지향 프로그래밍은 기능과 논리보다는 데이터 또는 객체 중심으로 소프트웨어 설계를 구성하는 컴퓨터 프로그래밍 모델이다. 객체는 고유한 attibute와 behavior가 있는 데이터 필드로 정의할 수 있다.

객체지향의 3대 특성으로는 Encapsulation, Inheritance, Polymorphism이 있으며, 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 사용됩니다.

객체지향프로그래밍 장점
1. 코드의 재사용성이 높다 (상속을 통해 불필요한 코드의 중복을 제거하고, 쉽고 빠르게 설계할 수 있다)
2. 유지보수가 용이하다 (기존 기능 수정 시, OCP를 만족하는 설계이면)

객체지향프로그래밍 단점
1. 처리속도가 절차지향보다 느리다.
2. 설계에 시간이 오래걸린다.
3. 개발 속도가 느릴 수 있다.

절차지향은 데이터 중심으로 함수를 구현하고, 객체지향은 데이터와 기능들을 묶어 하나의 객체로 만든다.

Classes and Objects

클래스는 공통의 속성과, 연산 그리고 behavior를 가진 object들의 콜렉션이다.
클래스(class) : 하나 이상의 유사한 객체들의 모임. 하나 이상의 유사한 객체들을 묶어 공통된 특성을 표현한 데이터 추상화를 의미
객체(object) : 기억, 판단, 행위 능력을 갖는 단위 시스템
객체는 클래스의 인스턴스이다. 객체는 다른 객체와 메세지를 통해 커뮤니케이션할 수 있다.
속성(attribute) : 객체가 가지고 있는 특성으로, 현재 상태(오브젝트 상태)를 의미한다.

Encapsulation

객체와 관련있는 속성(data fields)과 행위(methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.

연관된 데이터와 함수를 논리적으로 묶어 놓은 것이며, 외부에서는 객체의 실제 데이터의 처리과정을 알 수 없다. 외부에서는 통신을 위해서 객체의 공개된 Method를 이용해야 한다.

  • Cohesion 증가 Coupling 감소
  • SoC 달성
  • 외부의 변화에 영향을 덜 받음

Abstraction

불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 부분에 중점을 두어 일반화시키는 개념으로 실세계에 대한 상황을 간략히 보여줄 수 있다.

Information Hiding

코드 내부의 data와 method를 숨기고 공개된 Interface를 통해서만 접근이 가능하도록 하는 개념이다. 공개범위는 접근지시자로 지정 합니다.
Encapsulation관련된 요소를 묶어 캡슐 내부와 외부를 구별짓는 장치이고 Information Hiding은 캡슐 내부요소들에 대한 세부 구현사항을 외부에 숨기는 장치이다. 따라서 캡슐화 했다고 해서 반드시 Hide 되는 것은 아니다.
모듈간 의존도를 낮춰서 Coupling이 낮아지고 Modularity가 좋아진다. 모듈내에 변경해도 외부에 미치는 영향을 최소화 할 수 있다.

Visibility(접근성)
Public, Protected, Private같은 접근 지시자를 이용해 데이터나 메소드에 대한 접근 권한을 제어하는 키워드

Inheritance (상속)

“is a kind of”, “is-a” 관계를 나타낸다. 부모 객체의 Attribute와 Operation을 자식이 물려 받는 것을 얘기한다.
상속은 객체들 간의 관계를 구축하는 방법 중 하나입니다. 상속을 통해서 부모 클래스의 기능을 자식 클래스가 재사용할 있고 기능을 확장할 있습니다.

Polymorphism (다형성)

다양한 형태로 동작하는 성질을 말합니다.
동일한 메시지라도 메소드가 정의되어 있는 수신자에 따라 다른 기능을 수행하는 개념
같은 Type서로 다른 객체가 동일한 메소드에 대해 서로 다른 기능을 제공하는 객체지향 특징을 뜻합니다. Runtime Polymorphism(Dynamic)으로 Overriding이 있으며, Compile time Polymorphism(Static)으로 Overloading이 있습니다.

Overriding

부모 Class에서 정의한 메소드를 자식 Class에서 변경하는 것.

Overloading

(같은 클래스내에서) 같은 이름의 메서드를 여러개 가지는 데 매개변수의 Type과 개수를 다르게 하는 것.

Dynamic Binding

Compile 시에 결정되지 않고, 실행되는 시점(Runtime)에 값이 확정되는 것으로 OOP를 가능하게 하는 장치입니다. Compile 타임에 결정되는 것은 정적 바인딩
Dynamic Binding은 Late Binding이라고도 한다.
Dynamic Binding은 런타임에 발생한다.
Dynamic Binding은 overriding 메소드를 사용한다.
실제 객체는 Dynamic Binding에 사용된다.
Virtual function을 사용하여 Dynamic Binding은을 수행할 수 있다.

장점

  • 유연성(혹은 적응성). 런타임까지 타입에 대한 결정을 끌고 갈 수 있기 때문에 많은 선택의 여지가 있다.
  • 유연성으로 인해 단일 함수는 런타임에 다양한 타입의 객체를 처리할 수 있다.

단점

  • 안정성. 실행도중에 예상치 못한 타입이 들어와 Type Error를 내는 경우가 생긴다.

Substitutability(대체가능성)

  • 특정 타입을 사용해야 하는 곳이 있다면, 이 타입의 서브타입을 대신 쓸 수 있다는 원칙이다.

Abstract Class vs Interface

Abstract Class

하나 이상의 추상 메소드를 포함하는 클래스추상 클래스라고 한다. 추상 메소드자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드!
추상 클래스를 상속 받아 기능을 이용하고 확장 시키기 위함

  • 추상 메소드가 하나 이상 포함되면 반드시 추상 클래스로 선언되어야 한다.
  • 반드시 추상 클래스를 상속하는 자식 클래스에서 부모가 가진 추상 메소드를 모두 Overriding해야 한다.
  • 추상 클래스에서 추상 메소드가 아닌 일반 메소드를 포함시킬 수 있다.
  • 추상 메소드는 몸체가 없고 선언부만 존재한다.

Interface

구현 객체의 같은 동작을 보장하기 위함
인터페이스는 안이 비어있는 메소드들의 형태들만 써놓은 것이며 상속하는 클래스들에서 해당 메소드의 내용을 구현해서 가져가야하는 메소드의 집합

  • 오로지 추상 메소드와 상수만을 가집니다. 즉 로직을 작성할 수 없습니다.
  • 인터페이스 내에 존재하는 메소드는 무조건 public abstract로 선언됩니다.
  • 인터페이스 내에 존재하는 변수는 무조건 public static final로 선언됩니다.
  • 인터페이스는 다중 상속과 비슷한 기능을 제공합니다.

추상 클래스와 인터페이스: 차이점

1. 사용의도 차이점
추상 클래스는 IS - A "~이다", 인터페이스는 HAS - A "~을 할 수 있는".
추상 클래스와 인터페이스의 차이점은 그 목적이라고 할 수 있습니다. 추상 클래스는 기본적으로 클래스 이며 이를 상속, 확장하여 사용하기 위한 것입니다. 반면 인터페이스는 해당 인터페이스를 구현한 객체들에 대한 동일한 사용방법과 동작을 보장하기 위해 사용합니다.
어떤 객체가 특정 인터페이스를 구현하였다면, 그 객체는 인터페이스의 기능을 모두 갖추고 있음을 보장합니다. 그리고 인터페이스를 통해 해당 객체를 제어할 수 있음을 보장하는 것입니다.

2. 공통된 기능 사용 여부
공통으로 필요한 기능들을 인터페이스로 구현하면 인터페이스를 사용하는 모든 클래스에서 오버라이딩 하여 재정의 해야 합니다. 이때 추상 클래스를 이용하여 일반 메서드로 작성하여 사용하면 자식 클래스에서 공통으로 사용이 가능합니다.

Generic Class/Template

제네릭 클래스는 타입을 한 개 이상 받는 클래스입니다.
형식 매개 변수 (타입 제거의 개념). 사용자가 전달하는 “형식”을 매개변수로 사용하여 형식 내부에서 형식 매개 변수로 정의된 (주로 단일 형식 매개 변수에서는 T를 사용합니다.) 형식을 교체하는 것입니다.

템플릿(Template) : 함수나 클래스 코드를 찍어내듯 생산할 수 있도록 일반화(generic) 시키는 도구

template <class T> void swap(T &a, T &b) {
...
}

만약에 Template이 지원되지 않는다면, int형, double형, float형에 대한 모든 swap 함수를 구현해야 합니다.

https://myjamong.tistory.com/150
https://itpmw.tistory.com/815

300x250

'Software 공학' 카테고리의 다른 글

Architecture Styles  (1) 2022.08.01
Principles of SW Design  (0) 2022.07.28
OO Analysis & Design  (0) 2022.07.27

댓글