기본 콘텐츠로 건너뛰기

방송대 프로그래밍언어론 15강: 추상 자료형과 다형성의 설계 관계

0-썸네일-요약노트-프로그래밍언어론-15강

방송대 프로그래밍언어론 15강: 추상 자료형과 다형성의 설계 관계

스택을 배열로 구현했는지 연결 구조로 구현했는지 몰라도 사용할 수 있고, 같은 메소드 호출이 객체에 따라 다르게 동작할 수 있는 이유는 무엇일까? 이 글은 추상화·캡슐화·객체·클래스·다형성을 하나의 설계 흐름으로 연결해, 무엇을 공개하고 무엇을 감추며 언제 어떤 다형성을 선택해야 하는지 판단하도록 돕는다.

좋은 모듈은 사용자가 알아야 할 것의 경계를 정한다

프로그램의 한 부분을 고쳤는데 여러 파일을 연달아 수정해야 한다면, 사용 코드가 구현 세부 사항에 지나치게 의존하고 있을 가능성이 크다. 15강의 개념들은 이 문제를 서로 다른 층에서 해결한다. 추상화는 관심 있는 특징만 남기고, 추상 자료형은 자료와 허용 연산을 묶으며, 객체와 클래스는 상태를 가진 대상을 생성하고 요청에 반응하게 한다. 다형성은 같은 이름의 요청을 여러 타입에 맞게 확장한다.

설계 질문대응 개념얻는 효과
복잡한 대상에서 무엇만 볼 것인가?추상화관심 있는 성질에 집중한다.
사용자에게 어떤 조작만 허용할 것인가?추상 자료형과 인터페이스자료 표현과 사용 규칙을 분리한다.
상태와 그 상태를 다루는 행위를 어디에 둘 것인가?객체와 클래스상태·필드·메소드를 일관된 단위로 조직한다.
같은 요청을 서로 다른 타입이 어떻게 처리하게 할 것인가?다형성과 늦은 바인딩호출 코드를 유지하면서 동작을 교체한다.

판단 핵심: 추상화는 세부 사항을 줄여 보는 사고 방법이고, 캡슐화는 요소를 한 단위로 묶는 언어 기능이며, 정보 은닉은 외부가 구현 세부에 접근하지 못하게 하는 공개 정책이다. 서로 협력하지만 같은 말은 아니다.

추상화는 제어와 자료에서 서로 다른 질문을 던진다

추상화에는 관심 있는 부분을 추려서 나타내는 방법과 관심 없는 부분을 삭제해서 나타내는 방법이 있다. 프로그래밍 언어에서는 이를 제어 추상화와 자료 추상화로 나누어 볼 수 있다.

제어 추상화는 어떻게보다 무엇을 드러낸다

sort(list, len)이라는 호출을 보는 사용자는 정렬 알고리즘의 반복과 비교 과정을 매번 펼쳐 쓰지 않는다. “목록을 정렬한다”라는 목적을 호출 하나로 표현한다. 제어 구조와 서브프로그램은 복잡한 제어 과정을 단순한 이름과 호출로 제공하는 대표적인 제어 추상화 장치다.

자료 추상화는 표현보다 가능한 조작을 앞세운다

성적 처리에서 학생을 다룰 때 신발 크기나 좋아하는 색은 필요하지 않을 수 있다. 학번·이름·수강 과목·성적처럼 목적에 필요한 속성만 남기는 것이 자료 추상화다. 스택도 마찬가지다. 사용자는 원소 저장 공간과 스택 포인터를 직접 조작하는 대신 push, pop, isEmpty 같은 연산으로 자료 구조를 다룬다.

제어 추상화가 연산의 내부 절차를 숨긴다면, 자료 추상화는 자료의 내부 표현을 숨긴다. 추상 자료형은 두 방향을 결합해 “어떤 값이 있으며 그 값에 무엇을 할 수 있는가”를 한 단위로 선언한다.

추상 자료형은 표현이 아니라 계약으로 사용한다

추상 자료형(ADT, Abstract Data Type)은 자료 집합과 그 자료에 적용할 수 있는 연산을 함께 선언한 자료형이다. 구현 세부는 외부에 공개하지 않고 사용자는 공개된 인터페이스만 이용한다. 따라서 큐의 내부가 배열인지 연결 구조인지보다 ENQ, DEQ, ISEMPTY가 어떤 의미를 갖는지가 먼저다.

