2011-02-11 4 views
7

가능한 중복 : 정확하게 자바에서 캡슐화와 추상화의 차이점은 무엇입니까
difference between abstraction and encapsulation?추상화와 캡슐화의 차이점은 무엇입니까?

? 모든 간단한 예제도 감사하겠습니다.

+4

가능한 중복 항목 : http://stackoverflow.com/questions/742341/difference-between-abstraction-and-encapsulation 및 http://stackoverflow.com/questions/3362335/difference-between-encapsulation-and-abstraction- 개념 –

+0

질문 제목의 오타를 수정하십시오. 환호 –

+0

이 숙제가 있습니까? 그렇다면 숙제 태그를 추가하십시오. –

답변

8

추상화와 캡슐화는 멋진 맛을 나타내는 두 가지 큰 맛입니다.

캡슐화은 코드 사용자에게 노출되는 것을 최소화합니다. "사용자"는 나머지 코드이거나 게시하는 코드를 사용하는 사용자 일 수 있습니다. 캡슐화에

이 몇 가지 확실한 혜택 :

  • 코드의 사용자가 변경할 가능성이 프로그램의 일부에 의존하지 않습니다. 프로그램을 변경하면 코드를 변경할 필요가 없습니다.
  • 프로그램 수명주기 동안 코드와 상태가 어떻게 변하는지를보다 정확히 제어 할 수 있습니다. 대신, numberOfSpots 노출의

    public class Giraffe 
    { 
        public Giraffe(int heightInFeet) 
        { 
         this.heightInFeet = heightInFeet; 
         this.numberOfSpots = heightInFeet * 72; 
        } 
    
        public override string ToString() 
        { 
         return "Height: " + heightInFeet + " feet" 
          + " Number of Spots: " + numberOfSpots; 
        } 
    
        private int heightInFeet; 
        private int numberOfSpots; 
    } 
    

    : 당신은 더 적은 시나리오를 처리해야하며,

내가 자바를 모르는 해결하기 위해 적은 수의 예상치 못한 문제가되지만, 여기에 C#에서 캡슐화의 작은 예입니다 클래스 내에 캡슐화되고 ToString 메소드를 통해 노출됩니다.

추상화은 확장 점을 사용하여 정확한 코드가 실행되는 다른 부분으로 지연되도록합니다. 이 선택은 프로그램의 다른 곳에서, 다른 프로그램에서, 또는 런타임에 동적으로 만들 수 있습니다.

추상화에도 강한 장점이 있습니다 : 당신은 추상화를 구현하는 코드를 변경하면 추상화의 사용자가 자신의 코드를 변경할 필요가 없습니다

  • . 추상화가 변경되지 않는 한 사용자는 코드를 변경할 필요가 없습니다.
  • 추상화를 사용하는 코드를 작성하면 해당 추상화를 구현하는 새 코드에 대해 재사용 할 수있는 코드를 한 번 작성할 수 있습니다. 더 적은 코드를 작성하여 더 많은 작업을 수행 할 수 있습니다.

C#에서 많이 사용되는 추상화는 IEnumerable입니다. 목록, 배열, 사전 및 다른 유형의 컬렉션 클래스는 모두 IEnumerable을 구현합니다. 내가 그랬던 것처럼,

public interface IAnimal 
{ 
    bool IsHealthy { get; } 
    void Eat(IAnimal otherAnimal); 
} 

public class Lion : IAnimal 
{ 
    public Lion() 
    { 
     this.isHealthy = true; 
    } 

    public bool IsHealthy 
    { 
     get { return isHealthy; } 
    } 

    void Eat(IAnimal otherAnimal) 
    { 
     if(otherAnimal.IsHealthy && !(otherAnimal is SlimeMold)) 
     { 
      isHealthy = true; 
     } 
     else 
     { 
      isHealthy = false; 
     } 
    } 

    private bool isHealthy; 
} 

IAnimal someAnimal = PullAnAnimalOutOfAWoodenCrate(); 

Console.WriteLine("The animal is healthy?: " + someAnimal.IsHealthy); 

당신은 함께 모두 사용할 수 있습니다 :

public IEnumerable<int> GetSomeCollection() 
{ 
    // This could return any type of int collection. Here it returns an array 
    return new int[] { 5, 12, 7, 14, 2, 3, 7, 99 }; 
} 

IEnumerable<int> someCollectionOfInts = GetSomeCollection(); 

IEnumerable<string> itemsLessThanFive = from i in someCollectionOfInts 
             where i < 5 
             select i.ToString(); 

foreach(string item in itemsLessThanFive) 
{ 
    Console.WriteLine(item); 
} 

당신은 쉽게, 너무 자신의 추상화를 쓸 수 있습니다 다음 foreach 루프 구조와 LINQ 라이브러리의 전체가 그 추상화를 기반으로 IAnimalIsHealthy입니다. IAnimal은 약식이며 get 접근 자만 있고 IsHealthyset 접근 자 없음은 캡슐화입니다.

4

캡슐화는 멤버 변수 또는 메서드를 외부 세계로부터 보호합니다.

추상화는 특정 구현 방법입니다. 즉, 사용할 구현은 사용자에게 알려지지 않습니다.

6

이 두 개념은 상당히 다릅니다.

추상화는 기본 클래스를 '추상화'한 다음 기능을 확장하는 관행입니다. 추상 클래스는 구체적인 문제에 존재하지 않는 것입니다. 그 유일한 목적은 확장되어야한다는 것입니다. 다른 종을 대표하는 수업을 작성하는 경우를 생각해보십시오. 모든 다른 종족은 공통된 속성을 모두 동물로 공유하기 때문에 추상 동물 클래스를 확장 할 수 있습니다. 그러나 세계에서 보는 모든 동물은 다람쥐, 개, 또는 물고기 ... 또는 그 기본, 추상적 인 동물 클래스의 구체적인 구현이기 때문에 동물 개체를 인스턴스화하지 않습니다.

