본문 바로가기

면접질문[CS]/알고리즘 & OS

프로시저(procedure) 함수(function) 메서드(method)의 차이점 [프로그래밍 면접 질문 1]

why

 

크게 중요한 질문은 아닐 수 있다.

 

"기능"과 관련해서 같은 의미를 가지는게 아닌가? 싶은 용어들이다.

 

3개의 용어가 비슷비슷하게 사용되는 것 같지만 맥락에 따라서 다르게 사용된다.

 

3가지 용어를 어떤 관점에서 구분하는지에 대해서 물어볼 수 있는 좋은 질문이라 생각한다.

[ 다만 중요성은 낮다고 생각하는 편 ]

 

 

Subprogram & Subroutine

 

세 가지 용어 모두 "프로그램의 일부"라는 개념에서 묶어낼 수 있다.

 

시스템을 구성하는 일부의 로직을 의미하는 것이다.

 

시스템의 작은 기능이라는 관점에서 보면 3가지 용어 모두 같지만 

 

기능이 가지는 특성들로 파악하면 3가지 용어 모두 다르게 사용될 수 있다.

 

서브 프로그램, 서브루틴, 자료구조 등등은 복잡한 문제를 해결하기 위해 더 작은 문제로 분할해주는 도구이다.

 

1. 프로시저와 함수의 구분은 보통 절차지향적인 프로그램에 주로 사용된다. [ DB ]

 

2. 함수와 메서드의 차이에 대해서는 객체지향의 관점에서 메서드가 더 엄격한 특성을 가지게 된다.

 

프로시저(Procedures)

특정 프로세스를 "절차적"으로 기술해놓은 것을 의미한다.

 

"절차적(순차적)"으로 처리하고자 하는 명령어들의 집합이다.

 

반드시 그런 것은 아니지만 보편적으로 결괏값을 반환하지 않는다.

 

입력값에 영향을 줄 수 있어 side effect가 있다.

 

함수(Function)

 

들어온 입력값에 기반하여 새로운 값을 반환한다. 입력값에 계산을 수행한다는 개념에서 "수학"에서 가져온 용어이다.

 

현대에 와서는 함수가 다른 함수들을 포함하여 일종의 함수들의 집합을 형성하기도 한다. [ 이 지점에서 프로시저의 "명령어 집합"과 공통점이 생긴다. 이 경우 함수를 일종의 프로시저라고 볼 수도 있다. ]

 

함수의 경우 리턴 값이 있어야 한다. [반드시 그런 것은 아니다. void function도 존재 ]

 

순수 입력값에 따른 결과를 반환함으로써 side effect가 없도록 만드는 것이 핵심이다.

 

side effect(부작용? 부수효과?)

 

리턴 값의 유무

 

명령어들의 집합

 

두 가지 특징으로 프로시저와 함수를 비교하기는 애매하다. [ 완전한 일관성을 가지지 않기 때문.. ]

 

그나마 강력한 비교 특징이라 하면 "side effect"를 꼽을 수 있을 것 같다.

 

side effect는 함수형 프로그래밍에서 정말 중요한 개념 중 하나로

 

"함수"라고 표현하기 위해서는 side effect가 없도록 구현해야 하기 때문이다. 

 

procedure와 function의 구분을 명확하게 해 줄 수 있는 부분이다.

 

procedure의 경우 side effect를 가질 수 있지만 순수 function의 경우 side effect가 없게 만들어야 한다.

 

프로그래밍에서의 side effect를 짚기 전에 실제 현실에서의 side effect를 짚고 넘어가자.

 

부작용(혹은 부가적인 효과)이란 무엇일까?

 

내가 생각했을 때는 "의도한 결과"외의 결과를 부수효과 혹은 부작용이라고 표현하는 듯하다.

[ 전립선 치료제가 탈모 치료제로 사용되는 것처럼... 의도치 않게 다른 효과를 야기한 것이다. ]

 

대부분의 부작용은 보편적으로 좋지 않은 경우와 연관되는 경우가 많다. [ 발진, 알레르기, 설사 등등 ]

 

컴퓨터의 세계에서도 마찬가지다.

 

side effect가 있다는 것은 잠정적인 버그의 원인이 되기 때문에 side effect가 없도록 프로그래밍하는 것이

상당히 중요하다. [ 예상하지 못한 상태 변화가 진행되는 것은 좋지 않다. ] 

 

프로그래밍에서의 side effect(부작용)이란...

 

side effect가 있다는 말이란 함수를 입력값에 특정 결과를 처리한다고 할 때 해당 결과값에 영향을 미치지 않는