표현이 없어도 연산 법칙이 자료형의 의미를 만든다

추상화 수준을 최대한 높이면 자료 표현을 적지 않고 연산과 연산 사이의 법칙만 정의할 수 있다. 스택의 다음 세 법칙을 한 단계씩 읽어 보자.

isEmpty(makeStack()) == True
isEmpty(push(s, e)) == False
pop(push(s, e)) == e
  • 첫째, 새로 만든 스택은 비어 있다.
  • 둘째, 어떤 원소 하나를 넣은 직후에는 비어 있지 않다.
  • 셋째, 원소 e를 넣고 바로 꺼내면 같은 e를 얻는다.

이 법칙에는 배열 크기나 포인터 이름이 없다. 그래서 구현을 바꾸더라도 법칙이 유지되면 사용 코드는 같은 의미로 동작할 수 있다. 이것이 ADT의 수정 용이성과 재사용성의 근거다. 외부 코드가 내부 표현을 임의로 바꾸지 못하게 하므로 보안성도 높아진다.

직접 만든 계약 점검 예

학습을 위해 빈 스택 s에 7, 4를 차례로 넣는다고 가정하자. pop(push(push(s, 7), 4))의 결과는 4여야 한다. 마지막에 넣은 원소가 먼저 나오는 스택의 계약을 적용한 결과다. 만약 내부 표현을 바꾼 뒤 결과가 7이라면 인터페이스 이름은 같아도 ADT의 의미를 보존하지 못한 것이다.

대수적 자료형은 기존 타입을 연산으로 조합한다

대수적 자료형은 타입에 적용하는 대수적 연산으로 새 타입을 만든다. 강의의 데카르트 곱 예에서 집합 A × B가 순서쌍의 집합을 만들듯, 자료형 T1T2의 곱은 두 성분을 함께 가진 자료형 (T1, T2)를 만든다. 연산 법칙으로 행동을 규정하는 ADT와, 타입 조합 연산으로 새 타입을 구성하는 대수적 자료형을 구분해야 한다.

캡슐화와 정보 은닉은 변경의 파급 효과를 차단한다

캡슐화는 여러 요소를 하나의 단위로 묶는 기능이다. C의 구조체·공용체·함수처럼 묶음을 만들 수 있는 장치가 해당한다. 그러나 묶었다고 해서 내부가 자동으로 숨겨지는 것은 아니다. 정보 은닉은 구현 세부를 숨기고 인터페이스만 외부에 공개하는 기능이다. C의 파일 범위 식별자, C++ 클래스의 전용·보호 멤버가 강의에서 든 예다.

두 용어가 같은 뜻처럼 사용되기도 하지만, 오류를 진단할 때는 분리하는 편이 정확하다. 상태와 연산을 한 클래스에 모았어도 모든 필드를 공개했다면 캡슐화는 했지만 정보 은닉은 약하다. 반대로 공개 연산을 통해서만 상태가 바뀌게 하면 사용 코드가 내부 표현에 종속되는 것을 막을 수 있다.

오류 교정: “클래스로 묶었으니 구현 변경이 안전하다”라고 바로 결론 내리지 않는다. 외부 코드가 내부 필드에 직접 접근하는지 확인하고, 접근한다면 공개 메소드로 경계를 다시 세운다. 그래야 한 부분의 변경이 예상 밖의 코드 변경을 연속해서 부르는 파급 효과를 줄일 수 있다.

객체는 상태와 반응을 가지며 클래스는 생성 규칙을 제공한다

객체는 특정 상태를 유지하면서 외부 요구에 반응하고, 필요에 따라 상태가 바뀌는 대상이다. 객체의 상태를 정의하는 값은 속성, 그 속성을 저장하는 이름은 필드, 요청을 처리하는 서브프로그램은 메소드, 요청 구문 전체를 객체에 전달하는 것은 메시지다.

클래스는 같은 필드 항목과 메소드 집합을 공유하는 객체의 묶음이자 객체 생성의 틀이다. 클래스로 생성한 객체를 그 클래스의 인스턴스라 한다. 모든 클래스의 클래스 구실을 하는 객체는 메타클래스다. 이 구분에서 클래스는 설계 규칙이고 객체는 그 규칙에 따라 실제 상태를 가진 실행 주체다.

