{{위키데이터 속성 추적}}
[[객체 지향 프로그래밍|객체 지향 프로그래밍 언어]]에서 믹스인('''mixin''' 또는 '''mix-in''')<ref name=":0">[http://www.linuxjournal.com/article/4540 Using Mix-ins with Python]</ref><ref name=":2">[http://www.zorched.net/2008/01/03/implementing-mixins-with-c-extension-methods/ Implementing Mix-ins with C# Extension Methods]</ref><ref name=":3">[http://blogs.msdn.com/abhinaba/archive/2006/01/06/510034.aspx I know the answer (it's 42) : Mix-ins and C#]</ref>은 다른 클래스의 부모클래스가 되지 않으면서 다른 클래스에서 사용할 수 있는 메서드를 포함하는 [[클래스 (컴퓨터 프로그래밍)|클래스]]이다. 다른 클래스가 믹스인의 메소드에 액세스하는 방법은 언어에 따라 다르다. 믹스인은 때때로 "상속"이 아니라 "포함"으로 설명된다.

믹스인은 [[코드 재사용|코드재사용성]]을 높이고 다중상속으로 인해 발생할 수 있는 상속의 모호성 문제("[[다중 상속|다이아몬드 문제]]")를 제거하거나<ref>{{서적 인용|제목=ECOOP '96, Object-oriented Programming: 10th European Conference|성=Boyland|이름=John|성2=Giuseppe Castagna|날짜=26 June 1996|편집자-성=Pierre Cointe|출판사=Springer|쪽=16–17|장=Type-Safe Compilation of Covariant Specialization: A Practical Case|isbn=9783540614395|확인날짜=17 January 2014}}</ref> 언어에서 다중상속에 대한 지원부족을 해결하기 위해 사용될 수 있다. 믹스인은 구현된 [[메소드 (컴퓨터 프로그래밍)|메서드]]가 포함된 인터페이스로 볼 수도 있다. 이 패턴은 [[의존관계 역전 원칙|종속성 역전 원칙]]을 적용하는 예가 되기도 한다.

== 역사 ==
믹스인은 Lisp Machine Lisp의 객체 지향 접근 방식이었던 [[상징|Symbolics]]의 객체지향 Flavors 시스템(Howard Cannon에서 개발)에서 처음 등장했다. 이 이름은 [[서머빌 (매사추세츠주)|매사추세츠]] [[서머빌 (매사추세츠주)|소머빌]] 지역의 스티브 아이스크림 가게에서 영감을 받았다.<ref name=":0">[http://www.linuxjournal.com/article/4540 Using Mix-ins with Python]</ref> 아이스크림 가게의 주인은 기본적인 맛(바닐라, 초콜릿 등)과 추가적인 재료(땅콩, 쿠키, 사탕 등)의 조합으로 버무려진 아이스크림을 판매했다. 이 아이스크림은 "믹스 인 (mix-in)"이라고 불렸으며, 고유 상표가 되었다.

== 정의 ==
믹스인은 프로그래머가 특정 코드를 다른 [[클래스 (컴퓨터 프로그래밍)|클래스]]에 삽입 할 수 있도록 하는 프로그래밍 개념이다. 믹스인 프로그래밍은 특정 클래스에 작성된 기능들을 다른 클래스와 혼합하는 [[소프트웨어 개발]] 유형이다.<ref>http://c2.com/cgi/wiki?MixIn</ref>

믹스인 클래스는 필요로 하는 기능들을 포함하는 상위 클래스로서 역할을 한다. 그리고 [[상속 (객체 지향 프로그래밍)|하위 클래스]]는 이 기능을 상속하거나 단순히 재사용할 수 있다. 하지만 자식클래스를 특수화(Specialization)하는 수단으로는 사용할 수 없다. 일반적으로 믹스인은 엄격한 단일 "is-a"관계(상속관계)를 만들지 않고 원하는 기능을 [[상속 (객체 지향 프로그래밍)|하위 클래스]]로 전달한다. 여기에 믹스인과 [[상속 (객체 지향 프로그래밍)|상속]]의 중요한 차이점이 있다. 자식클래스는 여전히 부모클래스의 모든 기능을 상속 할 수 있지만, 부모와 자식이라는 의미는 반드시 부여될 필요는 없다.

== 장점 ==

# 여러 클래스가 공용기능들을 사용할 수 있게 하는 다중상속의 메카니즘을 제공하지만, 다중상속의 복잡한 의미론은 제거할 수 있다.<ref>http://culttt.com/2015/07/08/working-with-mixins-in-ruby/</ref>
# [[코드 재사용|코드 재사용성]] : 믹스인은 프로그래머가 서로 다른 클래스간에 기능을 공유하고자 할 때 유용하다. 동일한 코드를 반복해서 작성하는 대신 공통기능을 믹스인으로 그룹화하고 이 기능을 필요로하는 다른 클래스들에 추가할 수 있다.<ref>http://naildrivin5.com/blog/2012/12/19/re-use-in-oo-inheritance.html</ref>
# 믹스인은 부모클래스의 모든 기능을 상속하지 않고 필요로 하는 기능만 상속하고 사용할 수 있다.<ref>{{웹 인용|url=http://justinleitgeb.com/ruby/moving-beyond-mixins/|제목=Archived copy|보존url=https://web.archive.org/web/20150925090219/http://justinleitgeb.com/ruby/moving-beyond-mixins/|보존날짜=2015-09-25|url-status=dead|확인날짜=2015-09-16}}</ref>

== 믹스인을 사용하는 프로그래밍 언어 ==
* [[에이다 (프로그래밍 언어)]]
* [[C 샤프]]
* [[어도비 콜드퓨전]]
* [[컬 (프로그래밍 언어)]]
* [[D (프로그래밍 언어)]]
* [[다트 (프로그래밍 언어)]]
* [[팩터 (프로그래밍 언어)]]
* [[아파치 그루비]]
* [[자바 (프로그래밍 언어)]]
* [[자바스크립트]] Delegation
* [[코틀린 (프로그래밍 언어)]]
* [[Less (스타일시트 언어)]]
* [[MATLAB]]
* [[OCaml]]
* [[펄]](Moose 확장을 통해)
* [[PHP]]의 traits
* [[파이썬]]
* [[래킷 (프로그래밍 언어)]]
* [[라쿠 (프로그래밍 언어)]]
* [[루비 (프로그래밍 언어)]]
* [[러스트 (프로그래밍 언어)]]
* [[Sass (스타일시트 언어)]]
* [[스칼라 (프로그래밍 언어)]]
* [[스몰토크]]
* [[스위프트 (프로그래밍 언어)]]
* [[시스템베릴로그]]
* [[타입스크립트]]
* [[발라 (프로그래밍 언어)]]

== 같이 보기 ==

* 추상 유형
* [[데코레이터 패턴]]
* 정책 기반 설계
* Trait, 선형 구성이 필요하지 않는 유사구조

== 각주 ==
{{각주|30em}}

== 외부 링크 ==

* [[c2:MixIn|MixIn]] at Portland Pattern Repository
* [https://web.archive.org/web/20050308114937/http://www.macromedia.com/support/documentation/en/flex/1/mixin/index.html Mixins] in [[액션스크립트|ActionScript]]
* [https://www.dreamsongs.com/Files/ECOOP.pdf The Common Lisp Object System : An Overview] by Richard P. Gabriel and Linda DeMichiel provides a good introduction to the motivation for defining classes by means of generic functions.
{{전거 통제}}

[[분류:객체 지향 프로그래밍 언어]]