2011-01-23 4 views
0

캡슐화의 개념과 구현에 문제가 있습니다.캡슐화 개념

누군가 나에게 설명해 줄 수 있습니까?

+0

어떤 문제가 있습니까? – Sarfraz

+0

질문이 있거나 문제가 있습니까? –

+0

무엇이 문제입니까? 당신이 이해하지 못하는 것에 대한 모범을 보여줄 수 있습니까? –

답변

10

캡슐화는 캡슐과 같은 기본 단어에서 온다는 것을 알게되면 적당히 쉬운 개념입니다.

이것은 단순히 정보를 담고있는 것입니다.

캡슐화는 클래스가 다른 사람이 사용하기 위해 필요한 것만 게시하고 더 이상 필요가 없다는 것을 의미합니다. 이를 정보 숨김이라고하며 클래스가 사용자 중 일부에 영향을 미치지 않고 완전히 내부를 변경할 수 있음을 의미합니다.

즉, 사전 클래스는 간단한 배열로 수명을 시작하고 단어의 이진 트리로 진행할 수 있고 심지어 데이터베이스 액세스 기능으로 인터페이스를 변경하지 않고도 사용할 수 있습니다.

개체 지향 세계에서 개체는 데이터와 데이터 조작에 사용되는 방법을 모두 보유하며 캡슐화의 절정입니다. 이 작업을 수행하는 한 가지 방법은 각 객체가 데이터를 조작하기 위해 호출 할 함수를 알고 있는지 확인하고 올바른 함수가 호출되는지 확인하는 것입니다. 예를 들어

가 여기 내 신화에 정수 목록을 유지하기위한 클래스이지만, 이상하게 파이썬 이해하는 것이 희망 쉬운 언어 :

class intlist: 
    private int val[10] 
    private bool used[10] 
    public constructor: 
     for i in 0..9: 
      used[i] = false 

    public function add (int v): 
     for i in 0..9: 
      if not used[i]: 
       used[i] = true 
       val[i] = v 
       return 
     throw intlist-full 

    public function del (int v): 
     for i in 0..9: 
      if used[i] and val[i] == v: 
       used[i] = false 
       return 
     throw intlist-invalid-value 

이제 여기에 명시된 정보 생성자이며, 추가 및 삭제를위한 두 가지 기능.

다른 모든 것들이 캡슐화 되었기 때문에 그것을 사용하는 코드를 깨지 않고 자유롭게 변경할 수 있습니다.

배열을 길게 만들 수 있습니다. 배열을 정렬하는 대신 배열 대신 이진 트리에 저장할 수 있습니다. 게시 된 API가 변경되지 않는 한 원하는대로 자유롭게 할 수 있습니다. 사실, 다른 코드를 깨뜨리지 않고 API에 추가 할 수 있습니다. 단지 의존하거나 삭제할 수 없습니다.


캡슐화가 개체 지향에서 새로운 것은 아닙니다. 모듈에서 정보가 숨겨져 있음을 보장함으로써 C에서 오래되었습니다. (일반적으로 소스 파일이나 개인 헤더가 포함 된 그룹).

사실, stdio.hFILE* 물건이 좋은 예입니다. 너는하지 않는다 care 포인터를 실제로 사용하는 모든 기능은 포인터를 사용하는 방법을 알고 있기 때문에 실제로 포인터 뒤에 무엇이 있는지.

+1

please 예를 들어 – mehdi1564

+0

좋아, 나는 꽤 고안된 예제를 추가했지만 그것은 내가 의미 한 바를 설명해야한다. – paxdiablo

7

link text

난 항상 사람들에게 설명을 대상으로 자신의 생각입니다. 다른 사람들은 당신의 웃음을 볼 수 있지만, 당신의 내면의 생각, 어쩌면 당신의 웃는 동안 이유를 알 수 있습니다.

2

캡슐화 - 단일 단위로 데이터를 래핑합니다. 또한 우리는 필수적인 세부 사항의 정보를 숨기라고 말할 수 있습니다. 예 휴대 전화가 있습니다 .... 휴대 전화와 상호 작용하는 데 도움이되는 인터페이스가 있으며 휴대 전화의 서비스를 사용할 수 있습니다. 그러나 실제로 휴대폰에서 일하는 것은 은신처입니다.내부적으로 어떻게 작동하는지 모르겠습니다.

