[프로그래밍] 객체 지향 프로그래밍, 함수형 프로그래밍

채록·2021년 5월 11일
0

짜투리

목록 보기
26/26

- 객체 지향 프로그래밍 : OOP (Object-Oriented Programming)
- 절차 지향 프로그래밍 : POP (Procedure-Oriented Programmin)
+) 함수형 프로그래밍


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

객체 지향 프로그래밍이란 개념은 1960년대에 나타났다.
"모든 데이터를 객체(Object)로 취급하고 처리 요청을 받은 객체가 자기 안에 있는 기능을 가지고 처리한다."

이렇게 탄생한 OOP는 캡슐화 / 상속 / 다형성 의 특징을 갖고 있으며 모듈 재사용이 가능해 확장 및 유지보수에 상대정으로 용이하다. (자세한 특징은 아래에 추가)


클래스 기반 객체 지향 프로그래밍

객체지향 프로그래밍을 따르는 언어는 대표적으로 Java나 Python, C++ 이 있다. 특히나 python에서 이제껏 내가 사용했고 흔히들 사용되는 방법은 클래스 기반의 객체지향 프로그래밍 기법이다.

객체와 관련된 코드를 분리할 수 있게 하는 것이 객체 지향 프로그래밍의 핵심이다. 이때 코드를 더욱 효율적으로 관리하기 위해 클래스 라는 구조가 탄생한 것이다. 즉, 클래스는 객체를 조금 더 효율적으로 생성하기 위해 만들어진 구문이다!

class, object, instance
object와 instance는 지칭하는것의 상태에 따라 구분된다.

  • Class: 같은 종류의 집단에 속하는 attribute(속성)과 behavior(행위)를 정의한 것.
  • Object : 클래스의 정의대로 만들어진 실체.
  • instance : class에 의해서 만들어진 객체(object). 객체가 메모리에 할당된 것. "인스턴스<객체"로 볼 수 있고, 각각의 인스턴스들은 독립적이다.

객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 한다. 즉 인스턴스는 객체에 포함된다고 볼 수 있다.



1. OOP의 특징

위에서 말했듯 객체지향 프로그래밍에는 캡슐화 / 상속 / 다형성 이라는 특징이 있는데 이 외에도 몇가지 특징이 더 있다.

참고 자료 : wikipedia

1) 자료 추상화

자료추상화는 "불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것"이다. 이런 방법을 통해 정의된 자료형을 추상 자료형이라고 하는데 "추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통해서 자료형의 정보를 은닉할 수 있다"

객체 지향 프로그래밍에서는 일반적으로 다음과 같이 정의한다.

  • 추상 자료형 : 클래스
  • 추상 자료형의 instance : 객체
  • 추상 자료형에서 정의된 연산 : 메소드(함수)
  • 메소드의 호출 : 생성자

2) 상속&다중상속

상속"새로운 class가 기존 class의 자료와 연산을 이용할수 있게 하는 것" 으로
다중상속"class가 2개 이상의 class로부터 상속받게 하는 것" 을 의미한다.

다중상속 지원 언어 ?
python 의 경우 다중상속이 가능하지만 JAVA는 지원하지 않는다.


3) 다형성

다형성 이란 "어떤 한 요소에 여러 개념을 넣어 놓는 것으로 오버라이딩 혹은 오버로딩을 의미한다."

오버라이딩 / 오버로딩 ?

오버라이딩이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것.
오버로딩이란 서로 다른 시그니처를 갖는 여러 메소드를 하나의 이름으로 정의하는 것.

시그니쳐 ?
메소드의 정의에서 메소드 이름과 매개변수 리스트의 조합을 의미한다.

다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.


4) 동적 바인딩

동적 바인딩이란 실행 시간 중에 일어나거나 실행 과정에서 변경될수 있는 바인딩으로 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현하는 것이다.

컴파일 시간에 완료되어 변화하지 않는 정적 바인딩과 대비된다.

바인딩 ?
바인딩이란 프로그램의 어떤 기본 단위가 가질 수 있는 구성요소의 구체적인 값, 성격을 확정하는 것을 의미한다.

동적바인딩을 나타내는 대표적인 예시가 인터프리터 언어인 Python이다.

# python 예시
a = 123

python의 경우 변수의 자료형을 미리 선언하지 않고 실행시간에 변수의 자료형을 결정한다.
그 외에 a는 변수명, 123은 변수의 자료값 으로 할당, 즉 "바인딩" 된다.

함수의 동적 바인딩은 실행파일을 만들 때 호출할 함수의 메모리 주소가 확정되지 않고 보류 상태로 있다가 이후 실제 실행 시간에 호출할 함수의 주소가 결정 된다. 때문에 주소를 저장할 공간을 미리 확보해야 한다.

보통의 가상 함수들이 "동적 바인딩"을 구현하는데 실행 될지 안될지 확정되지 않은 함수를 위해 저장공간을 미리 마련해야한다는 점 때문에 메모리 관리에 있어선 비효율적일 수 있다.

가상 함수 ?
객체 지향 프로그래밍에서 가상 함수는 상속하는 클래스 내에서 같은 시그니처의 함수로 오버라이딩 될 수 있는 함수 또는 메소드이다. OOP의 다형성에서 중요한 부분이다

출처 : wikipedia


2. OOP를 쓰는 이유?

wikipedia의 말이다. 읽으면서 아! 그렇구나! 싶었다.

소프트웨어 공학의 관점에서 바라볼때 SW의 질을 향상시키기 위해선 강한 응집력약간 결합력을 지향해야 한다. OOP의 경우 class를 이용해 모아둔 data를 사용함으로써 응집력을 강화하고, class간 독자적인 존재로 결합력을 약하게 한다.
때문에 OOP를 지향하는 것이라고 생각한다!



------------------------



함수형 프로그래밍

함수형 프로그래밍이란 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 즉, 프로그램은 함수의 계산이라고 프로그래밍을 정의하며 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과 달리 함수형 프로그래밍에서는 함수의 응용을 강조한다.

이와 관련하여 언어의 종류도 함수형인지 명령형인지 나눌 수 있다.

명령형 언어 ?
명령형 언어는 식의 값이 부분식의 계산 순서에 의존적이게 되어 이로 인해서 부작용이 발생할 수 있다. 또한 함수의 호출 순서에 종속적인 특징을 갖는다.

함수형 언어 ?
함수형 언어는 독립적인 변수를 사용한다. 따라서 입력값이 같으면 항상 같은 결과값을 반환한다.이러한 점을 들어 함수형 언어는 참조투명성이 있다고 할수 있다. 참조투명성의 보장으로 인해서 함수형 언어는 간결하고 이해하기 쉬운 특징을 가지며 프로그램의 형식적인 분석과 조작이 용이하다.

함수형 언어만 함수형 프로그래밍이 가능한 것은 아니다. 명령형 언어에는 대표적으로 python과 C++이 있다. 그치만 나도 사용했고, 많은 이들도 python으로 함수형 프로그래밍을 구현하고 있다.

이처럼 함수형 언어로 별도로 설계되지 않은 언어도 함수형 프로그래밍이 가능하다


1. 함수형 프로그래밍의 장점

명확한 장점이 두가지 있다.

1) 코드의 용도를 구분할 수 있다.

2) 코드를 재사용 할 수 있다.

함수형 프로그래밍에 관한 내용 추가중

profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글