캡슐화는 클래스 변수를 비공개로 설정 한 다음 get 및 set 메서드에서 액세스를 허용하는 관행입니다. 이 방법의 목적은 데이터에 액세스하는 방식과 구현 방식에 따라 다릅니다. 예를 들어 요구 사항이있는 변수가있을 때마다 변수가 변경 될 때마다 두 번째 변수가 1 씩 증가하므로 해당 기능을 캡슐화합니다. 그렇게하면 원래 변수에 액세스 할 때마다 규칙을 준수해야한다는 것을 기억할 필요가 없기 때문에 코드가 더 안정적입니다.

특정 코드 예제를 원한다면 Google 검색을 사용하는 것이 좋습니다. 사용 가능한 많은 예제가 있기 때문입니다. 여기에 두 가지이다 :

http://www.tutorialspoint.com/java/java_abstraction.htm http://www.tutorialspoint.com/java/java_encapsulation.htm

+0

안녕하세요. Herminator 님의 답변에 감사드립니다. DTO는 캡슐화의 한 예입니다. –

3

캡슐화 추상화의 일부입니다. 추상화의 개념은 다른 객체를 나타내는 객체를 만드는 것입니다. 일반적으로 원본 객체는 추상화보다 복잡합니다. 따라서 추상화는 일반적으로 기억에 도움이되는 용어/의사 소통 등의 표현입니다. 이와 같이 생각하십시오. 추상 예술은 다른 것을 표현한 것입니다. 스티어링 휠, 기어 변속기 및 2/3 페달은 자동차 작동 원리를 추상화 한 것입니다.

기본적으로 추상화를 사용하면 많은 세부 사항이 포함 된 복잡한 것을 뭔가 더 간단하게 표현할 수 있습니다. 내 견해로 이것은인지 과학에서 '청킹'과 관련이있다. 우리는 머리 속에 복잡한 것을 유지할 수 없으므로 추상화를 통해 단순화 한 다음 추상화를 사용하여 단순화합니다. 디자인 패턴은 또 다른 좋은 예입니다. 세부 사항에 대해 이야기하는 대신 명령, 주 또는 전략 패턴 등에 대해 이야기 할 수 있습니다.

캡슐화는 추상화의 형성/생성의 일부입니다. 객체의 인터페이스가 작을수록 쉽게 추출 할 수 있습니다. 엔진과 기어 박스가 자동차를 운전하는 방법을 알 필요가 없으며 추상화 (기어 변속 및 가속기)를 이해해야합니다. 추상화를 생성하기 위해 엔진과 기어 박스의 세부 사항이 캡슐화됩니다 (인터페이스로).

캡슐화는 추상화에 필요합니다. 왜냐하면 abstaction이 모든 실제 세부 사항 및 복잡성 (그렇지 않으면 추상화가 아닌)을 처리 할 수 ​​없기 때문입니다. 따라서 기어 변속기는 기어 박스의 불완전한 표현 (또는 모델)이지만 일상적으로 사용하기에 충분합니다. 캡슐화는보다 단순한 표현을 생성하는 데 필요한 '숨겨진 세부 정보'로 생각할 수 있습니다.

'인터페이스'개념을 논의하는 것도 중요합니다. 대부분의 경우, '인터페이스'와 '추상화'라는 용어는이 경우 더 쉽게 교환 할 수 없습니다. 인터페이스는 사용자가 거래하거나 상호 작용하는 시스템의 일부입니다. 자동차와의 인터페이스는 스티어링 휠, 기어 시프트 및 페달 등입니다. 추상화는 인터페이스를 생성합니다. 당신은 엔진/기어 박스를 직접 다루지 않고 각각의 인터페이스를 다룹니다.

캡슐화의 또 다른 이유는 불완전한 모델/추상화를 다루기 때문에 원본의 전체적인 복잡성을 이해하지 못하고 모든 변수를 처리 할 수 ​​없다는 것입니다. 전체 모델을 이해하지 못함). 이것은 추상화없이 상호 작용하는 구성 요소가 서로에 대해 너무 많이 알기 때문에 디커플링에 중요합니다. 모든 자동차에는 스티어링 휠, 페달 및 기어 변속기가 있기 때문에 엔진 유형 등과 관계없이 모든 차량을 운전할 수 있습니다. 또한 기어 박스는 엔진에서 추출됩니다. 그렇지 않으면 각 맞춤 엔진에 맞춤식 기어 박스가 필요합니다.

마찬가지로 클래스는 추상화입니다. 클래스는 인터페이스 (클래스의 public 멤버)를 통해 복잡한 모델을 나타냅니다. 이 인터페이스는 캡슐화를 통해 만들어집니다. 이 클래스는보다 복잡한 구현 방법을 공동 작업자에게 단순화 된 인터페이스로 제공합니다. 당신은 또한 그것을 '알 필요'상황으로 생각할 수 있습니다. 수업의 공동 작업자는 그것이 어떻게 작동하는지 정확히 알 필요가 없습니다. 자동차 운전을 위해 엔진이 어떻게 작동하는지 알 필요가 없듯이.

캡슐화, 인터페이스 및 추상화는 응집력과 결합 및 코드 유지 관리에 중요한 역할을합니다. 좋은 추상화를 만들지 않고 '알아야 할 필요성'원칙을 위반하면 '버퍼링'이 없기 때문에 코드가 얽히고 약해지고 악몽이 변하게됩니다. '묻지 말아라'라는 OO의 개념은 이것과 관련이있다.

관련 문제