절차 적 프로그래밍이란 정확히 무엇입니까? 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.