절차지향 / 객체지향

A Code AM·2020년 3월 4일
0

모르고 썼다

목록 보기
2/7
post-thumbnail

절차지향 프로그래밍(PP)

개요 : 프로시저(루틴, 서브루틴, 메소드(클래스에서), 함수 등) 이용하여 작성하는 프로그래밍 방식. 프로시저 콜(함수 호출)의 개념을 바탕으로 한 프로그래밍 패러다임.

프로그래밍 패러다임 : 주어진 문제를 해결하는 프로그램을 작성할 때의 관점, 방법론. 한마디로 프로그래밍 스타일
서브루틴 : 반복 되는 것을 한 번만 사용하도록 메모리 사용을 줄이도록 고안된 것. 메인 루틴에 붙어 보조하는 역할을 한다. 메인루틴에 있지 않고 별도의 공간에 한 번만 생긴다. (메인함수가 main routine이고 그 외 프로그래머가 사용하려고 main 외부에 만든 함수같은 것들이 sub routine인듯)

프로그램 작성 단위 : 함수 단위로 작성 > 프로그램이 커지면 매우 복잡해져 알아보기 힘듦.

함수는 입력이 들어와서 출력이 나가는 블랙 박스(black box)로 간주되고, 절차지향에서 사용되는 설계 방법은 하향식 설계(top down desin)이라고도 불린다. 하향식 설계 방법에서는 문제를 더 작은 서브 프로시저로 분해해서 원하는 수준에 도달할 때까지 이를 반복하며 설계한다.

대표적인 언어 : C언어, 포트란 등등

장점

  1. 익숙해지면 빠르고 간결하며 버그가 적은 코드를 작성하기에 좋다.
  2. 함수를 통한 코드의 재활용성이 높아 가독성이 높아짐.
  3. 모듈화와 구조화에 용이해서 조립도 가능

모듈화 : 독립적으로 재활용 될 수 있는 소프트웨어 덩어리. 쉽게 말하면 기능 단위로 나누는 것을 의미한다. 또한 인터페이스 외에 내부구조에 대한 직접 접근을 막는다(정보은폐).

단점

  1. 데이터와 함수가 분리된다.
  2. 과도한 전역변수의 사용 : 모든 함수에 개방되어 있어 값을 잘못 설정하게 될 수 있다.
  3. 프로그램 이해가 어려워짐 : 함수가 많아지면 어떻게 상호 작용 하는지 이해하기 어려워짐.
  4. 변경하고 확장하기 어렵다 : 복잡도가 어느 이상 되면 프로그램을 변경하기가 어려워진다.
    -> 함수들이 서로서로 영향 받아서 수정하기가 어렵기 때문.
  5. 프로시저 호출은 그냥 코드 쓰는 것보다 시간이 많이 소모 됨 > 인라인 함수 이용하면 됨.

인라인 함수(inline function) : 함수 호출되는 과정은 상당히 복잡하다. 우선 함수 호출 전에 함수의 인자를 스택에 저장하고 함수가 리턴될 때 돌아올 주소를 스택이나 레지스터(CPU 안의 저장공간)에 저장한 후 함수의 시작 주소로 점프해서 함수의 코드를 실행하고 함수에서 만들어진 지역변수, 스택에 저장된 인자 해제, 리턴 값을 레지스터에 저장한 다음 함수를 호출할 때 저장해둔 주소(다음 문장 위치)로 되돌아간다. 간단한 함수면 함수 호출 준비 시간이 더 걸려서 함수 호출하지 않고 코드를 복사해서 넣어주는 편이 효율적이다. 함수 이름 앞에 inline 쓰면 함수를 따로 생성하는게 아니라 함수 코드를 호출한 곳에 직접 넣어준다. 이런 함수가 인라인 함수(inline function)다.

객체지향 프로그래밍(OOP)

개요 : 캡슐화, 다형성, 상속을 이용해 코드 재사용률을 증가시키고, 유지보수를 보다 쉽게 하도록 각각의 객체들을 모아 프로그래밍 하는 것.

프로그램 작성 단위 : 객체(Object) = 하나의 역할을 수행하는 메소드(=멤버 함수)와 변수(데이터)(= 멤버변수 / 필드)의 묶음

특징

1. 캡슐화(Encapsulation)

= 데이터와 메소드를 묶은 것. 객체의 외부에서 데이터에 직접 접근하지 못하게 하고 함수(메소드)를 통해서만 조작할 수 있다.

2. 정보 은닉(Information Hiding)

= 정보가 어떤식으로 구현되어 있는지를 외부에 숨기고 대신 외부에서 사용할 수 있는 인터페이스를 제공한다. 중요한 데이터를 그대로 노출했다가 정보가 손상되거나 오용될 수 있고, 내부를 건드렸다가 나중에 유지보수나 업데이트가 어려워지기 때문이다.

추상화(Abstraction) : 대상에서 특징만을 뽑아내는 것. 복잡한 세부사항을 숨기고 주요한 기능에 집중할 수 있게 해주는 개념이다.

3. 상속(Inheritance)

= 한 클래스가 가지고 있는 특징들을 다른 클래스가 물려받는 것. 부모 클래스의 기능들을 가지고 와서 기존 클래스와 구분되는 특징을 추가할 수 있다. (재사용 + 유연성)

4. 다형성(Polymorphism)

= 하나의 클래스나 함수가 다양한 방식으로 동작하는 것.

  • 오버라이딩(Overriding) : 상속받은 자식 클래스가 부모클래스에서 정의된 함수를 그대로 가지고 와서 같은 이름인데 다른 행위를 하게 재정의 하는 것. 이름이 같지만 오버라이딩 되어있다면 자식 클래스에 있는 것이 호출 된다. (부모클래스의 메소드명과 같고 해당 메소드의 매개변수가 반드시 있어야 하며 리턴타입도 같아야 함. 기능 추가 가능)
  • 오버로딩(Overloading) : 같은 함수명을 쓰는데 데이터 타입, 매개변수의 갯수를 다르게 해서 어떤 인자를 몇 개 넘기느냐에 따라 동작을 다르게 하는 것.

장점

  1. 재사용 및 확장이 용이
  2. 유지보수가 유리
  3. 대형 프로젝트에서 유리

단점

  1. 처리 속도가 절차지향보다 느림
  2. 설계가 어려움

대표적인 언어 : C++, C#, JAVA, Python 등등

profile
배움기록

0개의 댓글