맨위로가기

클래스 기반 프로그래밍

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

클래스 기반 프로그래밍은 클래스를 사용하여 객체를 정의하고, 객체 지향 프로그래밍의 핵심 개념인 캡슐화, 상속, 다형성을 지원하는 프로그래밍 방식이다. 캡슐화는 클래스의 불변성을 유지하고, 상속은 기존 클래스를 확장하여 새로운 클래스를 정의하는 방식으로 이루어진다. 상속에는 단일 상속, 다중 상속, 인터페이스 상속이 있으며, 클래스 기반 프로그래밍은 구현과 인터페이스를 혼합한다는 비판을 받기도 한다. 대표적인 클래스 기반 언어로는 스몰토크, PHP, C++, 자바, C#, Objective-C 등이 있다.

2. 캡슐화

캡슐화는 사용자가 클래스의 불변성을 깨는 것을 방지하며, 이는 인터페이스에 노출되지 않은 측면에 대해 사용자 코드에 영향을 주지 않고 객체 클래스의 구현을 변경할 수 있게 해주므로 유용하다. 캡슐화의 정의는 보안 문제보다는 관련 정보의 그룹화 및 패키징(응집도)에 초점을 맞춘다.

3. 상속

클래스 기반 프로그래밍에서 상속은 기존 클래스를 확장하여 새로운 클래스를 정의하는 방식이다. 이때 기존 클래스는 부모 클래스, 새로운 클래스는 하위 클래스라고 부른다. 하위 클래스가 부모 클래스를 하나만 가지면 단일 상속, 여러 부모 클래스를 가질 수 있으면 다중 상속이라고 한다. 이는 클래스를 계층 구조로 구성하며, 단일 상속은 트리, 다중 상속은 격자 형태를 띈다.

상속의 특징은 인터페이스와 구현이 모두 상속된다는 것이다. 상속은 프로토타입 기반 프로그래밍과 같이 클래스 없이도 수행할 수 있다.

3. 1. 단일 상속

클래스 기반 프로그래밍에서 상속은 기존 클래스를 확장하여 새로운 클래스를 정의하는 방식으로 이루어진다. 이때 기존 클래스는 부모 클래스, 새로운 클래스는 하위 클래스라고 부른다. 하위 클래스가 부모 클래스를 하나만 가지는 경우를 단일 상속이라고 한다. 하위 클래스는 부모 클래스의 인터페이스와 구현을 모두 상속받는다.

3. 2. 다중 상속

클래스 기반 프로그래밍에서 상속은 기존 클래스를 확장하여 새로운 클래스를 정의하는 방식으로 이루어진다. 기존 클래스는 부모 클래스가 되고, 새롭게 만들어진 클래스는 하위 클래스가 된다. 하위 클래스가 부모 클래스를 하나만 가지는 경우를 단일 상속이라고 하며, 여러 부모 클래스를 가질 수 있는 경우를 다중 상속이라고 한다. 다중 상속은 클래스들을 격자 형태로 구성한다.[1]

상속을 할 때 인터페이스와 구현이 모두 상속된다. 인터페이스만 상속되는 경우는 인터페이스 상속 또는 '서브타이핑'이라고 한다.[1]

3. 3. 인터페이스 상속

클래스 기반 프로그래밍에서 인터페이스 상속은 인터페이스만 상속되는 경우를 말하며, ''서브타이핑''이라고도 한다.[1]

4. 비판

클래스 기반 언어는 구현과 인터페이스를 혼합한다는 비판을 받는다. 특히 하위 클래스가 하위 형식의 유일한 방법일 경우, 객체 지향 프로그래밍의 핵심 원리인 리스코프 치환 원리가 적용되지 않을 수 있다.[1][2]

또한, 클래스 기반 언어는 대부분 런타임에 객체의 클래스 종류를 변경하는 것을 허용하지 않는다. 예를 들어, 자식 클래스로 생성된 사람 객체는 상위 클래스의 객체가 될 수 없다. 이는 클래스 사용자를 위해 클래스의 통일된 모습을 유지하기 위한 것이다. 그러나 객체를 파괴하고 다시 생성하여 변경을 수행하고, 다형성을 통해 인터페이스를 유지할 수 있다.

4. 1. 리스코프 치환 원칙

