'추상 계층'과 '간접 수준'의 차이점은 무엇입니까?


38

두 용어를 서로 바꿔서 사용할 수 있는지 확실하지 않습니다. 컴퓨터 과학에있어서 일상적인 프로그래밍과 관련이없는 학문적 인 차이가있을 수 있습니다. 아니면 잘못없이 두 용어를 서로 바꿔서 사용할 수 있습니까? 어쩌면 그것은 두 용어를 사용하는 맥락에 달려 있습니까?

편집 : 두 용어가 상호 교환 가능하다는 것을 알 수있는 이유 는 추상화 계층에 대한 Wikipedia 항목 입니다. 거기 당신은 찾을 수 있습니다 데이비드 짐수레 꾼의 인용 '컴퓨터 과학의 모든 문제를 우회의 다른 수준에 의해 해결 될 수 있습니다.'


7
... 너무 많은 간접적 수준의 문제를 제외하고!
메이슨 휠러

@MasonWheeler : 간접적 인 수준이 아닌 다른 간접적 인 수준을 추가 할 수 있습니다.
Jon Purdy

C ++을 사용하면 간접 레이어없이 추상화 레이어를 추가 할 수 있으므로 동일한 레이어를 의미 할 수 없습니다.
fredoverflow

답변:


30

추상화 는 단순화, 간접 처리는 위치를 처리합니다.

  • 추출보다 간단하고 조작하기 쉬운 용어로 객체의 복잡한 세부 사항을 "숨기는"메커니즘입니다. 프로그래밍에서 좋은 예는 머신 코드와 궁극적으로 머신 코드를 기반으로하는 응용 프로그램을 만들기위한 다양한 도구 간의 세부 사항 차이입니다. Visual Studio IDE를 사용하여 Windows Form 응용 프로그램을 만드는 것을 고려하십시오. IDE를 사용하면 What-You-See-Is-What-You-Get 방식으로 조작하기 쉬운 항목으로 응용 프로그램을 생각할 수 있습니다. 화면 위젯의 위치는 위젯을 드래그하여 변경할 수있는 프레임의 시각적 위치로 추상화됩니다. 내부적으로 IDE는 고급 언어 (예 : C #)와 같은 다른 추상화 계층을 사용하여 위젯을 조작합니다. C # 자체는 기계 코드를 사용하여 조작되지 않고 "공통 런타임 환경"을 사용하여 조작됩니다.

  • 간접 은 항목의 위치를 ​​투명하게 만드는 것을 말합니다. 웹 리소스의 URI를 알고 있으면 정확한 위치를 몰라도 리소스에 액세스 할 수 있습니다. 리소스에 직접 액세스하지 않고 일련의 서버, 응용 프로그램 및 라우터를 통해 요청을 전달하는 채널을 통해 액세스합니다. 간접적 인 위치는 위치가 추상화되는 특별한 유형의 추상화로 간주 될 수 있습니다.


2
지금까지 +1 최고의 답변! 글을 쓰려고했지만이 글은 내가 생각했던 것과 충분히 가깝습니다.
Newtopian

27

추상화는 간접을 사용하여 구현됩니다.

예를 들어, 가상 메모리 : 추상화는 전적으로 귀하가 처리 할 수있는 인접한 주소 공간입니다. 이 추상화는 페이지 테이블을 통해 간접적으로 사용하여 구현됩니다. 실제 메모리 주소에 직접 액세스하는 대신 가상 주소에서 실제 주소로 변환됩니다.

추상화 계층을 추가하려면 간접 계층을 추가해야합니다. 그러나 간접 성을 추가한다고해서 반드시 추상화를 얻을 수있는 것은 아닙니다. 예를 들어, 모든 단일 변수에 게터와 세터를 갖는 것은 간접적 인 계층이지만, 단순한 값을 가져오고 설정하는 것만으로는 추상화가 없습니다.


2
실제로 마지막 예는 그리 좋지 않습니다. 일반 게터와 세터는 추상화를 추가합니다. 그들이 아는 유일한 것은, 그것들이 명백하다는 것입니다. 구현을 변경하기로 결정한 경우 추상화에 대해 작성된 코드는 영향을받지 않습니다.
back2dos

간접적이지만 혼란스럽지 않은 더 나은 예를 들어 줄 수 있습니까?
Mr Coder

1
분명히 잘못된 예
Morg.

3
수업에 대해 누가 말했습니까? 또한 변수의 가시성을 변경하는 것에 대해서는 언급하지 않았습니다. 아무것도 당신이 직접 액세스하는 것을 방해하지 않습니다; 변수입니다. 그러나 getter와 setter를 통해 간접적 인 수준으로 수행 할 수도 있습니다. getter 및 setter를 사용하는 의미는 변수에 직접 액세스하는 것과 동일하므로 추상화가 없습니다.
Austin

2
게터와 세터가 반드시 변수에 '그냥'접근 할 필요는 없습니다. getter 및 setter를 사용하는 경우 사용자가 알지 못하는 상태에서 다른 변수를 사용하도록 변경할 수 있으므로 추상화를 추가하는 것이므로 추상화입니다.
도미니크 맥도넬

9

먼저 용어에 대한 적절한 정의를 시도해보십시오.

  1. 추상화 계층은 다음을 의미합니다.

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. 반면 간접적 수준은 다음을 의미합니다.

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

사용하는 한이 두 가지가 같은 의미 일 수 있습니다.

  a) step = going from simple code to complex code. 

7

내 이해는 추상화는 주로 함수를 나타내고 간접은 대부분 데이터를 나타냅니다. 다시 말해서, 추상화 레벨은 스택 추적이 얼마나 깊고, 간접 레벨은 참조 해제해야하는 포인터의 수입니다. 적어도 그게 내가 용어를 사용하는 방법입니다.


