programing

캡슐화와 추상화의 차이

itsource 2022. 9. 28. 23:37
반응형

캡슐화와 추상화의 차이

나는 오늘 면접을 봤다.OOP로부터 캡슐화추상화의 차이에 대해 질문이 있었습니다.

캡슐화는 기본적으로 데이터 멤버와 멤버 함수를 클래스라는 단일 유닛으로 묶는 것이라고 답변했습니다.반면 추상화는 기본적으로 구현의 복잡성을 숨기고 사용자에게 접근하기 쉽게 하기 위한 것입니다.나는 그녀가 내 대답에 괜찮을 줄 알았다.하지만 그녀는 만약 둘의 목적이 정보를 숨기는 것이라면 이 두 가지 사이의 실제 차이는 무엇인지 질문했다.나는 그녀에게 어떤 대답도 할 수 없었다.

이 질문을 하기 전에 StackOverFlow의 다른 스레드를 읽고 이 두 OOP 개념의 차이에 대해 설명했습니다.하지만 나는 면접관을 설득할 수 있는 입장이 못 된다.

가장 간단한 예로 그것을 정당화할 수 있는 사람은 누구입니까?

캡슐화는 외부에서 직접 액세스하지 못하도록 클래스 내에서 자주 변경될 수 있는 변수 또는 일부 구현을 숨깁니다.getter 및 setter 메서드를 통해 액세스해야 합니다.

추상화는 무언가를 숨기기 위해서도 사용되지만 더 높은 수준(클래스, 인터페이스)에서 사용됩니다.추상 클래스(또는 인터페이스)를 사용하는 클라이언트는 그것이 무엇이었는지는 신경 쓰지 않고 단지 그것이 무엇을 할 수 있는지 알면 됩니다.

이 이미지는 두 가지 차이점을 잘 나타내고 있습니다.

enter image description here

출처는 이쪽

캡슐화:코드와 데이터를 하나의 유닛으로 정리합니다. Class는 캡슐화의 예입니다.이는 메서드와 속성을 랩하기 때문입니다.

추상화:내부 세부 정보를 숨기고 기능만 표시합니다.추상화는 객체가 어떻게 하는 것이 아니라 객체가 무엇을 하는지에 초점을 맞춥니다.클래스의 일반적인 뷰를 제공합니다.

int number = 5;
string aStringNumber = number.ToString(); 

여기서 ToString()은 추상화입니다.그리고 이 메커니즘이 어떻게number문자열로 변환되어 초기화되는 변수aStringNumber캡슐화입니다.

계산기의 실제 예를 들어 보겠습니다.캡슐화는 내부 회로, 배터리 등을 결합하여 계산기를 만듭니다.추상화란 ON-OFF, Clear 및 기타 조작 버튼과 같은 다양한 버튼입니다.

추상화 - 객체 집합의 공통 필수 특성을 식별하는 프로세스(및 이 프로세스의 결과)입니다.추상화는 일반화 과정이라고 할 수 있습니다. 고려 중인 모든 객체는 주어진 속성을 가지고 있는 객체의 슈퍼셋에 포함됩니다(그러나 다른 점에서는 다릅니다).

캡슐화 - 내부 구현을 외부로부터 숨기기 위해 데이터와 함수를 단일 단위로 처리하는 프로세스입니다.

이는 특정 프로그래밍 언어와 관련이 없는 일반적인 답변입니다(질문).답은 추상화와 캡슐화에는 공통점이 없다는 것입니다.그러나 이러한 구현은 서로 관련이 있을 수 있습니다(예를 들어 Java에서는 캡슐화 - 세부 정보가 클래스에 숨겨져 있고 추상화 - 세부 정보가 클래스 또는 인터페이스에 전혀 없습니다).

네!!!캡슐화가 고도의 특정 범위의 추상화라고 하면

제 답변을 읽고 업데이트한 사람은 몇 명입니까?내가 왜 이런 말을 하는지 파고들자.

청구하기 전에 두 가지 사항을 확인해야 합니다.

