본문 바로가기

CS

객체지향 프로그래밍 패러다임과 함수형 프로그래밍 패러다임

1. 프로그래밍 패러다임

  이전 글에서 한 번 설명했듯 프로그래밍 패러다임이란 개발자가 프로그래밍을 하는 데 있어서의 관념이나 체계를 이르는 말이다. 해당 게시글에서는 그 중 객체지향 프로그래밍과 함수형 프로그래밍에 대해 가볍게 다뤄본다.

 

2. 함수형 프로그래밍

  함수형 프로그래밍은 소프트웨어의 크기가 점점 커지는 과정에서 복잡하게 엉킨 코드를 유지보수하기 어려워지는 것을 보완하기 위해 등장했다. 함수의 응용을 강조하고 가변을 멀리하는, 모든 것을 작은 함수를 기준으로 나누어 문제를 해결하는 기법이 근간이되는 프로그래밍이다. 이를 통해 가독성과 유지보수성을 높였다. 

 

  함수형 프로그래밍은 대입문이 없는 프로그래밍이다라는 표현을 쓴다. 사이드 이펙트가 생기지 않는 순수 함수를 1급 객체로 취급하여 파라미터나 반환 값으로 사용해 참조 투명성을 높인다. 

 

- 사이드 이펙트 : 변수의 값이 변하는 등의 변화를 뜻한다.

- 순수 함수 : 사이드 이펙트가 제거된 함수이며 함수의 실행이 외부에 영향을 끼치지 않는 함수를 뜻한다.

- 1급 객체 : 아래의 조건이 만족되는 객체를 뜻한다.

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터나 반환 값으로 전달 할 수 있다.
  • 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.

- 참조 투명성

  • 동일한 인자에 대해 항상 동일한 결과를 반환한다.
  • 기존의 값은 변경되지 않고 유지된다.

위의 특징을 가진 함수형 프로그래밍이기에 다음과 같은 장점을 가진다.

  • 테스트와 디버깅이 용이하다.
  • 나은 모듈화와 짧은 코드를 제공한다.
  • 가독성 좋은 코드를 작성해 개발 생산성을 높이기 쉽다.
  • 부수효과를 제거할 수 있다.
  • 함수 단위의 프로그래밍으로 코드 재사용이 쉽고 동작을 예측하기 쉽다.

그러나 다음과 같은 한계점도 있다.

  • 개념을 이해하기가 어렵다.
  • 프로그래밍을 진행하며 수 많은 함수들을 파악하고 유지 관리하기 힘들어진다. 또한 함수가 늘어남에 따라 조합이 복잡해진다.
  • 광범위한 환경 설정과 꾸준한 리팩토링이 필요할 수 있다.

 

3. 객체지향 프로그래밍

  객체지향 프로그래밍은 쉽게 표현하자면 "객체의 상호교류"라 할 수 있다. 프로그래밍에 필요한 데이터와 함수를 객체화 시켜서 각 객체간의 상호작용을 통해 로직을 구성한다. 명령형 프로그래밍의 단점을 보완하기 위해 등장했는데, 기존엔 모듈을 재활용하기 어렵기 때문에 대규모 프로젝트에서는 코드의 반복으로 인해 장황해지거나 비효율적이 되는 경우가 쉽게 나타날 수 있었는데 이를 해결하는 것이 객체지향 프로그래밍의 핵심이다.

 

  객체지향은 다음과 같은 4가지 큰 특징이 있다.

• 캡슐화

 - 데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법

 - 주로 접근 제어자를 통해 변수나 함수의 사용 범위를 제한하는 방법으로 적용한다.

• 추상화 
 - 클래스들의 공통적인 특성(변수, 메소드)들을 묶어 표현하는 것

 - 예를 들면 차, 오토바이 등은 탈 것이라는 공통적인 특성이 있기에 탑승, 전진 등의 특징을 묶은 하나의 객체를 만들어 포현하는 것을 말한다.

• 상속화
 - 부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용하는 것

 - Java를 예로 들면 extends 키워드를 사용하여 사용한다.

public class parent{
	int pNum;
    protected void printNum(){
    	System.out.println(pNum);
    }
}

public class child extends parent{
	int cNum;
    // 명시는 안해줬지만 parent의 pNum이나 pringNum함수를 사용할 수 있다.
}

• 다형화
 - 다양한 형태로 표현이 가능한 구조를 말한다.

 - 주로 오버로딩이나 오버라이딩을 이용해 다형화를 구현한다.

 

  • 오버로딩 : 하나의 클래스안에서 같은 이름의 함수를 여러 개 선언하는 것으로 같은 역할의 다른 매개변수가 필요한 함수 등을 작성할 때 주로 이용한다.
public String printNum(int num){
	System.out.println(String.toString(num));
}

public String printNum(String num){
	System.out.println(num);
}
  • 오버라이딩 

부모 클래스에게 상속받은 함수를 자식 클래스에서 변경하여 사용하는 것.

public class parent{
	int pNum;
    protected void printNum(){
    	System.out.println(pNum);
    }
}

public class child extends parent{
	int cNum;
    
    @Override
    protected void pringNum(){
    	System.out.println(cNum);
    }
}

 

객체지향 프로그래밍은 다음과 같은 장점을 가진다.

  • 상속 등을 통한 코드의 재사용성을 높일 수 있다.
  • 캡슐화 등을 통해서 유지보수가 쉽다.
  • 클래스 단위로 모듈화를 개발하기 때문에 업무 분담이 쉽고 대형 프로젝트가 적합하다.

또한 다음과 같은 한계점을 가진다.

  • 객체가 처리할 역할에 대한 정확한 이해가 필요하기에 개발속도가 느리다.
  • 객체간의 의존성이 높아질 수 밖에 없으며 상태변화를 추적하는 것이 어렵다.
  • 실행속도가 느리다.
  • 다중 상속, 추상화 등의 문제로 복잡도가 높아 코딩 난이도가 어렵다.

 

-- 참조

https://mangkyu.tistory.com/111

 

[프로그래밍] 함수형 프로그래밍(Functional Programming) 이란?

1. 함수형 프로그래밍(Functional Programming)에 대한 이해 [ 프로그래밍 패러다임(Programming Paradigm) ] 프로그래밍 패러다임(Programming Paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를

mangkyu.tistory.com

https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

함수형 프로그래밍 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 함수형 프로그래밍(函數型 프로그래밍, 영어: functional programming)은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍

ko.wikipedia.org

https://xangmin.tistory.com/152

 

객체 지향 4가지 특징과 5가지 원칙

객체지향 이란? • 객체지향 프로그래밍 (Object Oriented Programming, OOP)이란? - 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고객체들 간의 유기적인 상호작용을 통해 로직을 구성하

xangmin.tistory.com

 

-