객체 지향 프로그래밍 vs 절차 지향 프로그래밍

GoldenDusk·2023년 11월 13일
0

CS지식

목록 보기
15/26
post-thumbnail

1. 객체 지향 프로그래밍

객체 지향 프로그래밍은 OOP(Object Oriented Programming)이라고도 한다.
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

🍈 장점

  1. 코드의 재사용성이 높다.
  • 누군가가 만든 클래스를 가져와 사용할 수 있고 상속을 통해 확장할 수도 있다.
  1. 유지보수 용이 및 코드 재사용
  • 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메소드로 존재하기 때문에 해당 부분만 수정하면 된다.
  • 각각의 객체는 독립적인 기능을 수행하고 서로 상호작용하므로, 하나의 객체를 수정하더라도 다른 객체에 미치는 영향이 적다.
  1. 대형 프로젝트에 적합하다.
  • 클래스 단위로 모듈화시켜서 개발할 수 있으므로 업무 분담하기가 쉽다.
  1. 객체간의 상호작용
  • 객체지향 프로그래밍에서는 객체들이 서로 메시지를 주고받으며 상호작용
  • 이를 통해 복잡한 문제를 분해하여 해결할 수 있다.

🍈 단점

  • 처리 속도가 상대적으로 느리다.
  • 객체가 많으면 용량이 커질 수 있다.
  • 설계 시 많은 노력과 시간이 필요하다.

🍈 객체 지향 프로그래밍의 특징

1) 캡슐화(Encapsulation)

  • 서로 연관된 데이터와 함수를 함께 묶어 외부와 경계를 만들고 필요한 인터페이스만을 밖으로 드러내는 기법
  • 결합도가 낮아지고 재사용 용이
  • 인터페이스가 단순화
  • 인터페이스를 제외한 세부 내용이 정보 은닉되어 외부 접근 제한
  • 외부 모듈의 변경으로 인한 파급 효과가 적음
  • 정보 은닉과 관계가 깊으며 변경 발생시 오류의 파급 효과가 적음
  • 결합도 down/ 응집도 up[2020.3회, 4회]

2) 상속성(Inheritance)

  • 상위 클래스의 속성과 메서드를 하위 클래스에서 재정의 없이 물려받아 사용하는 기법
  • 재사용성을 높이는 중요한 개념

3) 다형성(Polymorphism)

  • 하나의 메세지에 대해 각 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 능력
  • 상속받은 여러 개의 하위 객체들이 다른 형태의 특성을 갖는 객체로 이용될 수 있는 성질
  • 오버로딩, 오버라이딩

ex. ‘+’ 연산자의 경우 숫자 클래스에서는 덧셈, 문자 클래스에서는 문자열의 연결 기능

4) 정보은닉(Information Hiding)

  • 코드 내부 데이터와 메서드를 숨기고 공개 인터페이스를 통해서만 접근이 가능하도록 하는 코드 보안 기술
  • 필요하지 않은 정보는 접근할 수 없도록 하여 한 모듈 또는 하부 시스템이 다른 모듈에 구현에 영향을 받지 않게 설계됨(고려되지 않은 영향인 Side-Effect들은 최소화)
  • 설계에서 은닉되어야 할 기본 정보로는 IP주소와 같은 물리적 코드, 상세 데이터 구조 등이 존재
  • 필요하지 않은 정보는 접근할 수 없도록 하여 한 모듈 또는 하부시스템이 다른 모듈의 구현에 영향을 받지 않게 설계되는 것을 의미한다.
  • 정보은닉은 모듈 독립성을 갖추게 해줘 변화에 따른 수정 가능
  • 모듈들 사이의 독립성을 유지시키는 데 도움이 된다.

5) 관계성(Relationship)

  • 종류로는 연관화, 분류화, 집단화, 일반화, 특수화가 있음
  • 두 개 이상의 엔터티 형에서 데이터를 참조하는 관계로 나타내는 기법

연관화

  • is-member-of 관계
  • 클래스와 객체의 참조 및 이용관계
  • 같은 계층에 속하는 클래스 사이의 상호 의존성을 보여주는 비계층적 관계성을 나타낸다.

집단화

  • is part of관계, part-whole 관계
  • 서로 관련 있는 여러 개의 객체를 묶어 한 개의 상위 객체를 만드는 특징
  • 일반화와 달리 상위 클래스의 성질이 하위클래스에 상속되지 않음

분류화

  • is instance of 관계
  • 공통된 속성에 의해 정의된 객체 구성원들의 인스터스

일반화

  • is-a 관계
  • 클래스간의 개념적인 포함 관계
  • 상위 클래스의 특성을 하위클래스가 상속받음

특수화

  • is-a 관계
  • 상위 클래스들의 특성들을 상속받으면서 하위 클래스에서 나름대로 수정을 가하고 자기 자신의 고유한 특성을 갖는 관계

6) 다중 상속(Multiple Inheritance)

  • 한 개의 클래스가 두 개 이상의 상위 클래스로부터 속성과 연산을 상속받는 것\

🍈 객체지향 설계 원칙(SOLID)

  1. 단일 책임의 원칙(SRP- Single Responsibility Principle)

    : 하나의 클래스는 하나의 목적을 위해 존재

  2. 개방 폐쇄 원칙(OCP – Open Close Principle)

    **: 소프트웨어의 구성요소는 확장에는 열려있고, 변경에는 닫혀있어야**하는 원칙

  3. 리스코프 치환의 원칙(LSP –Liskov Subsitution)