하나는 데이터 은폐이고 다른 하나는 추상화입니다.

데이터 숨김

Most of the time, we will not give direct access to our internal data. Our internal data should not go out directly that is an outside person can't access our internal data directly. It's all about security since we need to protect the internal states of a particular object.


추상화

For simplicity, hide the internal implementations is called abstraction. In abstraction, we only focus on the necessary things. Basically, We talk about "What to do" and not "How to do" in abstraction. Security also can be achieved by abstraction since we are not going to highlight "how we are implementing". Maintainability will be increased since we can alter the implementation but it will not affect our end user.


나는 "캡슐화는 일종의 고급 특정 범위 추상화"라고 말했다.왜냐하면 캡슐화는 데이터 은닉 + 추상화로 볼 수 있기 때문이다.

캡슐화 = 데이터 숨기기 + 추상화

캡슐화에서는 외부인이 데이터를 볼 수 없도록 데이터를 숨겨야 하며 데이터에 접근할 수 있는 방법을 제공해야 합니다.이러한 메서드는 외부인에게도 보이지 않는 검증 또는 기타 기능을 내부에 포함할 수 있습니다.여기서는 접근 방식의 구현을 숨기고 있으며 이를 추상화라고 합니다.

그래서 위와 같은 캡슐화는 추상화의 일종이라고 말한 것입니다.

그럼 뭐가 다른데?

차이점은 단순성, 유지보수성 및 보안을 위해 사용자에게 무언가를 숨기고 있다면 추상화는 일반적인 개념이라는 것입니다.

캡슐화는 내부 상태를 숨기는(데이터 숨김) 내부 상태 보안과 관련된 특정 방법으로, 데이터에 액세스하는 방법 및 외부 사용자로부터도 숨겨진 방법(정보)을 제공합니다.

추상화가 필요한 이유 설계를 할 때는 구현에 대해 언급하지 않습니다.이 메서드에 이러한 파라미터를 지정하면 이러한 출력이 표시됩니다.이 메서드의 내부 구현을 숨기고, 이 메서드가 무엇을 할 것인지에 대해 이야기합니다.이것은 추상화입니다.

public int add(int a, int b);

이 메서드의 정의는 두 개의 변수를 지정하면 추가가 수행되고 결과가 반환됨을 나타냅니다.

여기서는 구현에 대해서는 설명하지 않고 이 방법의 기능만 설명하며 어떻게 동작하는지는 설명하지 않습니다.방법의 실장은 개발자에 따라 다를 수 있습니다.1 .

public int add(int a, int b){
   return a + b; 
}
public int add(int a, int b){

   return b + a; 
}

두 가지 방법은 구현이 다른 동일한 작업을 수행합니다.

기본적으로는

시스템을 모델링하려면 추상화가 필요합니다.시스템 보안을 강화하기 위해 캡슐화가 필요합니다.

추상화:일반적으로 클래스 세트에 대한 다형 액세스를 제공하기 위해 수행됩니다.추상 클래스는 인스턴스화할 수 없으므로 더 구체적인 표현을 만들기 위해 다른 클래스가 추상 클래스에서 파생되어야 합니다.

추상 클래스의 일반적인 사용 예는 추상 주입점이 도입되어 구체적인 클래스가 독자적인 "구체적" 방식으로 구현할 수 있는 템플릿 메서드 설계 패턴의 구현일 수 있다.

참조: http://en.wikipedia.org/wiki/Abstraction_(computer_science)

캡슐화:특정 클래스의 구현 복잡성을 클라이언트로부터 숨기는 프로세스입니다.클라이언트는 클래스를 작성한 사람이 프로그램 또는 이벤트일 수 있습니다.

참조: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

추상화, 캡슐화 및 정보의 차이에 대해 자세히 설명하는 훌륭한 기사가 있습니다.http://www.tonymarston.co.uk/php-mysql/abstraction.txt

기사의 결론은 다음과 같습니다.

