믹스인
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
믹스인은 프로그래밍 개념으로, 특정 코드를 다른 클래스에 삽입하여 기능을 재사용할 수 있도록 한다. 1970년대 MIT의 Lisp 방언인 Flavors에서 처음 사용되었으며, 매사추세츠주 소머빌의 아이스크림 가게에서 이름을 따왔다. 믹스인은 다중 상속의 복잡성을 피하면서도 여러 클래스에서 공통으로 사용되는 기능을 쉽게 재사용할 수 있게 해준다. 파이썬, 루비, 스칼라, D, 자바스크립트, 타입스크립트 등 여러 프로그래밍 언어에서 지원하며, C#은 인터페이스와 확장 메서드를 통해 유사한 기능을 구현할 수 있다.
더 읽어볼만한 페이지
- 객체 지향 프로그래밍 언어 - 터보 파스칼
필립 칸이 개발하고 안데르스 헤일스베르그가 기반을 다진 터보 파스칼은 저렴한 가격, 빠른 컴파일, 사용하기 쉬운 IDE를 특징으로 1980년대 PC 프로그래밍에 혁신을 가져왔으며, 여러 기능 추가를 거쳐 델파이 등장 후 레거시 기술이 되었고 일부 버전은 프리웨어로 배포된다. - 객체 지향 프로그래밍 언어 - 펄
펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.
믹스인 | |
---|---|
기본 정보 | |
![]() | |
유형 | 클래스 |
패러다임 | 객체 지향 프로그래밍 |
최초 고안자 | 크리스토퍼 스트레이치 |
최초 구현 | 스몰토크 |
다른 이름 | 추상 서브클래스, 포함 |
프로그래밍 언어에서의 지원 | |
지원 언어 | C++ (템플릿 사용) C# D 델파이 다트 에펠 자바 (인터페이스 및 추상 클래스 사용) 줄리아 루아 믹신 Objective-C 오캄 Perl PHP (트레이트 사용) 파이썬 루비 스칼라 스몰토크 스위프트 비주얼 베이직 닷넷 |
2. 역사
Lisp Machine Lisp에서 사용된 객체 지향 방식인 Symbolics의 객체 지향 플래이버 시스템(하워드 캐논이 개발)에서 믹스인이 처음 등장했다. 믹스인이라는 이름은 매사추세츠주 소머빌에 있는 스티브 아이스크림 가게에서 영감을 받았다.[2] 이 아이스크림 가게 주인은 기본 아이스크림 맛(바닐라, 초콜릿 등)에 추가 재료(견과류, 쿠키, 퍼지 등)를 섞어 "믹스인"이라고 불렀는데, 당시 이 용어를 상표로 등록했다.[3]
믹스인은 프로그래머가 특정 코드를 다른 클래스에 삽입할 수 있도록 하는 프로그래밍 개념이다.[38] 믹스인 프로그래밍은 특정 클래스에 작성된 기능들을 다른 클래스와 혼합하는 소프트웨어 개발 유형이다.[4]
믹스인은 여러 클래스에서 공통으로 사용되는 기능을 재사용할 수 있게 해준다.[40] 부모 클래스의 모든 기능을 상속하는 대신 필요한 기능만 선택적으로 상속받아 사용할 수 있다.[41] 이를 통해 다중 상속의 복잡한 의미 체계를 피하면서도 다중 상속과 유사한 효과를 낼 수 있다.[5]
믹스인은 다양한 프로그래밍 언어에서 지원되거나 다른 방식으로 구현될 수 있다. 다음은 믹스인을 지원하거나 유사한 기능을 구현할 수 있는 언어 목록이다.
믹스인은 1970년대 MIT계 Lisp 방언의 객체 지향 시스템 Flavors(:en:Flavors (programming language))에서 그 이름이 사용되었고 일반화되었다. Flavors는 다중 상속을 특징으로 했다. 명칭은 매사추세츠주 소머빌에 있던 아이스크림 가게[30]에서 힌트를 얻어 고안되었다.[31]
3. 정의
믹스인 클래스는 필요한 기능들을 포함하는 상위 클래스 역할을 한다. 하위 클래스는 이 기능을 상속하거나 단순히 재사용할 수 있지만, 자식 클래스를 특수화(Specialization)하는 수단으로는 사용할 수 없다. 일반적으로 믹스인은 엄격한 단일 "is-a" 관계(상속 관계)를 만들지 않고 원하는 기능을 하위 클래스로 전달한다. 여기에 믹스인과 상속의 중요한 차이점이 있는데, 자식 클래스는 여전히 부모 클래스의 모든 기능을 상속할 수 있지만, 부모와 자식이라는 의미가 반드시 부여될 필요는 없다는 것이다.
믹스인은 코드 재사용을 촉진한다.
4. 장점
믹스인은 코드 재사용성을 높여준다. 프로그래머는 서로 다른 클래스 간에 기능을 공유하기 위해 동일한 코드를 반복해서 작성하는 대신, 공통 기능을 믹스인으로 묶어 필요한 각 클래스에 포함시킬 수 있다.[6]
5. 믹스인을 사용하는 프로그래밍 언어
C#과 Visual Basic .NET과 같이 믹스인을 직접 지원하지 않는 언어는 인터페이스에 확장 메서드를 추가하여 믹스인과 유사하게 동작하도록 할 수 있다.
5. 1. 파이썬 (Python)
파이썬은 믹스인을 지원하는 대표적인 언어 중 하나이다. 파이썬의 `SocketServer` 모듈은 믹스인의 활용 예시를 보여준다.[16] 이 모듈에는 UDP 소켓 서버 역할을 하는 `UDPServer` 클래스와 TCP 소켓 서버 역할을 하는 `TCPServer` 클래스가 있다. 또한, `ForkingMixIn`과 `ThreadingMixIn`이라는 두 가지 믹스인 클래스도 제공된다.
일반적으로 모든 새로운 연결은 동일한 프로세스 내에서 처리된다. 그러나 `TCPServer`를 `ThreadingMixIn`과 함께 사용하면 각 연결에 대해 새로운 스레드를 생성할 수 있다.
```python
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
pass
```
`ThreadingMixIn` 클래스는 TCP 서버에 각 새로운 연결이 새로운 스레드를 생성하는 기능을 추가한다. 같은 방식으로 `ThreadingMixIn`의 코드를 복제하지 않고도 `ThreadingUDPServer`를 만들 수 있다. 또는 `ForkingMixIn`을 사용하면 각 새로운 연결에 대해 프로세스가 포크된다. 이러한 스레드 생성이나 프로세스 포크 기능은 독립 실행형 클래스로는 유용성이 떨어지지만, 믹스인을 통해 소켓 서버의 기능을 확장할 수 있다.
이처럼 믹스인은 소켓 서버로서의 기능에 영향을 주지 않으면서 대체 기본 기능을 제공하는 역할을 한다.
5. 2. 루비 (Ruby)
루비는 모듈(Module)을 통해 믹스인 방식을 지원한다. `include` 키워드를 사용하여 모듈을 클래스에 포함시키면, 해당 모듈의 기능을 클래스에서 사용할 수 있다.
```ruby
class Student
include Comparable # Student 클래스는 'include' 키워드를 사용하여 Comparable 모듈을 상속한다.
attr_accessor :name, :score
def initialize(name, score)
@name = name
@score = score
end
# Comparable 모듈을 포함하려면 구현 클래스가 <=> 비교 연산자를 정의해야 한다.
# 다음은 비교 연산자이다. 두 학생 인스턴스를 점수를 기준으로 비교한다.
def <=>(other)
@score <=> other.score
end
# 다음은 중요한 부분이다. Comparable 인터페이스의 <, <=, >, >= 및 기타 메서드에 무료로 액세스할 수 있다.
end
s1 = Student.new("Peter", 100)
s2 = Student.new("Jason", 90)
s1 > s2 #true
s1 <= s2 #false
```
객체 지향 프로그래밍에서 상속은 본래 특화를 의도한 것이다. 즉, 상속하는 측(파생형)과 상속되는 측(기저형) 사이에는 리스코프 치환 원칙이 있음을 전제로 한다.
그러나 실제로는 구현 재사용을 위한 수단으로 사용되는 경우가 많다(남용되는 경향이 있다). 믹스인에서의 상속도 앞서 언급한 특화를 위한 것이 아니라, 여러 기능을 모으기 위한 수단이다. 특히 클래스의 다중 상속이 가능한 시스템에서는 여러 믹스인 클래스를 다중 상속하여 "단순히 여러 기능을 가진 클래스"를 쉽게 만들 수 있다. 전형적인 예로는 InputStream과 OutputStream이라는 믹스인 클래스를 다중 상속하여 InputOutputStream이라는 양방향 스트림 클래스를 만드는 패턴이 있다.
5. 3. C#
C#은 직접적인 믹스인 기능은 없지만, 인터페이스와 확장 메서드를 조합하여 믹스인과 유사한 효과를 낼 수 있다.[20][21][22] C# 8.0은 기본 인터페이스 메서드 기능을 추가했다.[23][24]
```csharp
using System.Linq;
System.Collections.Generic.IEnumerable
// IEnumerable
// 실제로는 System.Linq.Enumerable 클래스에 구현된 확장 메서드이다.
int sum = range.Sum();
// 위는 다음의 당의 구문이다.
int sum = Enumerable.Sum(range);
6. 비판 및 고려 사항
믹스인은 코드 재사용을 촉진하지만, 그에 따른 어느 정도의 타협도 따른다. 믹스인을 남용하면 코드의 복잡성이 증가할 수 있다.
객체 지향 프로그래밍에서 상속은 본래 특화를 의도한 것이지만, 실제로는 구현 재사용을 위한 수단으로 사용되는 경우가 많다. 믹스인에서의 상속도 여러 기능을 모으기 위한 수단으로 사용된다. 클래스의 다중 상속이 가능한 시스템에서는 여러 믹스인 클래스를 다중 상속하여 "단순히 여러 기능을 가진 클래스"를 쉽게 만들 수 있다. 예를 들어 InputStream과 OutputStream이라는 믹스인 클래스를 다중 상속하여 InputOutputStream이라는 양방향 스트림 클래스를 만드는 패턴이 있다.
클래스의 다중 상속, 즉 구현의 다중 상속이 불가능하고 인터페이스의 복수 구현에 의한 타입의 다중 상속만 가능한 Java나 C# 등의 관점에서는 믹스인을 "메서드 구현이 있는 인터페이스"라고도 할 수 있다. 클래스가 믹스인을 포함하는 경우, 그 인터페이스를 구현한 클래스는 믹스인의 속성과 조작을 가져온다. 이는 상속과는 다르다. 가져온 요소는 컴파일 시 클래스의 일부가 된다. 믹스인은 인터페이스를 구현할 필요는 없지만, 인터페이스를 구현하면 그 인터페이스를 필요로 하는 메서드에 인수로 인스턴스를 전달할 수 있다는 이점이 있다.
7. 같이 보기
- 상속 (프로그래밍)
- 다중 상속
- 리스코프 치환 원칙
- 인터페이스 (컴퓨터 과학)
참조
[1]
서적
ECOOP '96, Object-oriented Programming: 10th European Conference
Springer
1996-06-26
[2]
웹사이트
Using Mix-ins with Python Linux Journal
https://www.linuxjou[...]
2023-05-23
[3]
웹사이트
Mix-Ins (Steve's ice cream, Boston, 1975)
https://listserv.lin[...]
2002-08-03
[4]
웹사이트
Mix In
http://wiki.c2.com/?[...]
[5]
웹사이트
Working with Mixins in Ruby
http://culttt.com/20[...]
2015-07-08
[6]
웹사이트
Re-use in OO: Inheritance, Composition and Mixins
http://naildrivin5.c[...]
[7]
웹사이트
Moving beyond mixins » Justin Leitgeb
http://justinleitgeb[...]
[8]
웹사이트
Mixin-based Inheritance
http://www.bracha.or[...]
[9]
웹사이트
Create mixin types using default interface methods
https://docs.microso[...]
[10]
웹사이트
ET: Inheritance
https://www.eiffel.o[...]
2024-06-03
[11]
웹사이트
Factor/Features/The language
http://concatenative[...]
concatenative.org
2010-01-25
[12]
웹사이트
Classes - MATLAB & Simulink - MathWorks India
https://in.mathworks[...]
[13]
웹사이트
Mixin objects
https://www.lexifi.c[...]
LexiFi
2013-06-14
[14]
웹사이트
Mixin Class Composition
http://docs.scala-la[...]
École polytechnique fédérale de Lausanne
[15]
웹사이트
XOTcl - Tutorial
http://media.wu-wien[...]
[16]
웹사이트
cpython: 2cb530243943 Lib/socketserver.py
https://hg.python.or[...]
[17]
웹사이트
Mixins, Forwarding, and Delegation in JavaScript
http://raganwald.com[...]
[18]
웹사이트
DRY JavaScript with mixins
http://bob.yexley.ne[...]
[19]
웹사이트
Default Methods (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance)
https://docs.oracle.[...]
[20]
웹사이트
Implementing Mixins with C# Extension Methods
https://www.zorched.[...]
[21]
웹사이트
I know the answer (it's 42) : Mix-ins and C#
http://blogs.msdn.co[...]
2006-09-04
[22]
웹사이트
Mixins, generics and extension methods in C#
http://erwyn.bloggin[...]
[23]
웹사이트
Extension methods
https://flutterbyexa[...]
[24]
웹사이트
Create mixin types using default interface methods Microsoft Docs
https://docs.microso[...]
2020-04-13
[25]
웹사이트
Drehtür: The-many-Talents-of-JavaScript
http://peterseliger.[...]
2014-04-11
[26]
웹사이트
A fresh look at JavaScript Mixins
https://javascriptwe[...]
2011-05-31
[27]
웹사이트
javascript-code-reuse-patterns/source/components/composition at master · petsel/javascript-code-reuse-patterns
https://github.com/p[...]
[28]
웹사이트
Scala in practice: Traits as Mixins – Motivation
https://gleichmann.w[...]
2009-07-19
[29]
웹사이트
Traits: Defining Shared Behavior - the Rust Programming Language
https://doc.rust-lan[...]
[30]
문서
Steve's Ice Cream Parlor
[31]
웹사이트
Using Mix-ins with Python
http://www.linuxjour[...]
[32]
웹사이트
LISTSERV 14.4
http://listserv.ling[...]
[33]
웹사이트
Using Mix-ins with Python
http://www.linuxjour[...]
[34]
웹사이트
Implementing Mix-ins with C# Extension Methods
http://www.zorched.n[...]
[35]
웹사이트
I know the answer (it's 42) : Mix-ins and C#
http://blogs.msdn.co[...]
[36]
서적
ECOOP '96, Object-oriented Programming: 10th European Conference
Springer
1996-06-26
[37]
웹사이트
Using Mix-ins with Python
http://www.linuxjour[...]
[38]
웹사이트
http://c2.com/cgi/wi[...]
[39]
웹사이트
http://culttt.com/20[...]
[40]
웹사이트
http://naildrivin5.c[...]
[41]
웹인용
Archived copy
http://justinleitgeb[...]
2015-09-16
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com