: 서브 타입(상속받은 하위 클래스)은 어디서나 자신의 기반 타입(상위 클래스)로 교체할 수 있어야 한다는 원칙

  1. 인터페이스 분리의 원칙(ISP-Interface Segregation Principle)
  • 클라이언트는 자신이 사용하지 않는 메서드와 의존관계를 맺으면 안된다.
  • 클라이언트가 사용하지 않는 인터페이스 때문에 영향을 받아서는 안된다.[2020 4회]
  1. 의존성 역전의 원칙(DIP-Dependency Inversion Principle)

    : 실제 사용관계는 바뀌지 않으며, 추상을 매개로 메세지를 주고받음으로써 관계를 최대한 느슨하게 만드는 원칙

🍈 객체지향 구성요소

1) 클래스(Class)

  • 하나 이상의 유사한 객체들을 묶어 공통된 특성을 표현한 데이터 추상화[2020.1회, 3회]
  • 공통된 속성과 연산을 갖는 객체의 집합
  • 객체지향 프로그램에서 데이터를 추상화하는 단위
  • 각각의 객체들이 갖는 속성과 연산을 정의하고 있는 틀
  • 슈퍼 클래스 : 특정 클래스의 상위(부모) 클래스
  • 서브 클래스 : 특정 클래스의 하위(자식) 클래스

2) 객체(Object)

  • 자신 고유의 데이터를 가지며 클래스에서 정의한 행위를 수행
  • 독립적으로 식별 가능한 이름을 갖고 있음
  • 객체가 가질 수 있는 조건인 상태(State)는 시간에 따라 변함
  • 객체와 객체는 상호 연관성에 의한 관계 형성
  • 객체가 반응할 수 있는 메세지의 집합을 행위라고 하며, 객체는 행위의 특징을 나타냄
  • 객체는 일정한 기억장소를 가지고 있음
  • 실세계 존재하거나 생각할 수 있는 것을 말함

3) 메서드(Method)

  • 전통적 시스템의 함수 또는 프로시저에 해당하는 연산
  • 클래스로부터 생성된 객체를 사용하는 방법, 객체에 명령을 내리는 메세지

4) 메세지(Message)

  • 객체에게 어떤 행위를 하도록 지시하기 위한 방법

5) 인스턴스(Instance)

  • 클래스에 속한 각각의 객체
  • 클래스로부터 새로운 객체를 생성하는 것을 인스턴스화라고 함

6) 속성(Property)

  • 한 클래스 내에 속한 객체들이 가지고 있는 데이터 값들을 단위별로 정의

🍈 객체지향 프로그래밍 언어(Object-Oriented Programming Languages) 종류

  1. Java: 객체지향 개념을 완전히 구현하고, 플랫폼 독립적인 특성
  2. C++: 객체지향 프로그래밍 기능을 지원하면서도, 절차 지향 프로그래밍 요소를 포함
  3. Python: 객체지향 프로그래밍을 완전히 지원하는 동시에 절차 지향 및 함수형 프로그래밍도 지원
  4. C# (C Sharp): .NET 프레임워크에서 사용되며, 객체지향 프로그래밍을 완벽하게 지원
  5. Ruby: 객체지향 프로그래밍에 매우 강조를 두는 언어로, 모든 것이 객체로 처리
  6. Smalltalk: 객체지향 프로그래밍의 순수한 형태를 제공하는 언어 중 하나

2. 절차 지향 프로그래밍**(Procedural Programming)**

절차 지향 프로그래밍은 프로그램을 명령의 순서와 절차에 따라 구성하는 방법으로 주로 C 언어가 이에 해당

🍈 특징

  • 프로세스 중심: 절차 지향 프로그래밍은 프로세스나 절차를 중심으로 프로그램을 구성하며, 프로그램은 함수의 집합으로 구성되며, 순차적인 처리가 중요
  • 단순성과 효율성: 작은 프로그램이나 단순한 애플리케이션에서는 절차 지향 프로그래밍이 효율적일 수 있다. 코드의 흐름을 이해하기 쉽고, 실행 속도가 빠를 수 있다.

🍈 절차 지향 프로그래밍 언어(Procedural Programming Languages) 종류

  1. C: 가장 널리 알려진 절차 지향 프로그래밍 언어로, 시스템 프로그래밍에 주로 사용
  2. Fortran: 과학 및 공학 계산에 사용되는 고성능의 절차 지향 언어
  3. Pascal: 교육용으로 널리 사용되는 절차 지향 언어입
  4. BASIC: 초보자를 위한 간단한 절차 지향 언어
  5. COBOL: 주로 비즈니스, 금융 및 행정 시스템에서 사용되는 절차 지향 언어

3. 객체지향 프로그래밍과 절차 지향 프로그래밍의 비교

  • 코드 구조: 객체지향은 데이터와 기능을 객체 안에 캡슐화하고, 절차 지향은 함수와 프로세스를 통해 프로그램을 구성
  • 유지보수성: 객체지향은 코드의 재사용과 유지보수가 용이하지만, 절차 지향은 대규모 프로젝트에서 코드 변경 시 파급 효과가 클 수 있다.
  • 성능: 일반적으로 절차 지향 프로그래밍이 객체지향보다 실행 속도가 빠를 수 있다.
  • 적용 분야: 객체지향은 대규모 소프트웨어 개발에 적합하고, 절차 지향은 소규모 또는 특정 알고리즘 구현에 적합할 수 있다.
profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글