추상화, 정보 은폐 및 캡슐화는 매우 다르지만 매우 관련이 높은 개념입니다.추상화는 우리가 어떤 특정 정보가 보여야 하고 어떤 정보가 숨겨져야 하는지를 식별하는데 도움을 주는 기술이라고 주장할 수 있다.캡슐화는 숨겨야 할 것을 숨기고 보여야 할 것을 보이게 하는 방식으로 정보를 패키징하는 기술입니다.

매우 실용적인 예는 다음과 같습니다.

비밀번호를 암호화한다고 칩시다.

  • 자세한 것은 알고 싶지 않습니다.encryptionImpl.encrypt(패스워드)를 호출하면 암호화된 패스워드가 반환됩니다.

    public interface Encryption{ public String encrypt(String password); }

    이것을 추상화라고 합니다.그것은 무엇을 해야 하는지 보여줄 뿐이다.

  • 서드파티제의 암호화 jar에서 암호화를 구현하는 Encryption Md5와 RSA의 두 가지 유형을 가정해 보겠습니다.

    그 후, 이러한 암호화 클래스는, 외부인으로부터 그 실장을 보호하는 독자적인 암호화 실장 방법이 있습니다.

    이것을 캡슐화라고 부릅니다.어떻게 해야 하는지 숨깁니다.

주의: 무엇을 해야 하는지, 어떻게 해야 하는지.

복잡성 은폐와 구현 보호

네, 추상화와 캡슐화가 숨어있다는 것은 사실입니다.

  • 설계 수준에서 관련 세부 정보만 사용하고 불필요한 데이터를 숨기는 것을 추상화라고 합니다.(클래스 'Car'를 보다 추상적이거나 일반적으로 만들기 위해 관련 속성만 선택하는 것과 같습니다.)

  • 캡슐화는 구현 수준에서 데이터를 숨기는 것입니다.직접/외부 액세스로부터 실제로 데이터를 숨기는 방법 등.이는 외부 접근을 방지하기 위해 데이터와 메서드를 단일 엔티티/유닛에 바인딩함으로써 이루어집니다.따라서 캡슐화는 구현 수준에서 데이터 숨김이라고도 합니다.

캡슐화:

뭔가 숨기고 있어요 약 캡슐 같은 거요캡슐 안에 뭐가 있는지 모르니까 그냥 가져가면 돼프로그래밍과 마찬가지로 방법이나 속성의 특별한 코드를 숨기고 캡슐과 같은 출력만 제공합니다.즉, 캡슐화는 데이터를 숨깁니다.

추상화:

추상화는 논리나 구현을 숨기는 것을 의미합니다.예를 들어, 우리는 알약을 먹고 그 색깔을 보지만 이것의 목적이 무엇인지, 그리고 그것이 신체와 어떻게 작용하는지 알지 못한다.

양쪽의 차이는 단지 시점일 뿐이다
캡슐화 단어는 로직의 내부 뷰를 클라이언트가 볼 수 없도록 하는 것을 목적으로 하는 경우 데이터를 숨기기 위해 사용됩니다.

고객에게 외부 뷰를 보여주는 것이 목적이라면 추상어는 데이터를 숨기는 데 사용됩니다.

외부 뷰는 다음과 같은 것을 의미합니다.

BubbleSort(){
//code 
swap(x,y);
}

여기서 swap in bubble sort를 사용하여 클라이언트에 적용하고 있는 로직만 보여줍니다.여기서 swap(x,y)을 완전한 코드로 대체하면, 그/그녀는 우리의 로직을 이해할 수 없습니다.

위에서 설명한 것과 같은 예를 들어 설명하겠습니다.같은 TV를 검토해 주세요.