숨기기/바인드 뭔가 : 예 : 숨기기/자체에 약간의 분말 형태를 결합 (V r에 병이 때 소비) 캡슐은 ,, 캡슐 분말이 포함 된 캡슐화 것을 의미한다.

데이터 및 동작의 바인딩 즉 안전하고 제어 된 방식으로 개체의 기능성. 포장까지 하나의 유닛으로 함께 데이터 부재 및 방법 (즉, 클래스)이다 클래스는 클래스 변수/외 D 클래스의 기능을 숨기 때문에

또는 캡슐화 제일 예

캡슐화 .. 클래스이며 캡슐화 (Encapsulation).

예 : 캡슐을 고려할 수 있습니다. 캡슐화는 객체의 내부 세부 사항, 즉 객체가 어떻게 동작하는지 숨기는 것을 의미합니다. 여기서 캡슐은 많은 것들이 담긴 하나의 단위입니다. 그러나 우리는 측면 캡슐 안에 무엇이 있는지 볼 수 없습니다.

이것은 다른 개체에서 개체에 대한 정보를 보호하는 데 사용되는 기술입니다. 변수와 마찬가지로 private과 property를 Public으로 설정할 수 있습니다. 우리가 부동산에 접근하면 우리는 그것을 확인하고 설정합니다.

다른 예제를 살펴볼 수 있습니다. 우리의 랩탑. 우리는 랩탑을 사용할 수 있지만, 우리가 모르고있는 내부에서 어떤 작업이 일어나고 있는지를 알 수 있습니다. 그러나 우리는 그것을 사용할 수 있습니다. 모바일, TV 등과 동일합니다.

관련 속성, 메서드 및 기타 멤버 그룹은 단일 단위 또는 개체로 취급됩니다. 캡슐화 된 개체는 종종 추상 데이터 형식이라고합니다.

캡슐화를 사용할 수있는 몇 가지 다른 방법이 있습니다. 예를 들어 인터페이스 사용법을 예로들 수 있습니다. 인터페이스는 구현 된 클래스의 정보를 숨기는 데 사용할 수 있습니다. 공공

public string LegName 
{ 
    get 
    { 
    return _LegName; 
    } 
    set 
    { 
    _LegName=value; 
    } 

public class LegMain 
{ 
    public static int Main(string[] args) 
    { 
    Leg L= new Leg(); 
    d.LegName="Right Leg"; 
    Console.WriteLine("The Legis :{0}",d.LegName);return 0; 
    } 
    } 

참고로

// 같은 개인

private string _LegName; 

// 속성 집합 선언 : 캡슐화는 우발적 인 손상으로부터 데이터를 보호 할 수있는 방법을 제공합니다.

1

캡슐화 클래스 단지 정의 접근 및 뮤 테이터 방법보다 더 주셔서 감사합니다. 이것은 클래스 간의 상호 의존성을 최소화하는 것으로 구성된 객체 지향 프로그래밍의 더 넓은 개념이며 일반적으로 정보 은닉을 통해 구현됩니다.

캡슐화의 아름다움은 사용자에게 영향을 미치지 않으면 서 변화하는 것의 힘입니다.

Java와 같은 객체 지향 프로그래밍 언어에서는 액세스 가능성 수정 자 (public, protected, private, package private를 나타내는 수정 자 없음)를 사용하여 세부 정보를 숨김으로써 캡슐화를 구현합니다. 이러한 접근성 수준을 사용하면 캡슐화 수준을 제어 할 수 있으며 레벨이 덜 제한적 일 때 더 많은 비용이 발생하며 클래스가 다른 종속 클래스 (예 : 사용자 클래스, 하위 클래스)와 더 많이 결합됩니다.

그러므로 목표는 데이터 자체를 숨기는 것이 아니라이 데이터가 어떻게 조작되는지 구현 세부 사항입니다.

아이디어는이 데이터에 액세스 할 수있는 공용 인터페이스를 제공하는 것입니다. 나중에 클래스의 공용 인터페이스를 손상시키지 않고 데이터의 내부 표현을 변경할 수 있습니다. 반대로 데이터 자체를 노출하면 캡슐화가 위험 해 지므로 사용자에게 영향을주지 않고 데이터를 조작하는 방식을 변경할 수있는 역량이 생깁니다. 클래스의 공용 인터페이스가 아닌 데이터 자체에 대한 종속성을 작성합니다. "변화"가 마침내 당신을 발견 할 때 당신은 곤경에 대한 완벽한 칵테일을 만들 것입니다.

필드에 대한 액세스를 캡슐화하는 데는 여러 가지 이유가 있습니다. 조슈아 블로흐 (Joshua Bloch)의 "Effective Java"항목 14 : 클래스와 멤버의 접근성을 최소화하면서 여기에서 인용 할 몇 가지 중요한 이유에 대해 언급합니다.

필드에 저장할 수있는 값을 제한 할 수 있습니다 F 또는 M이되어야 함). 필드가 수정되면 (이벤트 트리거, 유효성 검사 등) 작업을 수행 할 수 있습니다. 메서드를 동기화하여 스레드 안전을 제공 할 수 있습니다. 새 데이터 표현으로 전환 할 수 있습니다 (계산 된 필드, 다른 데이터 유형) 그러나 캡슐화는 필드를 숨기는 것 이상입니다. Java에서는 전체 클래스의 숨김을 통해 전체 API의 구현 세부 사항을 숨길 수 있습니다. 예를 들어 Arrays.asList() 메서드를 생각해보십시오. List 구현을 반환하지만 List 인터페이스를 충족하는 한 어떤 구현이든 상관하지 않습니다. 구현은 나중에 메소드의 사용자에게 영향을주지 않고 변경 될 수 있습니다.

