객체 방향에 필요한 기능은 무엇입니까?


9

언어 또는 라이브러리가 '객체 지향'으로 정의하기 위해 제공해야하는 기능이 정확히 무엇인지 궁금합니다. 객체 지향 은 적절한 기능을 가진 범용 프로그래밍 언어 에서 어느 정도 달성 될 수 있습니까? 아니면 객체 지향 프로그래밍을 지원한다고 구체적으로 광고하는 언어로만 달성 할 수 있습니까?

예를 들어 다음 C 코드를보십시오.

SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE);
SDL_FreeSurface( screen );

또는 여기에서 논의 된 코드 .

이제 위의 코드는 상속, 런타임 다형성 (?), 가상 함수 등을 사용하지 않습니다. 그러나 그것은 거의 OOP로 보입니다.

Object-Orientation은 프로그래밍 언어 또는 라이브러리 에서 제공하는 특별한 패턴이나 기능이 필요하지 않은 객체, 클래스, 구조체 등과 같이 생성 가능하고 파괴 가능한 데이터 구조를 기반으로 코드를 작성하는 것 입니까?


2
OOP에는 일반적으로 객체 가 필요 합니다 . 그러나 대부분의 언어에서 OOP보이는 코드 를 작성할 수 있습니다 ( "이 어셈블리는 OOP로 보입니다"라고 말할 수는 없습니다)
Raynos

위의 코드는 if 문이나 루프를 사용하지 않습니다 . 곱셈이나 덧셈을 사용하지 않습니다. 두 줄의 코드와 표시 되지 않은 항목을 사용하여 판단 할 수는 없습니다. 이 두 줄의 코드에서 나는 그것이 OO 언어가 아니라 엄청나게 게으른 기능적 프로그래밍 언어라고 추론 할 수 있습니다. 일반화의 일부로 두 줄의 코드를 사용하는 것은 실제 질문이 아닙니다.
S.Lott

링크 도 포함되어 위의 코드를 내가 따라 판단. 또한 그것이 아니라는 것을 유의 판단 , 난 묻는 이가 OOP로 간주 될 수 있는지를.
ApprenticeHacker

사소한 대답은 ' 예' 입니다. 내 요점은 이것입니다. 코드 예제에서 OOP에 대해 판단 할 수 없습니다. 사소한 정의 문제입니다. 언어가 OOP 언어로 정의 되었거나 그렇지 않습니다. 특정 코드 샘플에 모든 OOP 기능이 필요한 것은 아닙니다 . 실제로 OOP 코드는 매우 적은 기능을 사용할 수 있습니다. 예를 들어 파이썬에서는 1+2실제로 객체 지향적입니다. 기존의 두 개체에서 새 개체를 작성하는 생성자입니다. 코드 샘플을 사용하면 아무것도 드러나지 않습니다.
S.Lott

이 정의를 사용하고 언어 (두 코드 샘플이 아님) 와 비교할 때 무엇이 ​​문제입니까 ? en.wikipedia.org/wiki/…
S.Lott

답변:


11

"객체 지향"이라는 용어를 발명 한 Alan Kay에 따르면,

나에게 OOP는 메시징, 로컬 보존 및 상태 프로세스 숨기기 및 모든 것의 극단적 인 바인딩을 의미합니다. Smalltalk 및 LISP에서 수행 할 수 있습니다. 이것이 가능할 수있는 다른 시스템이있을 수 있지만 나는 그것들을 모른다.

메시징 (Smalltalk에서 구현 된)은 다형성과 비교할 수있는 개념이지만보다 강력합니다 (적어도 C ++ 또는 Java에서 지원하는 다형성보다). 모든 언어로 수행 할 수 있지만 언어에서 직접 지원하지 않으면 다소 고통 스럽습니다. 기본적으로 객체는 무엇이든 포함하는 메시지를 서로 보낼 수 있고 amd는 원하는 메시지에 반응 할 수 있습니다. 메시징을 완벽하게 지원하려면 소스 코드 (메소드 / 함수 정의의 기본 기능)에서 메시지를 열거하지 않고 유연하게 메시지에 응답 할 수있는 방법이 있어야합니다.

상태 프로세스의 로컬 보존 및 보호 및 숨기기 -AKA 캡슐화는 모든 언어에서 규칙에 따라 수행 할 수 있지만 다소 부정적입니다. 언어 수준의 로컬 보존은 실제로 모든 언어가 OO (및 공유하지 않는)라고 주장하는 모든 언어의 기능 중 하나 인 것 같습니다. 일반적으로 여러 인스턴스로 복합 데이터 유형을 만드는 방법이 있습니다. 반면에 보호와 숨기기는 종종 규칙에 의해서만 수행됩니다.

