절차 프로그램과 객체 지향 프로그램의 차이점은 무엇입니까?
프로그래밍은 처음이지만 다양한 프로그래밍 방식에 대한 StackOverflow에 대한 흥미로운 토론을 읽고 있습니다.절차적 프로그래밍과 객체 지향 프로그래밍의 차이가 무엇인지 아직 100% 확신할 수 없습니다.객체 지향 프로그래밍은 여전히 절차(방법)를 사용하는 것처럼 들리지만 객체가 쇼의 스타이기 때문에 모든 것이 다르게 구성되어 있습니다.하지만 제가 보기에 절차는 여전히 여러분이 같은 일을 할 수 있게 해줍니다.C에서처럼 유사한 절차를 모두 라이브러리에 넣을 수 있습니다.그렇다면 C의 라이브러리가 C++의 객체와 비슷하다고 정말로 말할 수 있지 않을까요?
절차 프로그램에서 코드는 킹이고 데이터는 하위입니다.즉, 데이터에 따라 작동하는 프로그램이 있으며 일반적으로 엄격하게 구속되지는 않습니다.
OO세계에서는 물건이 가장 중요한 관심사입니다.개체는 데이터와 해당 데이터에 대해 작업할 수 있도록 허용된 코드로 구성되어 있으며, 이 코드들은 매우 단단히 묶여 있습니다.그것은 정보의 은닉, 즉 캡슐화의 개념입니다.
예를 들어, 숫자를 가지고 있고 두 배로 늘리려고 한다고 가정해 보겠습니다.절차적인 방법은 다음과 같습니다.
n = n * 2
여기의 코드는 n에 2를 꽤 명확하게 곱하고 결과를 n으로 다시 저장합니다.
OOO의 방법은 숫자 개체에 "메시지"를 보내 자신을 두 배로 늘리도록 지시하는 것입니다.
n.double();
이것의 장점은 다형성이라고 불립니다.당신이 "밥"과 같은 줄을 두 배로 만들 수 있기를 원했을 때 무슨 일이 일어날까요?절차 세계에서는 더블링을 수행하기 위해 더 많은 코드를 제공해야 하지만 코드를 다르게 호출해야 합니다.
OOO를 사용하면 문자열 개체를 만들 수 있으며 이 개체는 'double' 메시지도 받을 수 있습니다.문자열을 두 배로 만드는 코드는 문자열 개체에 속하므로 숫자 개체와 다르게 동작해야 한다는 것을 알 수 있습니다.만약 "bob" * 2를 "bobbob"으로 결정했다면, 코드는 다음과 같습니다.
class number: class string:
int n char array s
procedure double: procedure double:
n = n * 2 s = string_join(s,s)
그러면 실제 x 유형(숫자 또는 문자열)에 관계없이 x.double()을 호출할 수 있고 어떤 코드를 실행할지 알 수 있습니다. 그러면 코드가 크게 단순해집니다.모니터에서 정수, 문자열, 행렬, 복소수, 실수, 창 크기 등을 두 배로 늘릴 수 있습니다.
그리고 맞아요, C 라이브러리는 물체처럼 보이게 만들 수 있습니다.로는 ㅇstdio.h- 당신은 무슨 일이든 신경쓰지 않아요.FILE*사실은 특정한 방식으로 행동할 것이라는 사실을 가리킵니다. 그FILE*,fopen(),fclose()기타 함수는 C의 I/O 능력을 나타내는 종류입니다.
대부분의 OOO 언어로 절차적으로 프로그래밍할 수 있지만, OOO의 힘은 절차적 논리를 계승, 캡슐화 및 추상화할 수 있는 능력에서 비롯됩니다.맞아요, 도서관은 수업이랑 많이 닮아야 해요.고유한 범위를 가져야 하고 의미 있는 이름을 가진 기능 뒤에 논리를 캡슐화해야 합니다.
객체 지향 프로그램은 절차적 패러다임에 여러 가지로 기반을 두고 있다는 당신의 관찰이 맞습니다.구문론적으로 실제로 일어나는 모든 것이 함수를 호출하는 것이라는 점에서도 당신은 옳습니다.실제로 절차 메커니즘(예: C++의 함수 포인터)을 사용하여 객체 지향 언어의 많은 기능을 구현할 수 있습니다.따라서 객체 지향 설계를 수행하면서도 절차 언어로 구현할 수 있습니다(예: 이전 C++ 컴파일러가 했던 것처럼).
사물 지향적 패러다임의 중요성은 언어 메커니즘에서 사고와 디자인 과정에서의 중요성만큼 크지 않습니다.절차적 프로그래밍에서 생각하는 것은 운영과 다른 운영을 사용하여 이러한 운영을 분해하고 모듈로 그룹화하는 것 등입니다.이는 데이터 또는 상태가 부차적인 중요성에 해당함을 의미합니다.그것은 수학적 연산을 생각하는 것과 같습니다.
반면 객체 지향 패러다임은 상태와 운영을 하나의 개체로 함께 생각하고, 상태를 교환하고 운영을 활성화하는 개체 간의 상호 작용으로 프로그램을 설계해야 한다고 말합니다.
그 둘 사이의 차이는 미묘하지만 중대합니다.
절차 프로그램에서 모듈은 공유 데이터 구조에 저장된 읽기 및 쓰기 상태로 상호 작용합니다.
객체 지향 프로그램에서 객체 형태의 모듈은 다른 객체에 메시지를 전송함으로써 상호작용합니다.
IMHO, 객체 지향 프로그래밍은 절차적 프로그래밍보다 추상화 수준이 높은 개념입니다.OOO 프로그램의 개별 방법이 절차 프로그램의 개별 기능과 거의 동일하게 보인다는 점에서 이 둘은 상호 배타적이지 않습니다.이것은 예를 들어 완전히 다른 사고방식을 요구하는 기능적 프로그래밍과 대조됩니다.또한 모든 것을 정적으로 만들어 OO언어로 절차적으로 작성할 수 있습니다.많은 함수 포인터와 구조 포인터 캐스팅을 이용하여 인간 컴파일러가 되어 효율적으로 OO코드를 C로 작성할 수 있습니다.
따라서 OOO는 엄격한 정의보다는 디자인 철학과 세계관에 더 가깝습니다.코드를 구성할 때 주요 패턴으로 상속, 다형성 등을 사용해야 하며 낮은 수준의 트릭에 의존하지 않고 이러한 것들을 표현할 수 있도록 구문을 제공해야 합니다.데이터 집합 상태에 작용하는 코드를 그 자체로 존재하는 절차가 아니라 데이터의 속성으로 간주해야 합니다.그것은 흑백이 아닙니다.코드를 구조화하고 설명/이해하기 위한 수단으로서 상속, 다형성, 클래스 및 "데이터의 속성으로서의 메소드" 세계관에 얼마나 많이 의존하는지에 따라 코드는 "더 많이" 또는 "덜" OO가 될 수 있습니다.
OO는 대부분 마인드셋입니다.OOO를 C로 프로그래밍할 수 있으며(정말 원한다면...), C++/Java로 완벽하게 절차 코드를 가질 수 있습니다. 즉, 표면적으로 클래스를 사용하더라도 여전히 절차적일 수 있습니다.
OO의 이면에 있는 생각은 추상적인 상태입니다."데이터의 그룹화" 측면에서 "생각"하는 대신, "객체" 측면에서 "생각"하는 것입니다. 여기서 객체는 "데이터의 그룹화와 이 데이터를 조작하는 방법"을 위한 "인터페이스"입니다.
다 철학적으로 들립니다. 왜냐하면 그런 것이기 때문입니다.
여기에 할 말이 많고, 작은 SO 게시물로 다 말할 수는 없으니 여기에 남겨두겠습니다.
Flanagan의 답변에서 언급된 바와 같이, OO 언어는 이러한 추상화를 활용한 구조를 구현합니다.
구조, 기능, 함수 포인터 측면에서 클래스와 다형성을 기술적으로 "해킹"할 수 있습니다.
[pardon 프라이머 스타일, 늦었고 지쳤어요]
프로시저 데이터 처리 - 데이터 입력, 일부 프로시저 적용, 데이터 꺼내기
때로는 데이터 요소 중 일부가 다른 데이터 요소 중 일부와 연관되어 있기 때문에 이를 하나의 데이터 구조로 묶어서 하나의 단위로 조작하여 처리할 수 있습니다.
이제 우리의 절차는 데이터 구조를 입력으로 받아들이고 이를 변경하거나 다른 데이터 구조를 출력으로 생성할 수 있습니다.
때때로 우리는 일부 절차가 특정 종류의 데이터 구조에만 관련되어 있다는 것을 알아차립니다. 이러한 절차를 데이터 구조와 함께 그룹화하고 개체라고 부르는 것이 편리합니다.
객체를 만들기 위한 템플릿을 클래스라고 합니다. 객체는 클래스의 인스턴스라고 합니다.
한 클래스가 다른 클래스와 매우 비슷하다는 것을 알 수 있으므로 코드를 복사하여 붙여넣기하는 대신 한 클래스가 다른 클래스로부터 상속되도록 합니다. 즉, 서브 클래스는 슈퍼 클래스 또는 "기본 클래스"로부터 상속됩니다.이러한 방식으로 서브클래스는 슈퍼클래스의 모든 데이터 구조와 절차에 액세스할 수 있으며, 특정 방식으로 이를 확대하거나 재정의할 수 있습니다.
우리가 잔인하게 절차를 직접 부르지 않고 우리를 위해 무언가를 해달라고 정중하게 요청한다면, 이것은 실제 'message'가 전송되지 않더라도 메시지 전달이라고 불립니다.여기서의 즐거움은 많은 다른 종류의 물체들이 같은 메시지를 이해할 수 있다는 것이고, 이것은 다형성의 개념으로 이어집니다.예를 들어 다양한 종류의 문서에 인쇄를 요청할 수 있으며 각 문서가 적절하게 응답합니다.
메시지 전달 및 상속과 함께 객체(클래스를 통해 또는 그렇지 않은)를 지원하는 언어를 객체 지향 언어라고 합니다.상속이 없는 경우 언어는 개체 기반일 뿐입니다.
공부에 행운을 빌어요!
차이점은 절차와 관련 데이터가 같은 장소에 있다는 것입니다. 절차 언어는 절차와 관련 데이터를 분리하여 보관하는 '구조'(관련 데이터를 함께 보관하는 것)를 사용합니다.효과적으로, OO 언어로 하는 모든 일은 구조와 절차가 결합된 절차 언어로 가능해야 합니다.
주요 차이점은 OOO 언어가 프로그래머들을 투입하는 사고방식입니다.
절차는 프로그램이 수행해야 할 작업을 설명하는 여러 가지 방법 간의 절차적/기능적/논리적(또는 논리적) 구분(c, 리스프, 프롤로그 비교)의 일부입니다.
개체 방향은 이 다른 아이디어와 직교하며, 하위 프로그램을 데이터와 그룹화하는 방법을 설명합니다.C++와 java는 객체 지향적인 특징을 가진 절차 언어이고, fortran77은 객체 지향적인 특징이 없는 절차 언어입니다.공통 리스트는 개체 방향을 지원하지만 일부 오래된 리스트는 지원하지 않습니다.플레인 바닐라 프롤로그는 객체를 지원하지 않으며, 지원하는 논리 지향 언어를 이름 지을 수 없습니다(논리 지향 프로그래밍을 하지 않고, 여가 시간이 많을 때 해야 할 일 목록에 있습니다).기능적 프로그래밍을 거의 하지 않습니다.
그러나 다른 사람들이 지적했듯이, 적절한 대상 지향적 사고는 절차적인 것에서 기능적인 것으로의 전환만큼 프로그래밍을 하는 방법을 바꿉니다.
그건 그렇고, "절차"는 객체 지향적이지 않은 절차 언어와 객체 지향적이지 않은 형제를 구별하기 위해 많이 사용되는 것을 보지만, 이것은 "객체 지향적이지 않은"에 대한 명확한 형용사의 부족으로 인한 잘못된 사용이라고 생각합니다.YMMV.
문맥상 이해하기 쉽기 때문에, 언어들 사이에 도입되는 다른 추상화들을 살펴보세요.
어셈블리어와 C 또는 파스칼과 같은 절차어의 주요 차이점은 "절차" 추상화의 도입입니다.어셈블리 코드를 작성하는 사람들은 절차를 작성하지만, 절차 언어는 어렵고 오류가 발생하기 쉬우며, 절차 언어는 사용자에게 더 쉽게 만들 수 있는 도구를 제공합니다.
절차 언어와 C++와 같은 OO 언어의 차이점은 "객체" 추상화입니다."c"를 쓰는 사람들은 종종 개념적인 물체를 만들지만, 이 물체는 어렵고 오류가 나기 쉬우므로 OOO 언어를 사용하면 더 쉽게 만들 수 있습니다.
Microsoft(또는 Erlang)의 Sing#과 같은 것들은 메시지/프로세스 추상화를 언어에 추가합니다.네, C나 C++ 어셈블리로 메시지 전달과 프로세스 생성을 할 수 있지만, Sing#을 사용하면 더 쉬워집니다.
이 모든 것은 동일한 기계 코드로 귀결되는데, 이 추상화들은 컴퓨터가 아니라 순수하게 우리 뇌의 이익을 위한 것입니다.
절차 프로그램에서는 큰 문제를 작은 문제로 나누고, 이 작은 문제들을 각각 절차로 추상화합니다.이를 절차적 추상화(proceduclear Abstraction.
객체 지향 프로그램에서는 문제를 일부 객체로 분석하고 객체 간의 상호 작용을 분석합니다.이를 개체 추상화라고 합니다.
다른 점은
절차 지향 프로그래밍 - 데이터보다 알고리즘을 중시합니다.이러한 프로그래밍 방식은 절차, 즉 특정 작업을 수행하고 데이터 구조를 공유하는 방법에 집중합니다.이것은 하향식 구조를 따릅니다.
예제 : Pascal and C
객체 지향 프로그래밍 - 알고리즘보다 데이터를 중요시합니다.Bottom-up 구조를 따릅니다.모든 것을 하나의 물체로 봅니다.각 개체에는 고유한 데이터 구조와 절차가 있습니다.데이터 숨기기, 다형성, 캡슐화 및 메시지 전달과 같은 기능을 포함합니다.사용자는 프로그램에서 사용하는 동안 이러한 물체의 내부에 무엇이 들어 있는지 신경 쓸 필요가 없습니다.
예제: C++ 및 Java
이것은 단순한 대답입니다.
진정한 OO 언어에서 유일한 절차적 코딩은 객체 내부에서 이루어집니다.
C는 객체가 없고 C++는 객체를 지원하는 언어입니다.반면 자바는 모든 것이 대상입니다(원격은 제외).모든 것이 타이핑되어 있습니다.
- 선형 진행은 객체 내부에서 일어나지만 객체 자체는 코드와 데이터의 집합일 뿐입니다.
OOP를 정의하는 방법에 따라 다릅니다.객체에 메소드를 호출하는 Java 방식의 OOP에서는 절차적 프로그래밍이 거의 비슷합니다.C와 같은 절차 언어로 모든 OOP 원리(캡슐레이션, 추상화, 다형성, 상속)를 에뮬레이트할 수 있다고 생각합니다.이를 증명하는 것이 GOobject이며, Objective-C를 일부 확장하고 cPython과 같은 C를 사용하는 많은 다른 OOP 언어 구현입니다.이 작업은 구조물을 사용하고 기능을 사용하여 해당 구조물을 작동하여 수행됩니다.
typedef struct {
Object *isa;
String *name;
Date *birthday;
} Person;
Person *Person_new();
String *Person_name(Person *self);
void Person_setName(Person *self, String *newName);
// ...
인터페이스는 매우 OOP와 같습니다.다형성을 허용하지는 않지만, 가능할 수도 있습니다.속성이 "메소드"와 별개라는 점을 제외하면 파이썬 인터페이스와 매우 유사합니다.
class Person(object):
def __init__(self):
self._name = ""
self._age = datetime.datetime.now()
@property
def name(self):
return self._name
@property
def age(self):
return self._age
C 예에서와 같이 "self"가 명시적이기 때문에 파이썬을 예로 선택했습니다.자바와 같은 많은 OOP 언어들은 이것을 추상화합니다.
객체에 대한 호출 방식이 아닌 객체에 메시지가 전송되는 스몰토크(Smalltalk) 방식의 OOP도 있습니다.그 차이는 언뜻 보기에는 미묘하지만, 많은 힘과 유연성을 제공합니다.이는 목표-C에서 입증된 절차 언어로도 구현할 수 있습니다.
객체 지향 프로그래밍은 반드시 언어의 한 종류가 아니라 패러다임입니다.자바, 파이썬, 루비 등 객체 지향 언어는 객체를 쉽게 조작할 수 있도록 통사적 설탕을 제공하는데, 이것이 '절차적 언어'와 '객체 지향 언어'의 주요 차이점입니다.
실제로 라이브러리 또는 구조물에서 작동하는 함수들의 집합은 C++의 객체와 같습니다.사실 C++는 바로 그런 방식으로 구현됩니다.
여기에 이미 많은 흥미로운 점들이 언급되어 있습니다.
생각해 볼 수 있는 하나의 방법은 OO에서 '객체'라는 것, 즉 그 사물에 내재된 특성과 행동을 가지고 있는 것들에 대한 생각을 가지고 있다는 것입니다.이들은 일반적으로 자신에 대한 일부 정보를 검색할 수 있는 메커니즘을 제공하는 일종의 공개적인 '인터페이스'를 가지고 있지만, 객체 자체 또는 오히려 그 '클래스'는 공개적으로 사용할 수 있는 정보를 제한합니다.일반적으로 물체의 '후드 밑'에 있는 더러운 세부사항을 알 필요가 없기 때문에 물체의 내부는 대중에게 노출되지 않습니다.그래서 객체 지향 프로그램들은 다른 것들뿐만 아니라 이 구조물을 활용합니다.
절차적 프로그래밍은 일반적으로 이러한 데이터와 동작의 결합을 '객체'에 사용하지 않습니다.전에 C에서 한 것을 본 적이 있지만, C++로 할 수 있는 일을 대략적으로 설명하기에는 너무 많은 원숭이 사업을 포함하고 있지 않습니다.
객체 지향 개발의 배경이 되는 아이디어 중 하나는 제가 당신이 제공한 것 외에 다른 어떤 방법으로도 당신의 데이터를 가지고 놀아서는 안 된다는 것입니다.당신이 나에게 잘 생각한 인터페이스만 제공한다면, 당신은 나를 정직하게 유지할 수 있습니다.절차적인 접근 방식을 사용하고 있고 보호 장치가 내장되어 있지 않은 구조를 저에게 보내주신다면, 제가 원하는 대로 할 수 있고, 제가 바보이거나 사악한 사람이라면, 제가 변경하기를 원하지 않을 수도 있는 것들을 변경할 수 있습니다.
물론 영리하다면 대상을 우회할 수 있지만, 이를 위해서는 어쩔 수 없이 해야 합니다.
이것은 완전하지는 않지만, 하나의 측면입니다.
C++가 구현되는 방식은 OO 프로그래밍을 절차적 프로그래밍처럼 보이게 할 뿐입니다.당신은 생각을 조금 바꿀 필요가 있습니다.
C++ 객체에는 객체에 작용하는 절차일 뿐인 메소드가 있습니다.그러나 실제 OO 패러다임에서는 객체가 수신할 수 있는 잠재적인 메시지(즉, 문자)로서 메소드를 생각해야 합니다.개체는 메시지(파라미터는 메시지의 페이로드를 나타냅니다)를 수신하고 메시지를 기반으로 상태를 변경합니다.
절차와 OOO의 차이점을 직접 눈으로 확인할 수 있는 예를 보려면 Smalltalk(스몰토크)스몰토크에서는 모든 것을, 그리고 모든 것은 물건이라는 뜻입니다.if 문이나 while-loop이 없습니다.다른 개체에 메시지를 보내(메소드 호출이라고도 함) 이러한 기능을 달성할 수 있습니다.처음에는 정말 머리가 빙빙 돌지만, OO의 모습은 금방 알 수 있을 것 같습니다.
언급URL : https://stackoverflow.com/questions/530741/whats-the-difference-between-a-procedural-program-and-an-object-oriented-progra
'codememo' 카테고리의 다른 글
| 맞춤형 주문으로 결과를 얻는 방법은? (0) | 2023.09.20 |
|---|---|
| 우커머스 주문에서 패키지당 배송비를 어떻게 가져오나요? (0) | 2023.09.20 |
| 준비된 문은 어떻게 SQL 주입 공격으로부터 보호할 수 있습니까? (0) | 2023.09.20 |
| 카탈로그 가시성 설정 숨겨진 우-커머스 (0) | 2023.09.20 |
| 폰트 어썸(Chrome) 경고: "청렴도 불일치", "적절한" 값, "요청 자격 증명이 일치하지 않음" (0) | 2023.09.20 |