내 생각에 지금 캡슐화

의 아름다움, 정말 캡슐화를 이해하기 위해, 하나는 최초의 추상화를 이해해야합니다.

예를 들어 자동차 개념의 추상화 수준을 생각해보십시오. 자동차는 내부 구현이 복잡합니다.

그러나 우리는 추상화를 단순화했으며, 우리는 추상화의 공개 인터페이스를 통해 세계의 모든 자동차와 상호 작용합니다. 우리는 모든 자동차에는 방향을 제어하는 ​​스티어링 휠이 있습니다. 페달을 밟으면 자동차를 가속화하고 속도를 제어하고 페달을 밟으면 멈추게하고 페달을 밟으면 기어가 생깁니다. 스틱을 사용하면 앞으로 또는 뒤로 이동할 수 있습니다. 이러한 기능은 자동차 추상화의 공개 인터페이스를 구성합니다. 아침에 세단을 운전하고 나서 빠져 나와 같은 오후에 SUV를 운전할 수 있습니다.

그러나 우리 중 일부는 이러한 모든 기능이 어떻게 구현되는지에 대해 자세히 알지 못합니다. 자동차에 유압 시스템이없는 시간을 생각해보십시오. 어느 날, 자동차 제조사가 그것을 발명했고, 거기에서 자동차에 넣기로 결정합니다. 그래도 사용자와 상호 작용하는 방식은 변경되지 않았습니다. 기껏해야, 사용자는 지향성 시스템의 사용에있어 개선을 경험했습니다. 자동차의 내부 구현이 캡슐화되었으므로 이와 같은 변경이 가능했습니다. 변경 사항은 공용 인터페이스에 영향을주지 않고 안전하게 수행 할 수 있습니다.

이제 자동차 제조사가 차 밑에 연료 캡을 넣고 그 옆에 연료 뚜껑을 놓기로 결정했다고 생각합니다. 가서 새 차를 사면 가스가 떨어지면 주유소에 가고 연료 뚜껑을 찾지 못한다. 갑자기 차 밑에 있다는 것을 알았지 만 가스 펌프 호스로 연결할 수는 없습니다. 이제 우리는 공개 인터페이스 계약을 맺었습니다. 따라서 전 세계가 고장났습니다. 예상대로 작동하지 않기 때문에 붕괴됩니다. 이와 같은 변화는 수백만 달러에 달합니다. 우리는 세계의 모든 가스 펌프를 교체해야합니다. 캡슐화를 끊을 때 우리는 가격을 지불해야합니다.

캡슐화의 목표는 상호 의존성을 최소화하고 변경을 용이하게하는 것입니다. 구현 세부 사항의 노출을 최소화하여 캡슐화를 극대화합니다. 클래스의 상태는 공용 인터페이스를 통해서만 액세스해야합니다.

저는 Alan Snyder의 객체 지향 프로그래밍 언어에서 캡슐화 및 상속이라는 논문을 읽는 것이 좋습니다. 이 링크는 ACM의 원본 문서를 가리키고 있지만 Google을 통해 PDF 사본을 찾을 수있을 것으로 확신합니다.