모든 일의 후기 바인딩 - C 인에 슬라이딩 스케일 정말 멀리 케이의 비전에서을 (자바가 훨씬 더 가까이있는 동안 같이, C ++)입니다. 가짜 일 수 있지만 (COM 참조) 사용하기가 어려울 것입니다.

Kay가 어떻게 상속을 언급하지 않는지 주목하라 . 그가 쓴 같은 이메일에서

나는 Simula I 또는 Simula 67이 상속을받는 방식이 마음에 들지 않았습니다 (Nygaard와 Dahl이 엄청난 사상가이자 디자이너라고 생각했지만). 그래서 상속을 더 잘 이해할 때까지 내장 기능으로 상속하지 않기로 결정했습니다.


4
정확히 어떻게 Java와 C #이 C ++보다 후기 바인딩에 더 가깝습니까?
fredoverflow

@FredOverflow : Java는 처음 사용될 때 런타임에 클래스 정의를 느리게로드하며 새 클래스를 쉽게 추가하거나 즉시 생성 할 수있는 매우 유연한 메커니즘을 통해 암시 적으로 수행합니다. C ++에서는 실행 파일을 다시 링크하거나 명시 적으로로드 라이브러리를 요구합니다. C #의 상황은 생각보다 명확하지 않은 것 같아서 ti에 대한 참조를 제거했습니다.
Michael Borgwardt

5

객체 지향 프로그래밍은 구문 기능이 아니라 코딩 및 디자인 철학입니다. 그 핵심에는 객체 의 개념이 있습니다. 객체의 역할을 수행하는 루틴 (또는 관점에 따라 메시지에 대한 응답)으로 상태를 그룹화하는 구성입니다. OOP의 또 다른 중요한 측면은 캡슐화입니다 . 구현 세부 사항을 불투명 구조로 랩핑하고이를 잘 정의 된 인터페이스를 통해 연결합니다. OOP 이론의 다른 모든 것들은이 두 가지 기본으로 돌아갑니다.

따라서 개체 (데이터와 코드를 모두 포함하는 엔터티)를 모델링하고 캡슐화 할 수있는 모든 언어를 사용하여 OOP를 수행 할 수 있습니다. 예를 들어 C에서는 함수 포인터를 사용하여 함수를 구조체에 저장하고 헤더 / 소스 파일 시스템을 사용하여 캡슐화를 실현할 수 있습니다. 편리하지는 않지만 OOP를 수행하기에 충분합니다. 아마도 Haskell이나 ML과 같은 것을 OOP하는 데 구부릴 수 있으며 누군가 어셈블리에서 OOP를하는 방법을 생각해 낼 수 있다면 놀라지 않을 것입니다.

그러나 실제로는 언어가 명시적인 객체 지향 프로그래밍을위한 완전한 구문 기능 세트를 제공하는 경우 '객체 지향'이라고 할 수 있습니다. 일반적으로 이는 이러한 언어에 다음과 같은 언어가 있어야한다는 것을 의미합니다.

결과적으로 OOP 원칙을 준수하고 사용 가능한 OOP 구문을 사용하는 경우 객체 지향 코드를 호출합니다.

BTW. 당신의 코드는, 아마도 않습니다 는 C 구문은 분명하지 않지만, 사용 다형성과 가상 함수. 나는 SDL의 전문가는 아니지만 SDL_surface각각 고유 한 구현 세트를 사용하여 다양한 유형의 표면을 나타낼 수 있기를 기대합니다 . 메모리 비트 맵에 무언가를 블리 팅하고 화면 표면에 블리 팅하는 것은 근본적으로 달라야합니다. 코드이지만 인터페이스 ( SDL_surface*인수를 인수로 취하는 함수 )는 동일하게 유지됩니다. 마찬가지로 캡슐화도 구현합니다. 표면의 기본 표현에 직접 액세스 할 수 없으며을 처리하는 방법을 알고있는 함수를 거쳐야 SDL_surface합니다. C에서 OOP를 수행하는 방법에 대한 좋은 예입니다.


추상 데이터 유형, 데이터 모델링 및 캡슐화는 OO에 고유하지 않습니다 (간단히 언급했듯이). 보다 고유 한 기능 (메소드 호출의 동적 바인딩, 해당 메소드 호출을 통한 다형성 등)을 기반으로 OO를 설명하고
싶습니다.

4

OO에 대한 나의 이해는 OO가 하나의 작업자 (객체) 또는 해당 작업자 사이의 메시지 전달을 통해 개별 작업자 (개체)의 협업에 의해 계산 작업을 수행 할 수 있다는 아이디어를 기반으로하는 사고 방식 및 구현이라는 것입니다. 런타임시 개체). 이 런타임 동작은이를 가능하게하기 위해 견고한 정적 및 동적 구성이 필요합니다.

