2013-05-20 2 views
2

나는 캡슐화의 개념에 대한 완전한 설명을 검색하며 발견 된 답은 어떻게 든 퍼즐 조각과 같아야한다는 것을 알 수 있습니다. 나는이 개념의 fallowing 설명을 발견 :절차 및 OO 캡슐화

캡슐화가 개인 클래스의 필드를 만들고 public 메소드를 통해 필드에 대한 액세스를 제공하는 기술이다. 필드가 이 비공개로 선언 된 경우 클래스 외부의 누구도 액세스 할 수 없으므로 이므로 클래스 내의 필드를 숨 깁니다. 이러한 이유 때문에 캡슐화는 데이터 숨김이라고도합니다. 데이터상에서 동작 (소스 tutorialspoint)

객체의 의 일부 구성 요소에 데이터 방법 (또는 다른 기능들)와 에게의 번들링을 용이 언어 구조에 접근을 제한하기위한 언어기구. (소스 wikipedia)

캡슐화를 사용하면 객체가 해당 인터페이스를 구현과 분리 할 수 ​​있습니다. 객체 및 객체의 구현 코드는 인터페이스 뒤에 숨겨져 있습니다.

캡슐화는 기술입니다. 추상화에 도움이 될 수도 그렇지 않을 수도 있지만 정보 숨기기 및/또는 조직에 대해서는 분명합니다. 데이터와 함수가 어떤 식 으로든 그룹화되도록 요구합니다. 물론 좋은 OOP 연습을 위해서는 추상화로 그룹화해야합니다. 그러나, 단지 절차 적 프로그래밍에서
유지 보수 등 (소스 stackoverflow)

에 도움을 다른 용도는 주로 내가 생각 같은 여기에 가장 좋은 예는 만들거나 수정하는 FILE 구조체가 거기있다 파일 기능.

API 또는 인터뷰 질문을 특별히 디자인 할 때 매우 유용하기 때문에이 프로그래밍 개념의 완전한 이미지를 얻기 위해 추가 할 수있는 것이 무엇인지 궁금합니다.

+0

무엇이 문제입니까? – user2246674

답변

3

당신은 맞다 : 캡슐화이 숨어있는 정보의 원리를 구현할 수 있습니다함으로써 컴퓨터 과학의 다양한 부분에, 심지어 다른 분야에서 발견되는 일반적인 기술이다.

FILE 포인터는 이미 언급했습니다. 또 다른 간단한 C 예는 선언하지 않고 구조체에 대한 포인터를 기대하는 API입니다. 인터페이스 사용자은이 구조체가 구현 된 방법을 알 필요가 없으며 인터페이스 구현 만 알고 있어야합니다. 따라서 구조체의 정보는 포인터를 전달하는 동작으로 구조체 정보가 전달되는 원하는 동작을 캡슐화하여 숨겨집니다.

또 다른 예는 네트워크 프로토콜입니다.이 페이지를 요청할 때 브라우저는 HTTP를 사용하고 차례로 TCP (Transfer Control Protocol)를 사용합니다. 아래 레벨에는 페이로드가있는 인터넷 프로토콜 IP 만 있고 TCP는 없습니다. 여기서 TCP는 IP 페이로드에 캡슐화 된 불필요한 정보 일뿐입니다. 아래 레벨에서 IP는 없지만 MAC 및 IP는 MAC 페이로드에 캡슐화 된 불필요한 정보입니다.

어쩌면 약간 멀리 가져온 실제 예 : 우편으로 테디 베어 보내기. 우편 서비스의 인터페이스에는 주소 정보가있는 상자가 필요합니다. 상자 안을 들여다 보지 않고 곰을 보지 않을 것입니다. 수령인이 패키지를 받으면 그는 그것을 열고 곰과 껴안을 수 있습니다. 이제 우편 서비스가 당신에게 테디 베어를 보내기 위해 계획되었다고 상상해보십시오. 이 인터페이스 (곰 + 주소)는 얼마나 재사용 가능합니까? 작은. 대신 추상화를 적용하고 인터페이스 (상자 + 주소)를 만듭니다. 그리고 테디 베어를 상자에 넣어서 캡슐화를 적용하여 실제로 테디 베어를 보내는 정보를 숨 깁니다. 불쌍한 테디.