정적 타입과 동적 타입은 객체의 타입을 판정하는 시점이 다르다

구분클래스·객체의 관계판정할 때 볼 것
정적 타입 객체지향 언어클래스가 타입이고 객체는 그 타입의 원소가 된다.필드와 메소드의 개수·이름이 수행 중 바뀌지 않는다는 전제에서 선언 타입을 본다.
동적 타입 객체지향 언어수행 중 객체가 제공하는 필드와 메소드가 달라질 수 있다.현재 객체가 실제로 지원하는 연산을 본다.
오리 타입명시적 계보보다 지원 메소드가 타입 판단의 중심이 된다.요청하려는 메소드를 객체가 제공하는지 본다.

생성자와 소멸자는 생명주기의 양 끝을 맡는다

생성자는 객체 생성에 쓰이는 특별한 메소드다. 객체 변수 선언이나 new 같은 방법으로 자동 호출되며, 여러 초기화 조합을 지원하도록 중복 정의할 수 있다. 소멸자는 객체가 소멸될 때 자동 호출되는 특별한 메소드로 중복 정의하지 않는다. 강의의 C++ 스택은 생성자에서 배열 공간을 확보하고 소멸자에서 delete[]로 해제한다. Java 스택 예에는 같은 형태의 소멸자가 없고, 사용하지 않는 객체의 메모리는 쓰레기 수집 체계가 다룬다.

“소멸자가 없는 언어에서는 자원 정리를 전부 쓰레기 수집기가 해결한다”라고 확대하면 안 된다. 이 강의의 대비는 객체 메모리 회수 방식에 초점이 있다. 파일·네트워크 연결 같은 다른 자원의 정리 규칙은 언어별로 별도 확인해야 한다.

늦은 바인딩은 수신 객체에 맞는 메소드를 고른다

객체지향 호출의 핵심은 같은 메소드 이름이라도 수신 객체에 따라 다른 동작을 할 수 있다는 점이다. 호출할 구현을 실행 전에 하나로 고정하지 않고 실행 시점의 객체에 맞춰 정하는 것이 늦은 바인딩이다.

강의에서는 이를 구현하는 일반적인 장치로 가상함수 테이블(VTab)을 설명한다. 객체와 연관된 메소드 코드 주소를 테이블에 두고, 메소드 호출 시 해당 항목의 주소에 있는 함수를 부른다. C++에서는 virtual로 지정한 멤버 함수가 늦은 바인딩의 대상이 된다.

  1. 호출문에서 메소드 이름과 수신 객체를 확인한다.
  2. 수신 객체와 연관된 VTab을 찾는다.
  3. 메소드에 대응하는 항목에서 실제 코드 주소를 얻는다.
  4. 그 주소의 구현을 실행한다.

구분 기준: 중복 정의는 인수의 개수·타입 등 호출 시그니처로 구현을 고르는 경험적 다형성이고, 늦은 바인딩은 수신 객체의 실제 동작에 맞는 구현을 고르는 서브타입 다형성의 핵심 장치다. 둘 다 “같은 이름”을 쓰지만 선택 근거가 다르다.

다형성은 구현 선택 근거에 따라 세 갈래로 나뉜다

다형성은 여러 타입의 데이터를 같은 이름으로 처리할 수 있는 특성이다. 여러 타입을 다루는 서브프로그램은 다형 서브프로그램이고, 타입을 인수로 받는 타입은 다형 타입이다. 시험에서는 이름보다 “무엇을 근거로 실제 동작을 정하는가”를 물으면 구분이 쉬워진다.

종류구현을 고르는 근거대표 형태주의할 지점
경험적 다형성인수 개수·타입 또는 피연산자 타입함수·연산자 중복 정의기본 인수와 결합하면 호출 후보가 모호해질 수 있다.
매개변수적 다형성전달된 타입 인수Ada generic, C++ template, Java 제너릭값 인수가 아니라 타입이 매개변수라는 점을 확인한다.
순수 다형성IS-A 상속 관계의 실제 서브타입서브타입 다형성과 늦은 바인딩상속이 의미상 적합한지 먼저 검사한다.

경험적 다형성은 시그니처가 모호하면 실패한다

void f(double b = 0.0);
void f();

f();

