방법 대 기능 대 절차


107

간단한 질문이지만, 나는 종종 그처럼 거친 것으로 정의 된이 세 가지 용어를 듣지만, 수년에 걸쳐 다른 것을 의미하는 것으로 알려졌습니다.

"프로 시저", "방법", "기능", "서브 루틴"등의 "정확한"정의는 무엇입니까?


4
당신은 "루틴"을 잊어
버렸습니다

1
@ teresko : "서브 루틴"이 더 일반적이라고 생각합니다.
mk12

답변:


108

나는 여기서 다른 대답을 할 것입니다. 실제로 "방법"이 일반적으로 OO 언어의 객체와 관련된 서브 루틴을 언급 한다는 약간의 예외는 있지만 실제로 차이없습니다 .

"프로 시저, 기능, 서브 루틴, 서브 프로그램 및 방법"이라는 용어는 모두 같은 것을 의미합니다 : 더 큰 프로그램 내에서 호출 가능한 서브 프로그램. 그러나 이러한 용어는 프로그래밍 언어 나 패러다임간에 일관되게 사용되지 않기 때문에 이러한 용어의 모든 변형 사용을 캡처하는 정의를 도출하기가 어렵습니다.

함수가 값을 반환한다고 말할 수 있습니다. 다음 C 함수는 값을 반환하지 않습니다.

void f() { return; }

...하지만 절차라고 부르는 사람을 찾지 못할 것입니다.

물론 파스칼에서 프로시 저는 값을 반환하지 않으며 함수는 값을 반환하지만 이는 파스칼의 설계 방식을 반영한 것입니다. 포트란에서 함수는 값을 반환하고 서브 루틴은 여러 값을 반환합니다. 그러나 이것들 중 어느 것도 우리가이 용어들에 대한 "유니버설"정의를 내놓을 수는 없습니다.

실제로 "절차 프로그래밍"이라는 용어는 C, 포트란 및 파스칼을 포함한 전체 언어 클래스를 의미하며 실제로는 "절차"라는 용어 만 사용합니다.

따라서 이것 중 어느 것도 실제로 일관되지 않습니다. 유일한 예외는 아마도 "방법"인데, 이것은 거의 전적으로 OO 언어와 함께 사용되며 객체와 관련된 기능을 나타냅니다. 그럼에도 불구하고 이것이 항상 일치하는 것은 아닙니다. 예를 들어, C ++는 일반적으로 메소드 대신 "멤버 함수"라는 용어를 사용합니다 ( "메소드"라는 용어가 프로그래머들 사이에서 C ++ 언어로 변형 되었음에도 불구하고).

요점은 이것 중 어느 것도 실제로 일관성이 없다는 것입니다. 그것은 당시에 어떤 언어가 사용 되든지간에 사용 된 용어를 단순히 반영합니다.


그것이 바로 그 대답이라고 생각한 것입니다. (나중에 다른 변형으로 "서브 루틴"을 추가 했어야합니다.) 질문 할 수 있습니다. 왜 C 함수를 "프로 시저"라고 부르는 사람을 찾지 못하겠습니까? 기술적으로 부정확하거나 "프로 시저"라는 용어가 현재 유행을 벗어 났기 때문입니까?
Django Reinhardt

7
C 프로그래머는 단순히 C의 설계자가 해당 용어를 사용했기 때문에 "기능"이라는 용어를 사용합니다.
Charles Salvia

15
목욕물로 아기를 버리지 마십시오. 용어가 완전히 일관성있게 사용되지 않는다고해서 다른 용어가 다른 의미를 갖는 것은 아닙니다. @ Bruce 's 및 @ Frank 's 정의는 관용적이 아닌 널리 인식됩니다. 그 의미가 보편적이지 않다는 사실은 중요하지만 "실제로 말하면 실제로 차이가 없다"는 도약을 정당화하지는 않습니다. (@Django)
LarsH

9
메소드 "멤버 함수", Java 및 C # 호출 함수 "정적 메소드"를 호출하는 C ++에 대한 이중 유형.
Jörg W Mittag 1

2
브루스의 대답은 프로그래밍을 처음 접한다면 꼭 가야 할 답변입니다. 그의 정의는 99 %의 시간 동안 절대적으로 정확할 것입니다. 그러나 더 많은 기술적 / 이론적 대답을 찾고있었습니다. 때때로 새로운 프로그래머는 자신의 도메인 만 알고 있으며 그것이 전부라고 주장합니다. 실제로 오늘날 더 오래된 언어를 사용하고 다른 정의를 사용하는 데 "잘못되지 않은"프로그래머가 있습니다. 그것이 내가 가장 흥미로 웠던 것입니다.
Django Reinhardt