가상 함수가 함수에 대한 포인터로 모델링 되는가?
Caleth

7

추상화 계층과 간접 수준은 서로 다른 개념입니다. 추상화는 데이터 또는 프로그램 명령과 같은 여러 요소 (예 : 파일 또는 메소드 호출의 개념)의 집계 및 의미있는 이름 지정이며, 간접 성은 관계의 실현 실현 연기를 용이하게하기 위해 엔티티의 분리입니다. 예를 들어, 애플리케이션 컨테이너에 의해 제공 될 수있는 실제 리소스로부터 프로그램 내의 리소스의 식별을 분리하기 위해 JNDI를 사용하는 것.

종종 개념이 함께 진행되고 특정 구성에 적용되는 개념은 진행중인 운동이나 토론에 따라 다릅니다. 예를 들어, API를 배우거나 문서화 할 때 인터페이스의 추상적 특성이 중요합니다. 응용 프로그램에 확장 성을 추가하거나 테스트를 만들 때 간접 속성은 중요합니다.

추상화 계층은 추상화를 통합하여 개념 무결성과 사용 일관성을 제공하는 것입니다. CreateProcess는 프로세스를 빌드하고 실행하는 많은 코드의 win32 API 이름입니다. "이름"은 DoAllocMemThenMakeEnvThenFindEntryPoint와 같은 함수를 호출하면 실제로 매우 추상적이지 않기 때문에이 컨텍스트에서 중요합니다. Win32 API와 같은 계층은 프로그래머가 벤처하지 말 것을 권고 할 수있는 장벽을 제공합니다. 전력 소비 감소 (유연성, 성능 등)로 호출자의 관점에서 복잡성을 제거합니다. 이 절충은 누출 추상화에 대한 빈번한 논의로 강조됩니다. Hibernate를 사용할 때 직접 SQL 호출을 수행하거나 .NET을 사용할 때 Win32 호출을 수행해야 할 수도 있습니다.

간접적으로, 사소하지 않은 대부분의 프로그램은 어떤 형태의 사용자 코딩 간접적으로 작동하며, 방주 앞의 COBOL의 INPUT-OUTPUT 섹션을 목격하십시오. 데이터베이스와 같은 리소스에 액세스 할 때 코드에 JDBC 연결 문자열이 레벨 0 간접, JNDI 연결 (자원 선택을 애플리케이션 컨테이너에 위임하는) 및 레벨 1로 맵핑되는 일부 스프링 구성이 임베드되는 것을 볼 수 있습니다. 다중 레벨은 많은 외부 관계 (이 경우 코드 실행과 데이터베이스 간의 관계)가 관계를 조작 할 수 있도록합니다. 이는 인터페이스 및 이벤트와 같은 내부 프로그램 구성 요소에 동일하게 적용됩니다.

우리는 다른 특성이 무엇이든 추상화는 복잡성을 줄이고 간접 성은 증가 시킨다는 것을 알 수 있습니다. 추상화는 전력을 감소시키는 반면 간접은 전력을 증가시킵니다. 사용자 지정 콜백으로 기본 동작을 재정의함으로써 간접 기능을 사용하여 추상화의 힘을 복원 할 수 있습니다.


1

int에 대한 포인터에 대한 포인터에 대한 포인터에 대한 포인터는 6 개의 간접 레벨을 갖지만 추상화 계층은 없습니다.


0

추상화의 좋은 예는 데이터베이스에 항목을 저장하기 위해 단일 메소드를 호출하는 것입니다. 이 메소드는 데이터베이스 연결 및 호출에 대한 세부 사항을 추상화합니다. 간접의 예는 구조체를 사용하여 인터럽트에 액세스하는 경우입니다. 구조체에서 값을 설정할 때 여전히 인터럽트에 액세스하고 있습니다. 그것은 구조체 멤버 이름을 메모리의 특정 지점에 부여함으로써 구조체를 통해 간접적으로 이루어집니다.

따라서 추상화는 간접적으로 단순히 무언가에 액세스 할 수있는 "간접적 인"인터페이스를 제공하는 구현 세부 사항을 숨 깁니다.

추상화는 숨겨져있는 것을 이해하지 않아도되고 어디에서 간접적으로 수행 하는지를 나타냅니다.


-1

추상화 수준 (또는 계층)을 추가하고 간접 수준을 추가하는 것은 단순히 같은 것을 말하는 두 가지 방법입니다. 문제를 해결할 때 일반적으로 직접 솔루션을 시도하십시오. 때로는 불가능하기 때문에 간접 해결책을 시도하십시오. 이를 위해서는 문제를 단순화하기 위해 추상화를 도입해야합니다. 문제는 복잡하여 직접 해결할 수 없기 때문입니다. 간접적 인 접근 방식으로 문제를 해결 한 후에는 문제를 다시 해결하지 말고 더 일반적으로 고려할 이유가 없습니다. 여기에는 더 높은 수준의 추상화가 도입됩니다. 그리고이 새롭고보다 일반적인 솔루션은 원래 간접 솔루션보다 훨씬 더 간접적입니다. 즉, 다른 수준의 간접적 인 도입이 이루어졌습니다.


3
이것은 이전의 7 가지 답변에서 만들어지고 설명 된 점들에 비해 실질적인 것을 추가하지 않는 것 같습니다
gnat

고마워, 개트 나는 당신의 요점을 취합니다. 그리고이 흥미로운 질문은 많은 스팸을 끌어들입니다.
ChrisC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.