f()는 인수 없는 함수와 기본값을 적용할 수 있는 함수 모두에 맞는다. 시그니처 매칭 알고리즘이 하나의 구현을 고를 수 없으므로 오류가 발생한다. 반환 타입만 다른 int g(int)double g(int)도 호출 인수만으로 구분할 수 없다는 점을 함께 기억한다.

매개변수적 다형성은 알고리즘 틀에 타입을 전달한다

template <typename Type>
void generic_sort(Type list[], int len) {
  // Type의 원소를 정렬하는 공통 절차
}

generic_sort<int>(int_list, 10);
generic_sort<double>(double_list, 20);

정렬 절차의 구조는 유지하고 Type에 구체 타입을 넣는다. 강의에서 Ada와 C++의 범용 서브프로그램은 틀 역할을 하며, 컴파일 시간에 구체 타입별 코드를 개별적으로 만든다고 설명한다.

상속은 재사용보다 먼저 IS-A 의미를 검사한다

순수 다형성, 즉 서브타입 다형성은 클래스의 상속 관계로 결정된다. 이때 적합 상속은 단순히 코드를 물려받는 관계가 아니라 “하위 클래스는 상위 클래스의 한 종류다”라는 IS-A 의미를 만족해야 한다. RectangleCircleShape의 하위 타입이라는 관계가 그 예다.

추상 클래스는 직접 객체를 생성할 수 없을 정도로 추상화된 클래스이고, 구상 클래스는 직접 객체를 생성할 수 있는 클래스다. 추상 클래스는 공통 계층과 동작의 틀을 제공하고, 구상 클래스가 실제 객체의 구체적 동작을 완성한다.

다중 상속에서는 경로가 둘 이상인지 확인한다

하나의 부모 클래스에서 상속하면 단일 상속, 여러 부모 클래스에서 상속하면 다중 상속이다. 강의의 조교(TA) 예처럼 공통 조상 Human에서 갈라진 StudentTeacher를 모두 상속하면 Human에 이르는 경로가 두 개가 된다. 이때 어느 필드나 메소드를 참조할지 모호해지는 현상이 다이아몬드 상속 문제다. 강의에서는 C++의 가상 상속으로 이를 해결한다고 설명한다.

상속 판단 순서: 먼저 IS-A 의미가 성립하는지 본다. 다음으로 부모가 하나인지 여럿인지, 공통 조상에 이르는 경로가 중복되는지 확인한다. 마지막으로 중복 경로가 있다면 가상 상속처럼 언어가 제공하는 모호성 해소 장치를 검토한다.

인터페이스와 트레잇은 클래스 계층 밖의 능력을 표현한다

강의에서 인터페이스는 추상 메소드의 집합으로만 구성된 타입이며, 구체적인 구현은 구상 클래스가 제공한다. 추상 클래스가 클래스 계층에 활용되는 데 비해 인터페이스는 클래스 계층과 독립적으로 존재할 수 있다. 따라서 서로 다른 계층의 객체에 “말할 수 있음” 같은 공통 능력을 요구할 때 유용하다.

interface Speakable {
  void speak();
}

class Human implements Speakable {
  public void speak() {
    System.out.println("Hello");
  }
}

트레잇은 인터페이스와 비슷하지만 일부 메소드 구현을 포함할 수 있다. 강의에서는 Java 8 이후 인터페이스가 트레잇의 특성을 반영하며, PHP와 Rust는 트레잇을 지원하고 Ruby는 믹스인, Haskell은 클래스라는 이름의 관련 장치를 제공한다고 소개한다. 트레잇은 상속하거나 구현한다고 표현하기보다 사용(use)한다고 표현한다.

판단 상황우선 살필 장치이유
같은 계층의 공통 상태와 기본 행동을 묶는다.추상 클래스클래스 계층 안에서 공통 틀을 제공한다.
서로 다른 계층에 같은 연산 계약을 요구한다.인터페이스구체 구현 없이 능력의 요구 사항을 분리한다.
계층과 독립적으로 일부 구현까지 재사용한다.트레잇메소드 계약과 일부 공통 구현을 함께 제공할 수 있다.