67

함수는 값을 반환하지만, 절차는 하지 않습니다.

방법은 기능과 유사하지만, 인 내부 클래스의 부분. method 라는 용어 는 거의 대부분 객체 지향 프로그래밍에서 사용됩니다.


8
정확히 내부가 아닙니다. 메소드는 클래스의 일부인 함수 또는 프로 시저입니다.
Scott Whitlock

8
그렇다면 SQL의 "저장 프로 시저"는 어떤 값도 반환하지 않습니까? 파스칼과 같은 "프로 시저"는 어떻습니까? 정의가 현재 추세를 기반으로합니까 아니면 보편적 인 정의로 간주되어야합니까? 감사!
Django Reinhardt

3
@ 장고 : 파스칼에서 프로시 저는 반환 값을 가질 수 없으며 함수 반환 값을 가져야합니다. 다른 언어에서는 용어가 더 느슨하게 사용될 수 있습니다.
Bruce Alderman

1
그러나 FORTRAN은 초기부터 SUBROUTINE과 FUNCTION을 가졌지 만 차이점은 SUBROUTINE이 값을 반환하지 않았다는 것입니다. 파스칼의 자손 인 ALGOL에 대해서는 기억이 없습니다.
David Thornley

2
@ 3p1c_d3m0n functionJS에서 두 역할을 모두 수행 한다는 것은 확실 하지만 JS 함수는 모두 반환합니다. return 문에 값이 없으면 값은 암시 적으로 undefined입니다. return 문이 없으면 인터프리터는 암시적인 return 문을 추가합니다. 비의가 있을지 모르지만 여기에 주어진 정의와 일치합니다. 이것이 var x = function() {}();JS에서 합법적 인 이유 입니다. 암시 적 반환이 아닌 경우 파스칼에서와 같이 오류가되어야합니다.
세미콜론

52

기능은 입력의 무리를 소요하고 하나 개 이상의 값을 반환하는 무언가이다. 반환 된 값이 입력에 의해 완전히 결정되고 함수에 부작용이없는 경우 (아마도 외부에서 상태 변경을 로깅 또는 발생시키는 경우)이를 순수 함수라고합니다.

절차는 값을 반환하지 않는 기능입니다. 특히 이것은 절차가 부작용을 일으킬 수 있음을 의미합니다. (입력 매개 변수를 변경하는 것도 포함될 수 있습니다!)

있어서 , A는 변수 세트에 걸쳐 폐쇄하는 기능이다 클로져 . 0 개 이상의 입력 매개 변수를 사용하고이 변수 세트에 액세스하며 0 개 이상의 값을 리턴합니다. OO 언어에서 이러한 메소드는 객체 또는 클래스에 연결됩니다.

대부분의 주류 OO 언어에서 이러한 폐쇄 변수를 객체의 멤버 필드 또는 인스턴스 변수라고합니다. 방법은 순수한 기능, 불순한 기능 또는 절차 일 수 있습니다.

후자의 정의는 객체 = 구조체 + 클로저 대응으로 이어진다 .


5
따라서 객체는 변수 모음과 이러한 공통 변수에 대한 클로저 모음입니다. 기본적으로 객체 지향 언어는 항상 닫혀 있었으며 아무도 몰랐습니다. 재미있는 전망! +1
Giorgio

1
나는 대부분의 방법이 어떤 것에 가깝다고 생각하지 않습니다. foo.doSomething()매개 변수가 없습니다. 그것은 foo구문 설탕과 함께 하나의 매개 변수 (object )를 가지고 있습니다. 클로저는 그러한 매개 변수가 없어도 객체를 참조 할 수 있습니다. 즉 , 메서드 클로저가 될 수 없으며 대부분이 아니고 언어가 클로저를 지원하기에 충분하지 않다는 것입니다.
8bittree

3
foo.doSomething()foo변수를 닫습니다 . 어떤에서 문 doSomething캔 접속 foo을 통해 this또는 self언어에 따라. 이것은 "클로즈 오버"의 정의입니다. 클래스는 멤버 변수에 가깝게 닫히므로 ( "OO 란 무엇인가"무시) OO면 충분합니다. 이것은 문헌에서 꽤 잘 알려져 있습니다.
Frank Shearar

