OOP는 캡슐화를 발명하지 않았으며 캡슐화와 동의어가 아닙니다. 많은 OOP 언어에는 C ++ / Java 스타일 액세스 수정자가 없습니다. 많은 비 OOP 언어에는 캡슐화를 제공하는 다양한 기술이 있습니다.
캡슐화를위한 하나의 고전적인 접근 방식 은 함수형 프로그래밍에 사용되는 클로저 입니다. 이것은 OOP보다 상당히 오래되었지만 동등한 방식입니다. 예를 들어 JavaScript에서 다음과 같은 객체를 만들 수 있습니다.
function Adder(x) {
this.add = function add(y) {
return x + y;
}
}
var plus2 = new Adder(2);
plus2.add(7); //=> 9
위의 plus2
개체에는 직접 액세스 할 수있는 멤버가 없으며 x
완전히 캡슐화되어 있습니다. add()
방법은 이상 폐쇄입니다 x
변수입니다.
C의 언어는을 통해 캡슐화의 어떤 종류를 지원하는 헤더 파일 메커니즘, 특히 불투명 한 포인터 기술. C에서는 멤버를 정의하지 않고 구조체 이름을 선언 할 수 있습니다. 이 시점에서 해당 구조체 유형의 변수를 사용할 수 없지만 구조체 포인터의 크기가 컴파일 타임에 알려지기 때문에 구조체에 대한 포인터를 자유롭게 사용할 수 있습니다. 예를 들어 다음 헤더 파일을 고려하십시오.
#ifndef ADDER_H
#define ADDER_H
typedef struct AdderImpl *Adder;
Adder Adder_new(int x);
void Adder_free(Adder self);
int Adder_add(Adder self, int y);
#endif
이제이 Adder 인터페이스를 사용하여 해당 필드에 액세스하지 않고도 다음과 같은 코드를 작성할 수 있습니다.
Adder plus2 = Adder_new(2);
if (!plus2) abort();
printf("%d\n", Adder_add(plus2, 7)); /* => 9 */
Adder_free(plus2);
그리고 다음은 완전히 캡슐화 된 구현 세부 사항입니다.
#include "adder.h"
struct AdderImpl { int x; };
Adder Adder_new(int x) {
Adder self = malloc(sizeof *self);
if (!self) return NULL;
self->x = x;
return self;
}
void Adder_free(Adder self) {
free(self);
}
int Adder_add(Adder self, int y) {
return self->x + y;
}
모듈 수준 인터페이스에 중점을 둔 모듈 형 프로그래밍 언어 클래스도 있습니다. ML 언어 패밀리 포함 OCaml에는 functors 라는 모듈에 대한 흥미로운 접근 방식이 포함되어 있습니다 . OOP는 그림자가 많고 대체로 모듈화 된 프로그래밍이지만, OOP의 많은 장점은 객체 지향보다 모듈화에 관한 것입니다.
또한 C ++ 또는 Java와 같은 OOP 언어의 클래스는 객체 (늦은 바인딩 / 동적 디스패치를 통해 작업을 해결하는 엔티티의 의미)가 아니라 추상 데이터 유형 (우리가 숨기는 공개 인터페이스를 정의하는 경우 )에 사용되는 경우가 종종 있습니다. 내부 구현 세부 사항). Reisited Data Abstraction, Revisited (Cook, 2009) 논문 에서 이러한 차이점에 대해 자세히 설명합니다.
그러나 많은 언어에는 캡슐화 메커니즘이 없습니다. 이 언어에서 구조 멤버는 공개됩니다. 기껏해야 사용을 권장하지 않는 명명 규칙이있을 것입니다. 예를 들어 Pascal에는 유용한 캡슐화 메커니즘이 없었습니다.