절차 적 프로그래밍이란 정확히 무엇입니까? OOP와 정확히 다른 점은 무엇입니까? 기능적 프로그래밍과 동일합니까?


32

매우 객체 지향 (OO) 스타일 로 Java 로 프로그래밍하고 있습니다. OOP는 매우 직관적으로 제공되지만 다른 종류의 프로그래밍에 대한 지식은 거의 없습니다.

절차 적 프로그래밍 이란 정확히 무엇입니까 ? OOP와 정확히 다른 점은 무엇입니까? 함수형 프로그래밍 과 같은 것 입니까?

저는 OO가 아닌 모든 프로그래밍이 절차 적이라고 생각했습니다. 그러나 나는 이것이 사실이 아니라고 생각하기 시작했습니다.


9
연구 결과를 공유하면 모든 사람에게 도움이됩니다. 당신이 무엇을 시도했고 왜 그것이 당신의 요구를 충족시키지 못했는지 알려주십시오. 이것은 당신이 시간을내어 자신을 돕기 위해 노력했고, 명백한 답변을 되풀이하는 것을 막아 주며, 무엇보다도보다 구체적이고 적절한 답변을 얻는 데 도움이됩니다. 또한 묻는 방법
gnat

2
절차 적 프로그래밍은 기능적 프로그래밍과 다릅니다. 실제로 객체 지향 프로그래밍과 객체와 클래스를 뺀 것과 본질적으로 같습니다.
메이슨 휠러

1
명령형 OOP 사실 이다 가 그래서 ... 당신은 모든 시간을 일을하는지 정확히, 절차 적 프로그래밍
잉고

답변:


68

Wikipedia에는 ​​이러한 용어에 대한 좋은 설명이 있습니다. 어쨌든 다음은 요약입니다.

  • 명령형 프로그래밍 은 계산가능한 상태를 변경하는 일련의 명령문 으로 계산을 모델링합니다.
  • 절차 적 프로그래밍은 코드를 서브 루틴으로 나누는 명령형 프로그래밍입니다.
  • 구조적 프로그래밍 은 절차 적 프로그래밍 에 대한보다 훈련 된 접근 방식으로 임의 점프 (예 : 이동) 및 전역 상태 변경을 금지합니다.

  • 선언적 프로그래밍 은 명령형 프로그래밍과 반대입니다. 방법 (예 : SQL, 정규식)보다는 계산 대상을 지정합니다.

  • 함수형 프로그래밍 은 계산할 수있는 표현식으로 계산합니다. 함수는 값이며 다른 함수로 전달되거나 다른 함수에서 반환 될 수 있습니다. 돌연변이는 권장되지 않습니다. 모든 변수는 기본적으로 변경할 수 없습니다. 결과적으로 명령을 달성하는 데 필요한 상태 변경 순서보다는 계산중인 항목을 강조하므로 명령 식보다 선언적입니다.

  • 순전히 기능적인 프로그래밍 은 돌연변이를 완전히 허용하지 않습니다.
  • 전체 기능 프로그래밍 은 예외 및 무한 반복을 추가로 금지합니다. (수학의 총 함수는 모든 입력에대한 값을 반환하는 함수입니다.)

OOP는 꽤로드 된 용어이기 때문에 관계가 약간 복잡합니다. 기능적 언어와 절차 적 언어 모두에서 객체를 사용할 수 있지만 OO로 광고하는 언어는 절차 적입니다. 문제를 더 혼란스럽게하려면 :

  • 대부분의 사람들은 객체와 추상 데이터 유형의 차이점을 모른다
  • 주류 OOP 언어는 ADT에 대해 언급하지 않고, 매우 열악한 지원을 제공하며, 하나의 진정한 방법으로 객체를 선전합니다.
  • 추상 데이터 형식 지향 프로그래밍 이라고 말하는 사람은 아무도 없습니다 . 어리석은 일이기 때문에 ADT와 객체가 모두 필요합니다.

이로 인해 사람들은 OOP가 추상화를 달성 할 수있는 유일한 방법이라고 생각하게되며 기능 프로그래밍과 OOP는 어떻게 든 반대이거나 상호 배타적입니다. 많은 사람들은 또한 모든 기능적 언어가 순수하고 돌연변이를 허용하지 않는다고 생각합니다.

또한 사람들은 일반적으로 명령 / 절차를 서로 바꾸어 던질 수 있으며 때로는 OOP와 대조하고 (추상화가 적은 코드, 일반적으로 C), 때로는 함수형 프로그래밍과 대조하기도합니다. 구조적 프로그래밍 이라는 용어 는 내가 알 수있는 한 대부분 사용하지 못했습니다 (이 시점에서 대부분의 사람들은 goto와 globals가 해롭다 고 당연한 것으로 생각하기 때문에).


3
"점프 금지"는 다소 일반적입니다. 여기에는 if / while / etc 등이 포함됩니다. 아마도 "임의의 점프를 금지합니다"?
이즈 카타

@ 이즈 카타 좋은 지적, 변경되었습니다.
Doval

1
실제로 위키 백과 항목에 연결하는 것이 좋습니다.
haylem

이것이 바로 Object Only가 아닌 Object "Oriented"라고하는 이유입니다.
JeffO

1
@OrangeDog 추상 데이터 형식과 다른 점은 무엇입니까?이 데이터 형식 은 캡슐화 된 데이터 집합과 그에 작용할 수있는 함수 정의합니까? 또한 불변의 객체를 가질 수 있으므로이 경우 어떤 상태 입니까?
Doval

12