1
어, 아니 foo.앞의 작은 부분을 ​​보 foo.doSomething()시겠습니까? 그것은 당신 doSomething()이 매개 변수 를 전달 하는 것입니다. 괄호 사이에 있지 않다고해서 매개 변수가 아니라는 의미는 아닙니다. this또는 self메소드 내에서 해당 매개 변수를 참조하기위한 단순히 문법 설탕입니다.
8bittree

1
@ FrankShearar, 나는 컴퓨팅과 데이터와 명령에서 합리적으로 명확한 두 가지 차이점 만 있다고 말합니다. 그것조차도 (비정상적인) 자체 수정 코드의 경우에는 창 밖으로 나옵니다. OO에서 일반적으로 "메소드"(또는 "멤버 함수")는 정의에 의한 방법 또는 함수일 필요는 없습니다. 일반적으로 사용되는 모든 단어는 일반적이고 상호 교환 가능한 의미와 실질적으로 동의어입니다. 당신이 존재한다고 주장하는 "불순 함수 (impure function)"는 동일한 "지시"의 일반적인 개념에 대한 또 다른 (그리고 가장 오래 가고 전문적인) 동의어입니다.
Steve

14

브루스는 좋은 대답이 있습니다. 의미 적으로 추가합니다.

  • 프로시 저는 (예를 들어 인수에 "무언가를"또는 다른 부작용을 야기한다 printf)
  • 함수는 (a) 인수에 대한 질문에 대답하거나 (b) 인수를 기반으로 새 값을 계산해야합니다.
  • 함수 메소드는 객체의 상태에 대한 질문에 답변해야합니다
  • 프로 시저 메소드는 오브젝트의 상태를 변경해야합니다

좋은 답변입니다! 단지 하나의 작은 추가 : A procedure should "do something" to the arguments-또는 다른 부작용을 유발합니다 (예 :) printf.
Allon Guralnek

1
@Allon printf값 (인쇄 된 문자 수) 을 반환하므로 기술적으로 함수입니다.
Sjoerd

@Sjoerd 나는 그것이 printf가치 라는 것에 동의하지 않습니다 . 그것은 호출 범위 밖에서 특정한 부작용을 가졌습니다. 즉 표준 출력이 무엇이든 I / O입니다. 그럼에도 불구하고 Scott은 이러한 차이점을 명시 적으로 밝히지 않았지만 함수형 프로그래밍 함수에서는 부작용이 없어야하며 실제 반환되는 데이터가있는 것처럼 질문에 대답 할 수 있어야합니다.
Alan

4

위의 좋은 자세한 답변; 짧은 이야기는 모든 서브 루틴의 풍미가 있다는 것입니다. 각 용어의 의미는 프로그래밍 언어 상황에 따라 다릅니다.

일반적으로 함수는 값을 반환하지만 반드시 그럴 필요는 없습니다.

방법은 현재 일반적인 OOP 용어입니다

SQL에서 저장 프로 시저에는 출력이 있지만 일반적으로 오류 코드 만 반환하지만 사용자 정의 함수는 값을 반환해야합니다 (결과 집합 일 수 있음)

다시 말하지만,이 용어들 사이의 정확한 차이점은 당신이 말하는 사람에 달려 있습니다!


2

숙련도의 80 %는 명명법에 대한 친숙 함과 직접 관련이 있습니다.

생산성의 95 %는 설명에 사용 된 용어에도 불구하고 현재 유용한 기능을 식별하는 능력입니다.

MSSQL을 사용할 때 sproc이 있었지만 c #에서 모든 메소드를 호출하는 것을 선호하지만 물론 Postgres를 사용하며 함수라고합니다.


13
모든 통계의 83.5 %가 현장에서 이루어짐 ;-P
Django Reinhardt

1
비 OO 언어로 작업 할 때 누군가 "방법"이라는 용어를 던지는 소리가 들리면 긴장합니다. 비 아이디 오 매틱 코드를 ​​실행하는 것과는 크게 상관 관계가있는 것 같습니다.
Racheet

내가 다루는 많은 OO 프로그래머가 절차 또는 기능이라는 용어를 듣는 데 정신적 장애가 있기 때문에 C 코드를 언급 할 때 '방법'을 사용합니다. 재미있게도, 난 정말 그들을 엉망으로하고 싶다면, 용어를 무작위로 바꿀 수 있습니다. 안 좋은 점은, 당신을 집에
여주인을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.