Encapsulation: The adjustments we can make with the remote is a good example - Volume UP/DOWN, Color & Contrast - All we can do is adjust it to the min and max value provided and cannot do anything beyond what is provided in the remote - Imagine the getter and setter here(The setter function will check whether the value provided is valid if Yes, it process the operation if not won't allow us to make changes - like we cannot decrease the volume beyond zero even we press the volume down button a hundred times).

Abstraction: We can take the same example here but with a higher Degree/Context. The volume down button will decrease the volume - and this is the info we provide to the user and the user is not aware of neither the infrared transmitter inside the remote nor the receiver in the TV and the subsequent process of parsing the signal and the microprocessor architecture inside the TV. Simply put it is not needed in the context - Just provide what is necessary. One can easily relate the Text book definition here ie., Hiding the inner implementation and only providing what it will do rather than how it do that!

Hope it clarifies a bit!

Briefly, Abstraction happens at class level by hiding implementation and implementing an interface to be able to interact with the instance of the class. Whereas, Encapsulation is used to hide information; for instance, making the member variables private to ban the direct access and providing getters and setters for them for indicrect access.

Encapsulation is wrapping up of data and methods in a single unit and making the data accessible only through methods(getter/setter) to ensure safety of data.

Abstraction is hiding internal implementation details of how work is done.

Take and example of following stack class:

Class Stack
{
private top;
void push();
int pop();
}

Now encapsulation helps to safeguard internal data as top cannot be accessed directly outside.

And abstraction helps to do push or pop on stack without worrying about what are steps to push or pop

Abstraction As the name suggests abstract means summary or brief about somtehing. In case of OOP Abstract Classes are the ones which do not contain every information about that object in real world, for eg. you want to book a hotel room, if your object is that room you mainly care about:

  • 가격, 크기, 침대 등

하지만 넌 신경 안 써

  • 호텔 방에서 전기를 공급하기 위해 사용한 배선
  • 어떤 시멘트를 사용해서 만들었는지

그래서 당신이 관심있는 에 대한 추상적인 정보를 얻을 수 있습니다.

한편, 캡슐화는 기본적으로 관련 정보를 함께 캡슐화하는 것입니다.당신이 호텔방을 예약하고, 당신은 그곳에 가서 스위치를 눌러 전구를 켭니다.스위치 오브젝트에는 전구를 켜는 데 필요한 모든 내부 배선이 있습니다만, 이러한 배선은 전혀 신경 쓰지 않습니다.전구가 켜져 있는지 여부에만 관심이 있습니다.

이제 추상화는 여기에도 적용된다고 주장할 수 있습니다.

스위치의 내부 배선도 추상화되어 있다고 할 수 있습니다.따라서 추상화가 필요한 경우가 있습니다만, 여기에서는 몇 가지 미묘한 차이가 있습니다.

추상화는 문맥적인 것에 가깝습니다.그것은 당신이 신경 쓰지 않는 배선 정보와 같은 추상화되지 않은 정보를 가지고 있지 않습니다.그것은 호텔방을 예약하기 위한 웹사이트의 문맥에 존재하지 않습니다(이 강의실은 온라인 예약만을 위해 위임되어 있기 때문에 당신의 강의실은 그것의 배선 그리드에 대한 정보를 가지고 있지 않습니다). 반면, encap은 온라인 예약만을 위해 위임되어 있습니다.sulation은 보다 세분화되어 있습니다.즉, 신경 쓸 필요가 없는 세밀한 것을 숨기고 캡슐화하는 것을 의미합니다.밸브를 켜면 스위치가 배선을 스위치 보드 내부에 숨깁니다(프라이빗 속성이나 클래스의 메서드 등).스위치 클래스에는 정보가 있지만 숨겨져 있습니다.한편, 객실 클래스는 온라인 예약의 맥락이 아니기 때문에 호텔 객실의 배선 설계에 대한 정보가 없습니다.

따라서 추상화는 클래스와 더 관련이 있으며 캡슐화는 클래스 객체, 속성 및 메서드의 내부와 더 관련이 있습니다.

추상화

  • 어떻게 숨겼는지, 어떻게 숨겼는지 보여주는 과정입니다.
  • 목적은 정보를 단순화하고 사용자에게 불필요한 세부사항을 숨기는 것이다.

캡슐화

  • 데이터와 기능을 하나의 단위로 정리하는 프로세스입니다.
  • 그 목적은 직접 접근을 방지하고 보다 안전하고 간접적인 방법만을 제공함으로써 데이터를 보호하는 것이다.

추상화

자바어로 추상화는 정보를 현실 세계에 숨기는 것을 의미합니다.그것은 당사자 간에 "서비스를 이용하기 위해 우리가 무엇을 해야 하는지"를 지시하는 계약을 확립한다.

예를 들어, API 개발에서는 실제 구현보다는 추상화된 서비스 정보만 세상에 공개하였습니다.Java의 인터페이스는 이 개념을 매우 잘 실현하는 데 도움이 됩니다.

인터페이스는 당사자(예: 생산자 및 소비자) 간의 계약을 제공합니다.생산자는 제품이 어떻게 만들어지고 있는지 소비자에게 알리지 않고 제품을 생산한다.그러나 생산자는 인터페이스를 통해 모든 소비자에게 어떤 제품을 살 수 있는지 알려준다.추상화의 도움으로 생산자는 소비자에게 제품을 판매할 수 있습니다.

캡슐화:

캡슐화는 추상화의 한 단계 아래에 있습니다.동일한 제품 회사가 서로 생산 그룹의 정보를 차폐하려고 합니다.예를 들어, 회사에서 와인과 초콜릿을 생산하는 경우 캡슐화는 각 제품이 서로 어떻게 만들어지는지 정보를 보호하는 데 도움이 됩니다.

  1. 와인용 패키지와 초콜릿용 패키지가 각각 1개씩 있는 경우, 또한 패키지 내에서 모든 클래스가 기본 접근 수식자로 선언된 경우 모든 클래스에 대해 패키지 수준의 캡슐화를 제공합니다.
  2. 패키지 내에서 각 클래스 파일(멤버 필드)을 프라이빗으로 선언하고 이러한 필드에 액세스하기 위한 퍼블릭메서드가 있는 경우 이러한 필드에 클래스 수준의 캡슐화를 제공합니다.

인터뷰에 응한 것은, 최종 유저의 관점에서의 추상화와 캡슐화는 거의 같기 때문에, 저라고 말할 수 있습니다.그것은 단지 정보가 숨겨져 있을 뿐이다.소프트웨어 개발자의 관점에서 Abstraction은 설계 수준에서 문제를 해결하고 Encapsulation은 구현 수준에서 문제를 해결합니다.

간단히 말하면 캡슐화는 데이터 숨기기(정보 숨기기)이고 추상화는 상세 숨기기(실장 숨기기)입니다.

캡슐화는 의미의 구성입니다.

추상화는 의미를 단순화하는 것이다.

몇 가지만 더 말씀드리자면

데이터 추상화와 추상 클래스를 혼동해서는 안 된다.그들은 다르다.

Generally we say abstract class or method is to basically hide something. But no.. That is wrong. What is the word abstract means ? Google search says the English word abstraction means

"Existing in thought or as an idea but not having a physical or concrete existence."

And thats right in case of abstract class too. It is not hiding the content of the method but the method's content is already empty (not having a physical or concrete existence) but it determines how a method should be (existing in thought or as an idea) or a method should be in the calss.

So when do you actually use abstract methods ?

  • When a method from base class will differ in each child class that extends it.
  • And so you want to make sure the child class have this function implemented.
  • This also ensures that method, to have compulsory signature like, it must have n number of parameters.

So about abstract class! - An Abstract class cannot be instantiated only extended! But why ?

  • A class with abstract method must be prevented from creating its own instance because the abstract methods in it, are not having any meaningful implementation.
  • You can even make a class abstract, if for some reason you find that it is meaning less to have a instance of your that class.

An Abstract class help us avoid creating new instance of it!

An abstract method in a class forces the child class to implement that function for sure with the provided signature!

Abstraction: what are the minimum functions and variables that should be exposed to the outside of our class.

Encapsulation: how to achieve this requirement, meaning how to implement it.

ReferenceURL : https://stackoverflow.com/questions/15176356/difference-between-encapsulation-and-abstraction

반응형