절차 적 프로그래밍은 다른 많은 언어 디자인 (기능이 아닌 기능)의 기본 구성 요소 중 하나 인 프로그래밍에 대한 접근 방식입니다.

대부분의 언어는 "Procedural Programming"에 속하며 아마도 대부분의 사람들에게 가장 자연스러운 디자인 방식 일 것입니다 (OO로 생각하면 소수라고 생각합니다).

기본은 절차 적입니다.

다른 사람들이 말했듯이, 그것은 순차적으로 프로그램을 구성하는 메커니즘입니다.

  • 먼저 x를
  • 두 번째로 나는 y
  • 세번째로 나는 Z를한다

OO 메소드와 유사한 명명 된 코드 블록 인 "프로 시저"를 정의하는 메커니즘이 필요합니다.이 매개 변수는 0에서 많은 매개 변수를 허용하고 선택적으로 값을 리턴합니다 (일반적으로 함수라고 함)-아마도 기능 언어와 혼동 될 수 있습니다. )

패러다임은 당신이 할 일이나 전달되는 일의 방식을 지시하지 않습니다.

단순히 프로그램이 순차적 인 방식으로 작동하는 일련의 절차 (또는 기능)로 구성 될 것이라고 간단히 설명합니다. 그런 다음 데이터는 절차와 독립적으로 정의됩니다.

이것은 객체 지향 프로그래밍과는 다릅니다. 객체 지향 프로그래밍은 데이터와 그 데이터에 작용하는 메소드 (함수가 아님) 모음을 중심으로 프로그램을 구성합니다.

그것에 대해 생각하는 한 가지 방법은 데이터 범위와 관련이 있습니다.

절차 적 언어 범위는 매우 간단합니다. 변수는 주어진 프로 시저 (로컬로 선언 됨)의 범위에있을 수 있으며 중첩 된 범위를 사용하여 물건을 호출하는 최상위 항목 (전역 적으로 선언 된 수준)까지있을 수 있습니다.

객체 지향 언어에서는 현재 사용중인 객체의 컨텍스트 범위 인 새로운 범위 지정 컨텍스트를 추가합니다.

객체 지향과 비교할 때 절차를 생각하는 또 다른 방법은 모든 메소드 를 정적으로 선언 해야하는 객체 지향 언어를 고려하는 것 입니다. 결과적으로 클래스를 사용하여 프로 시저를 그룹화 할 수있는 절차 언어가 작성됩니다.


5

절차 적 프로그래밍 은 확실히 기능적인 프로그래밍이 아닙니다.

절차 적 프로그래밍은 컴퓨터 모델을 머릿속에 기계로두고 메모리에서 데이터를 수정하는 방법에 대해 생각하는 것입니다. 먼저 A값 3으로 설정 한 다음 1을 추가하고 메모리 위치에 A다시 저장 합니다 (이전 값 덮어 쓰기).

함수 프로그래밍을 말하는 것 A(3), 그리고 B이며 A + 1, 다음 계산하는 방법을 컴퓨터 그림을시키는 B. 당신이 정의하면 A그것은 해야 변경할 수 없습니다 (변경되지 않음). 또한 함수를 사용하면 함수를 일급 값으로 전달하는 것과 같은 작업을 수행 할 수 있습니다 (함수는 함수를 인수로 취할 수 있음).

객체 지향 프로그래밍은 종종 두 가지를 결합하며 두 가지에 직교합니다. 함수형 프로그래밍을 사용하고 불변 개체를 반환 할 수 있으며, 해당 개체에는 계산 된 값을 반환하는 메서드가있을 수 있으며, 함수형 객체 지향 프로그래밍이라는 게을리가 있습니다. 또한 "리포지토리"(데이터베이스의 추상 버전)를 나타내는 개체를 가질 수 있으며 리포지토리에있는 재료를 "저장"하고 "다시 가져 오기"하여 해당 개체가 수행 된 방법에 대한 모든 세부 정보를 처리 할 수 ​​있습니다. . 기본적으로 객체 지향 절차 적 프로그래밍입니다.


0

OOP는 조금 더 정교해진 절차 적 프로그래밍 방식에 지나지 않으며, 이는 다시 더 큰 명령형 프로그래밍 제품군에 속합니다. 그 주장의 증거는 많은 C # / Java 프로그래머들이 "뭔가를하는"경향이 있고 다음과 같은 방법을 선호한다는 것입니다.

void doThisAndThat(....) { ... do something ... }

따라서 많은 void 메소드 (이전의 프로 시저 (sic!)라고 함)와 다음과 같은 코드 로 구성된 프로그램 :

doThis();
if (state is that) doSomethingElse();
doThat();

완벽한 절차 적 프로그래밍입니다.


doThisAndThat (....)은 메소드가 일반적으로 좋은 방법이 아닌 둘 이상의 작업을 수행함을 의미합니다. Java 및 C # 개발자는 대부분 단일 책임 원칙을 준수합니다. 나는 당신의 비유에 결함이 있다고 생각합니다. objectmentor.com/resources/articles/srp.pdf
JohnK

@ JohnK 나는 그것이 좋은 습관이 아니라는 것을 안다. 그러나 일반적인 것입니다. 특히 Java 개발자들 사이에서 SO에 대해 매일 보는 것으로 판단 할 수 있다면.
Ingo

@JohnK Java 및 C # 개발자는 주로 Single Responsibility Principle -Lip 서비스를 준수 합니까?
Ingo

Java 개발자는 대부분 단일 책임을 고집합니까? 만약 그것이 현실에서 사실이라면…
Sridhar Sarnobat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.