믹스인

객체 지향 프로그래밍 언어에서 믹스인(mixin 또는 mix-in)은 다른 클래스의 부모클래스가 되지 않으면서 다른 클래스에서 사용할 수 있는 메서드를 포함하는 클래스이다. 다른 클래스가 믹스인의 메소드에 액세스하는 방법은 언어에 따라 다르다. 믹스인은 때때로 "상속"이 아니라 "포함"으로 설명된다.

믹스인은 코드재사용성을 높이고 다중상속으로 인해 발생할 수 있는 상속의 모호성 문제("다이아몬드 문제")를 제거하거나 언어에서 다중상속에 대한 지원부족을 해결하기 위해 사용될 수 있다. 믹스인은 구현된 메서드가 포함된 인터페이스로 볼 수도 있다. 이 패턴은 종속성 역전 원칙을 적용하는 예가 되기도 한다.

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

정의 
믹스인은 프로그래머가 특정 코드를 다른 클래스에 삽입 할 수 있도록 하는 프로그래밍 개념이다. 믹스인 프로그래밍은 특정 클래스에 작성된 기능들을 다른 클래스와 혼합하는 소프트웨어 개발 유형이다.

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

장점 

 여러 클래스가 공용기능들을 사용할 수 있게 하는 다중상속의 메카니즘을 제공하지만, 다중상속의 복잡한 의미론은 제거할 수 있다.
 코드 재사용성 : 믹스인은 프로그래머가 서로 다른 클래스간에 기능을 공유하고자 할 때 유용하다. 동일한 코드를 반복해서 작성하는 대신 공통기능을 믹스인으로 그룹화하고 이 기능을 필요로하는 다른 클래스들에 추가할 수 있다.
 믹스인은 부모클래스의 모든 기능을 상속하지 않고 필요로 하는 기능만 상속하고 사용할 수 있다.

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

같이 보기 

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

참고 문헌

외부 링크 

 MixIn at Portland Pattern Repository
 Mixins in ActionScript
 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.

객체 지향 프로그래밍 언어