모든 작업들을 side effect라고 부른다. [ 로그를 남기거나 시스템 출력을 하거나, 네트워크 작업을 처리한다거나 등등 ]

 

Function이라 함은 side effect가 없는 순수 함수가 될 수 있도록 노력해야 한다는 것이다.

 

특정 input에 대해서 동일한 output을 반환하면서 함수 외부의 값을 사용하지 않도록 하는 것이다. 

 

그래서 순수 함수형 프로그래밍(패러다임)에서는 불변 값만을 취한다. 

 

Procedure는 side effect의 엄격성에서 거리가 먼 서브루틴이라고 볼 수 있다.

 

메서드(Method) 객체지향의 관점.

 

0개 이상의 변수들에 대한 집합을 가진 function이다.

 

여기서 0개 이상의 변수 집합은 클래스에서 제공된 멤버 변수들을 의미한다. [ 한정된 data ]

 

이를 "closure"라고 표현한다. 

 

메서드는 0개 이상의 파라미터를 가지는 함수이다.

 

여기에 추가로 객체가 가지는 변수들의 집합에도 접근이 가능하다.

 

이러한 관점에서 넘어오는 객체를 + 객체 데이터 + (파라미터 + 객체 데이터) 기반 기능 처리라고 볼 수 있다.

 

이를 data + closure로 본다.

 

메서드의 경우 클래스 혹은 객체를 통해서 수행된다는 점에서 기존 function와 procedure와는 다르게 사용된다.

 

메서드의 경우 객체지향과 관련되어서 "서브 루틴"의 용어로 좀 더 엄격하게 사용되는 것이다.


요점

 

1. Procedure와 Function은 절자치향적인 관점에서 비교된다. 

보편적으로 반환 값(return)이 없냐와 명령어들의 집합이냐 아니냐로 구분할 수 있었으나 이 부분은 일관성 있게 사용되지 않으며 프로그래밍 언어별로 다른 표현을 채택하기에 모호함이 존재한다.

 

둘을 명확하게 비교할 수 있는 부분은 side effect 특징이다. 순수 함수형 패러다임에서 function은 side effect가 없게끔 구현되어야 한다. 반면 Procedure의 경우 side effect가 존재한다.

 

데이터베이스의 관점에서 둘을 구분해서 사용한다.

 

프로그래밍의 관점에서는 "순수 함수형"이냐의 유무로 구분해서 사용한다.

 

2. Method는 "객체지향" 관점에서 Function을 좀 더 엄격하게 구분하는 것이다. 

 

객체(클래스)에 존재하는 변수들의 집합 + 파라미터로 넘어온 값에 대한 기능 처리를 의미한다.

 

이를 data(파라미터로 넘어온) + closure(객체가 가지는 변수에 대한 기능 처리)로 보는 것이다.

 

Method의 경우 객체(인스턴스) 혹은 클래스를 통해 수행된다는 점에서 function과 다르다.

 

함수 호출은 어디서나 가능하다.

 

마무리

 

대체로 절차지향적인 부분에 "함수"와 "프로시저"라는 표현이 사용된다고 생각한다.

 

객체지향에서는 "메서드"를 중점으로 객체가 사용되어야 함을 암묵적인 배경으로 두는 것이다.

 

절차지향 프로그래밍은 다분하게 컴퓨터의 처리 과정에 집중하게 되는 사고를 하고, 거기에 맞게 기능처리를 고민하게 된다. (분기, 명령처리, 문장, 반복문 등등)

 

객체지향의 경우에는 컴퓨터의 처리 과정과는 다른 사고를 해야 한다.

 

해결해야 하는 문제의 "현실"에 집중하고 추상화한 문제에서 "협력과 소통"의 과점을 들여다 봐야 한다.

 

이에 대해선 나중에 "절차지향 프로그래밍, 객체지향 프로그래밍"에 대한 주제에서 더 깊게 살펴보고자 한다.

 

이번 주제를 공부하면서 절차지향, 객체지향에 대해서 다시금 고민하게 되었다. 

 

참고자료를 통해서 뜨거운 토론들을 엿 볼 수 있었다.

 

해당 글도 명확하게?? 정리한 것은 아닌데, 나중에 추가적으로 수정이 필요하다고 생각될 때마다 개선할 예정이다.

 

오해를 살 수 있는 부분의 경우 지적해주신다면 수정하도록 하겠습니다.

 

참고자료

  • 스택오버 플로우 : link
  • StackExchange : link
  • 인프런 답변 : link [ side effect에 대하여 ]
  • 이상욱님의 블로그 : link [ side effect에 대하여 ]
반응형