+0

답변 해 주셔서 감사합니다. 나는 나의 질문에 아주 명확하지 않다는 것을 안다. 그러나 당신의 처음 2 예는 매우 좋다. 나는이 주제 (캡슐화)에 관해서 몇몇 친구들과 논쟁을하고 있었고 그들은 OOP 개념으로 캡슐화에 대해서도 말하고 있었고 어떤 곳에서는 인터넷에서 캡슐화의 개념이 절차 적 프로그래밍을위한 것이 아니라고 생각했다. –

+0

그것은 직업의 인터뷰에 대해 자주 묻는 질문이며 대다수의 사람 (나를 포함해서)이 불완전하다고 대답했다고 생각합니다. –

+0

부수적으로, 이와 같은 주제에 대해 토론하면이 흥미로운 것을 알 수 있습니다. 프로그래밍은 [GObject] (https : //developer.gnome.)에서 Java와 같은 객체 지향 언어로만 수행 할 수 있습니다.org/gobject/stable /)는 C로 완전히 작성된 매우 광범위한 객체 시스템이다. [Vala] (https://live.gnome.org/Vala)라고 불리는 객체 지향 언어도있다. GObject를 사용하는 코드. 따라서 OOP의 개념은 객체 지향 언어가 아닌 언어에서도 사용될 수 있습니다. 지금은 더 어렵거나 덜 읽기 쉽습니다. –

0

나는 바보 같은 간단한 예를 들어 설명 할 것이다. 동그라미 클래스를 정의 해 보겠습니다. 반경이 외부에서 직접 액세스 할 수없는 비공개 필드 인 방법에 유의하십시오. 캡슐화입니다. 개체의

public class Circle { 
    private double diameter; 

    public Circle(double radius) { 
     this.diameter = radius * 2; 
    } 

    public double getRadius() { 
     return diameter/2; 
    } 

    public double getPerimeter() { 
     return diameter * Math.PI; 
    } 
} 

상태는 이제 다르게 표현된다 : 캡슐화 클래스는 이러한 다른 클래스와 클라이언트를 파괴하지 않고, 설계 및 이미 다른 클래스에 의해 사용 된 후에 당신의 마음을 변경 할 수 있습니다. 그러나이 상태가 객체에 캡슐화되고 객체의 인터페이스 (공용 메소드)가 변경되지 않기 때문에 클라이언트는 아무 것도 변경되지 않은 것처럼 객체를 계속 사용할 수 있습니다.

캡슐화를 사용하지 않고 반지름 필드를 공개로 설정 한 경우 이미 클래스를 사용하는 모든 사용자가 반지름 필드를 사용하므로 반지름을 제거하고 직경을 대체하여 클래스 구현을 변경할 수 없습니다.

2

캡슐화는 모두 잘 정의 된 응집력이 강한 부분에서 시스템/응용 프로그램을 분할하는 것과 관련이 있습니다. 함수/프로 시저를 만드는 간단한 사실은 캡슐화입니다.

OOP 언어는 일반적으로 가시성 수정 기호 (정보 은닉 원칙)와 같이 캡슐화를 향상/달성하는 방법을 제공합니다.

캡슐화는 OO가 기반으로하는 핵심 원칙 중 하나이므로 많은 사람들이 독점적으로 OO 기능이라는 잘못된 생각을 가지고 있습니다.

또 다른 것은, 이것은 잘못된 것입니다 :

캡슐화 개인 클래스의 필드를 만들고 public 메소드를 통해 필드에 대한 액세스를 제공하는 기술이다.

이것은 정보 숨기기 원칙입니다. 입니다.

+0

"2"단어로 말할 것입니다 : '캡슐화 = 정보 숨기기 원칙 + 개방형 원칙' –

+0

나는 캡슐화가 OCP를 달성하는 방법이라고 말하고 싶습니다. –