핵심 개념 정리

  • 추상화는 관심의 경계를 정하고, ADT는 자료와 허용 연산의 계약을 만든다.
  • 캡슐화가 요소를 묶는다면 정보 은닉은 외부 접근 범위를 제한해 변경의 파급 효과를 줄인다.
  • 객체는 상태와 반응을 가진 인스턴스이고, 클래스는 공통 필드·메소드와 생성 규칙을 제공한다.
  • 늦은 바인딩은 수신 객체에 맞는 메소드를 선택하며 VTab은 이를 구현하는 대표 장치다.
  • 경험적·매개변수적·순수 다형성은 각각 시그니처, 타입 인수, IS-A 관계를 선택 근거로 삼는다.
  • 상속은 IS-A 의미와 경로 중복을 확인하고, 인터페이스·트레잇은 계층 밖의 공통 능력과 구현 재사용을 표현한다.

새 설계를 만났다면 먼저 사용자가 알아야 할 연산 계약을 적고, 내부 표현이 밖으로 새는지 확인한다. 그다음 상태와 행위를 객체로 묶을 필요가 있는지 판단하고, 같은 이름의 동작이 여러 타입에 필요하면 선택 근거가 시그니처인지 타입 인수인지 실제 서브타입인지 구분한다. 마지막으로 상속의 IS-A 의미, 다중 경로의 모호성, 일부 구현 공유 필요성을 차례로 검사하면 ADT·클래스·다형성·인터페이스·트레잇을 암기 목록이 아니라 일관된 설계 도구로 선택할 수 있다.

예상문제 10선

1. 정보 은닉에 대한 설명으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 관심 요소를 추리거나 삭제하는 것은 추상화의 설명이다.
  • ② 오답: 요소를 한 단위로 묶는 것은 캡슐화이며, 외부 접근 제한까지 보장하지는 않는다.
  • ③ 오답: 수신 객체에 따른 구현 선택은 늦은 바인딩과 관련된다.
  • ④ 정답: 공개 인터페이스와 숨은 구현의 경계를 세우는 것이 정보 은닉의 핵심이다.

2. VTab을 이용한 늦은 바인딩의 흐름으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 기본 인수와 반환 타입은 VTab을 통한 객체별 메소드 선택 절차가 아니다.
  • ② 정답: 실제 수신 객체에 연결된 테이블에서 메소드 주소를 찾아 호출하는 순서다.
  • ③ 오답: 타입 인수로 코드를 구체화하는 과정은 매개변수적 다형성에 가깝다.
  • ④ 오답: 늦은 바인딩은 인터페이스나 상태를 삭제하지 않고 실제 객체에 맞는 구현을 선택한다.

3. 빈 스택 s에 대해 ADT 법칙을 적용할 때 pop(push(push(s, 7), 4))의 결과는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 가장 마지막에 수행한 push의 원소 4가 pop(push(x, e)) = e 법칙에 따라 나온다.
  • ② 오답: 7은 먼저 넣은 원소이므로 4를 한 번 꺼낸 뒤 다음 pop에서 얻을 값이다.
  • ③ 오답: True는 isEmpty(makeStack()) 같은 공백 여부 연산의 결과이지 pop의 결과가 아니다.
  • ④ 오답: pop 한 번 뒤에는 7이 남으므로 스택도 비어 있지 않다.

4. 다형성의 종류와 실제 구현을 선택하는 근거의 연결로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 경험적 다형성은 인수 개수·타입이나 피연산자 타입을 바탕으로 중복 정의 구현을 고른다.
  • ② 오답: 매개변수적 다형성의 핵심 선택 정보는 전달된 타입 인수다.
  • ③ 정답: 순수 다형성은 IS-A 관계의 서브타입을 바탕으로 실제 객체에 맞는 동작을 선택한다.
  • ④ 오답: 기본 인수는 오버로딩 후보를 모호하게 할 수 있지만 순수 다형성의 선택 기준은 아니다.

5. 다음 선언 뒤 f()를 호출했을 때 오류가 발생하는 핵심 이유는? void f(double b = 0.0); void f();

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: double은 정상적인 매개변수 타입이며 문제 원인은 타입 사용 자체가 아니다.
  • ② 정답: 첫 함수는 기본값으로 인수를 생략할 수 있고 둘째 함수도 인수가 없어 시그니처 매칭이 모호하다.
  • ③ 오답: 중복 정의는 반환 타입이 아니라 매개변수 목록으로 구별하며, 같은 반환 타입 자체는 오류 원인이 아니다.
  • ④ 오답: 이 사례는 경험적 다형성의 후보 선택 문제이지 수신 객체의 늦은 바인딩 문제가 아니다.