형식 언어는 하위 클래스가 하위 형식의 유일한 방법인 경우, 구현과 인터페이스를 혼합한다는 비판을 받아왔으며, 이는 객체 지향 프로그래밍의 핵심 원리이다. 객체 모음을 저장하는 가방 클래스를 만들고, 이를 확장하여 객체 중복을 제거하는 세트 클래스라는 새 클래스를 만들 수 있다.[1][2] 가방 클래스의 객체를 받는 함수는 두 객체를 추가하면 가방의 크기가 2만큼 증가할 것으로 예상할 수 있지만, 세트 클래스의 객체를 전달하면 두 객체를 추가해도 가방의 크기가 2만큼 증가하거나 증가하지 않을 수 있다. 이 문제는 리스코프 치환 원리로 알려진 하위 형식 원리가 적용되지 않는 경우에도 하위 클래스가 하위 형식을 암시하기 때문에 발생한다. 바바라 리스코프와 자넷 윙은 1994년 논문에서 이 원리를 다음과 같이 간결하게 표현했다.

> ''하위 형식 요구 사항'': T 형의 객체 x 에 대해 증명 가능한 속성을 Φ(x)라고 하자. 그러면 S 가 T 의 하위 형식인 경우 S 형의 객체 y 에 대해 Φ(y)가 참이어야 한다.

따라서 일반적으로 하위 형식과 하위 클래스를 구별해야 한다. 현재 대부분의 객체 지향 언어는 하위 형식과 하위 클래스를 구별하지만, 일부 설계 접근 방식은 그렇지 않다.

4. 2. 객체 타입 변경 문제

클래스 기반 언어, 더 정확히는 형식 언어는 하위 클래스가 하위 형식의 유일한 방법인 경우, 구현과 인터페이스를 혼합한다는 비판을 받아왔다. 이는 객체 지향 프로그래밍의 핵심 원리이다.[1][2]

예를 들어, 객체 모음을 저장하는 가방 클래스를 만들고, 이를 확장하여 객체 중복을 제거하는 세트 클래스라는 새 클래스를 만들 수 있다. 가방 클래스의 객체를 받는 함수는 두 객체를 추가하면 가방의 크기가 2만큼 증가할 것으로 예상할 수 있다. 그러나 세트 클래스의 객체를 전달하면 두 객체를 추가해도 가방의 크기가 2만큼 증가하거나 증가하지 않을 수 있다. 이 문제는 리스코프 치환 원리로 알려진 하위 형식 원리가 적용되지 않는 경우에도 하위 클래스가 하위 형식을 암시하기 때문에 발생한다. 바바라 리스코프와 자넷 윙은 1994년 논문에서 이 원리를 다음과 같이 표현했다.

> ''하위 형식 요구 사항'': T 형의 객체 x 에 대해 증명 가능한 속성을 Φ(x)라고 하자. 그러면 S 가 T 의 하위 형식인 경우 S 형의 객체 y 에 대해 Φ(y) 가 참이어야 한다.

일반적으로 하위 형식과 하위 클래스를 구별해야 한다. 대부분의 객체 지향 언어는 하위 형식과 하위 클래스를 구별하지만, 일부 설계는 그렇지 않다.

또 다른 예로, 자식 클래스에서 생성된 사람 객체가 상위 클래스의 객체가 될 수 없는 경우가 있다. 자식 클래스와 상위 클래스는 사람 클래스를 상속받지만, 클래스 기반 언어는 대부분 런타임에 객체의 클래스 종류를 변경하는 것을 허용하지 않기 때문이다. 클래스 기반 언어에서 이러한 제약은 클래스 사용자에 대한 클래스의 통일된 보기를 유지하기 위해 필수적이다. 사용자는 메서드 구현 중 하나가 클래스의 불변량을 깨뜨리는 변경을 일으키는지 신경 쓸 필요가 없다.

객체를 파괴하고 다른 객체를 그 자리에 구성하여 변경을 수행할 수 있다. 객체가 블랙 박스 추상화로 간주되고 객체 ID를 통해 액세스되므로 이러한 변경이 수행될 때에도 다형성을 사용하여 관련 인터페이스를 유지할 수 있다. 그러나 일반적으로 객체를 참조하는 객체 참조의 값이 변경되어 클라이언트 코드에 영향을 미친다.

5. 대표적인 언어

시뮬라가 클래스 추상화를 도입했지만, 클래스 기반 언어의 전형적인 예는 스몰토크이다. 다른 언어로는 PHP, C++, 자바, C#, Objective-C 등이 있다.

참조

[1] 웹사이트 Subtyping, Subclassing, and Trouble with OOP http://okmij.org/ftp[...] 2012-10-07
[2] 웹사이트 A set cannot be a subtype of a bag http://stephane.duca[...] 2012-10-07



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com