OO를 구현하기위한 특정 구문은 언어가 OO인지 여부를 결정하는 키가 아닙니다. 예를 들어, 스몰 토크와 C #은 다른 구문을 가지고 있지만 둘 다 OO 언어입니다 (다양한 정도). 핵심은 주어진 언어가 철학을 유지하고 필요한 이식 수단을 제공하는지 여부입니다.


2

내가 학생이었을 때 나는 객체 지향 프로그래밍이 세 개의 기둥에 있다는 것을 배웠다 :

  • 캡슐화 ,
  • 다형성 , 및
  • 상속 .

언어는 객체 지향 언어로 간주되기 위해 이러한 기능지원 해야합니다 .

이것은 구문이 아닌 일련의 기능을 설명 합니다 . 따라서 글을 써야하는지 여부

type obj; // or type obj = new type;
obj.func(arg);

또는

type* ptr = create_type();
func(ptr, arg); 

중요하지 않습니다.

따라서 C의 객체 지향 패러다임에 따라 실제로 프로그램을 작성할 수 있습니다. 그러나 언어는 이것을 지원하지 않으므로 다소 고통스러운 운동이됩니다. 이것이 C가 객체 지향 언어로 간주되지 않는 이유입니다.


2
이 "기둥"을 가르치는 것은 아마도 세상에 선보다 더 해를 끼쳤을 것입니다. 캡슐화는 좋지만 그게 전부입니다.
tdammers

1
그들은이 목록에 있으므로 널리 받아 들여지는 것 같습니다 : en.wikipedia.org/wiki/…
S.Lott

왜 다형성과 상속이 나쁜지 설명 할 수 있습니까?
MathAttack

@MathAttack : 나와 대화하고 있습니까? 나는 확실히 그렇게 말하지 않았기 때문에.
sbi

1
@missingno : 패러다임을 구별하기 위해 중요한 것으로 간주되기 위해 어떤 패러다임에 고유 할 필요는 없습니다. 함수는 구조화 된 프로그래밍에 고유해야하므로 캡슐화는 더 이상 OOP에 고유하지 않아도됩니다.
sbi

2

당신은 할 수 있는 괜찮은 범용 언어로 OO을한다.

그건 쉽게 당신이 관용적 구조를 사용할 수 있고 같은에 의존 할 필요가 없기 때문에,에 "OO"언어로 그것을 할 C에서 OO 가능하지만 끔찍한입니다 -.

OO 구문이 언어 자체, 표준 라이브러리 또는 다른 라이브러리에 의해 제공되는지 여부는 중요하지 않습니다. 일부 언어 (예 : Scala)는 라이브러리가 언어 구문을 추가하여 프로그래머의 관점에서 볼 때 거의 불가능합니다. 핵심 언어가 제공하는 것과 라이브러리가 제공하는 것을 구별하기 위해.


2

OO로 널리 받아 들여진 언어와 그렇지 않은 언어의 범위를 살펴보면 포함 다형성 (일명 하위 유형 다형성)에 대한 지원 인 것 같습니다 . 그러나 포함 다형성은 Cardelli에서 종이 ) 저를 도입, 나는 다형성 종류의 분류에 다른 사람의 꽤 많이 생각한다. IE 일부 변수가 다른 유형의 값을 가질 가능성과 일부 호출이 하나 이상의 값 유형에 따라 다른 루틴으로 디스패치 할 가능성. 다른 모든 언어는 OO로 허용되지 않거나 OO로 잘 알려진 언어에서 누락되었습니다.

OO 언어와 관련된 두 가지 주요 특성은 OO 이외의 언어로 제공되었습니다.

  • 캡슐화는 Ada83에서 제공합니다.
  • 상속은 Oberon에 의해 제공됩니다 (Oberon은 흥미 롭습니다. Wirth는 가능한 한 부끄럽지 않은 OO 언어를 제공하고 싶었지만 그의 개념을 되살려 야했습니다-Oberon-2는 OO입니다).

1

객체 방향은 다음과 같이 정의됩니다

위키 백과 항목도 확인하십시오. 이것들은 언어가 객체 지향으로 정의하기 위해 제공해야하는 기능입니다.

코드가 객체 지향 프로그래밍 언어 인 경우 코드 객체 지향을 고려하십시오. 절차 적 인 것으로 보이는 것을 작성하더라도 캡슐화를 통해 다형성을 사용하는 클래스의 객체에서 메소드에 작용합니다.

마지막 질문과 관련하여 아마도 답이 될 것입니다. 예. 객체 지향은 기본적으로 객체의 메소드에 작용하고 해당 객체를 매개 변수로 전달합니다.


3
누구에 의해 정의?
Michael Borgwardt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.