6. 서로 다른 클래스 계층의 Robot과 Human 모두에 speak() 구현을 요구하되 공통 상태나 구현은 제공하지 않으려 한다. 가장 알맞은 장치는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 데카르트 곱은 타입의 성분을 조합하는 연산이며 공통 메소드 계약을 만들지 않는다.
  • ② 오답: 서로 다른 계층을 하나의 구상 클래스에 억지로 묶으면 IS-A 의미가 깨질 수 있다.
  • ③ 오답: 중복 정의는 호출 시그니처별 구현을 고르는 방법으로 객체가 지켜야 할 능력 계약과 다르다.
  • ④ 정답: 인터페이스는 클래스 계층과 독립적으로 같은 추상 메소드 구현을 요구하는 데 적합하다.

7. 객체·클래스 관련 용어의 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 요청 구문 전체는 메시지이며 속성은 객체의 상태를 정의하는 값이다.
  • ② 오답: 속성을 저장하는 이름은 필드이고 메소드는 요청을 처리하는 서브프로그램이다.
  • ③ 정답: 클래스가 생성 틀이라면 그 틀로 만든 구체 객체가 인스턴스다.
  • ④ 오답: 메타클래스는 모든 클래스의 클래스 구실을 하는 객체이며 추상 클래스와 다른 개념이다.

8. 추상 클래스·인터페이스·트레잇의 구분으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 세 장치를 선택할 때 계층, 계약, 일부 구현 재사용이라는 축을 적용한 올바른 비교다.
  • ② 오답: 강의의 인터페이스는 추상 메소드 집합으로 설명되며 직접 객체 생성이나 공통 상태 저장 장치가 아니다.
  • ③ 오답: 직접 객체를 만들 수 없는 것은 추상 클래스이고 구상 클래스는 인스턴스화할 수 있다.
  • ④ 오답: 트레잇은 일부 메소드 구현을 포함할 수 있으며 다이아몬드 경로만 표현하는 장치가 아니다.

9. Human에서 Student와 Teacher가 갈라지고 TA가 두 클래스를 모두 상속할 때 먼저 점검할 문제는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 타입 인수 전달은 템플릿·제너릭 같은 매개변수적 다형성의 문제다.
  • ② 오답: 생성자 중복 정의는 초기화 조합을 지원하며 공통 조상 경로의 중복과 무관하다.
  • ③ 오답: 연산 법칙만으로 ADT를 규정하는 방식은 상속 경로의 모호성과 다른 주제다.
  • ④ 정답: Human 부분을 어느 상속 경로로 참조할지 모호해지는 다이아몬드 상속 문제이며 C++에서는 가상 상속을 검토한다.

10. 배열 기반 스택을 연결 구조로 바꾸면서 사용 코드를 유지하고, 여러 원소 타입에 같은 정렬 절차도 적용하려 한다. 필요한 설계 조합으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 내부 필드 공개는 구현 교체의 파급 효과를 키우고 반환 타입만으로는 중복 정의 호출을 구분할 수 없다.
  • ② 오답: 상속과 이른 바인딩은 자료 표현 은닉이나 여러 타입에 대한 공통 정렬 틀을 직접 해결하지 않는다.
  • ③ 정답: ADT 계약은 스택 표현 교체를 사용 코드에서 분리하고, 타입 매개변수는 같은 알고리즘을 여러 원소 타입에 적용한다.
  • ④ 오답: 데카르트 곱은 타입 조합 방식이며 스택 연산 계약을 대신하지 않고, 기본 인수 충돌은 해결책이 아니라 오류 원인이다.

참고 자료와 작성 기준

이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 개념 관계, 직접 구성한 예제와 문제 해설은 학습자의 이해를 돕도록 구성하고 검토했습니다.

  • 작성·편집: 올에이클래스 학습연구팀
  • 주요 근거: 한국방송통신대학교 컴퓨터과학과 「프로그래밍언어론」 15강 ‘객체지향과 다형성’ 강의록
  • 보충 자료: 별도 외부 자료를 사용하지 않음
  • 편집 원칙: 올에이클래스 편집 정책
  • 최종 내용 검토: 2026-08-30

댓글