SlideShare a Scribd company logo
1 of 46
Download to read offline
Code Reuse
@상속 @합성 @추상화 @믹스인 @DRY
#다우기술 김정규
김정규
regular
Len
https://github.com/LenKIM
@다우기술
우리의 목표!!
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이해
할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속과
합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목표입
니다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
우리는 왜 코드를 재사용해야 하는가?
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
우리는 돌아가는 Code를 통해 이해합시다.
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_inheritance/step02
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
중복 코드가 가지는 가장 큰 문제는 코드를 수정하는 데 

필요한 노력을 몇 배로 증가시킨다.
모든 지식은 시스템 내에서 단일하고, 애매하지 않고, 정말로 믿을 만한 표현 양식을 가져야 한다.
DRY 원칙(Don’t Repeat Yourself)
그럼, 중복 코드를 제거하기 위한 여정을 떠나봅시다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
타입 코드 사용하기
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_inheritance/step03
문제는 여전히 남아 있습니다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
타입 코드 사용하기
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_inheritance/step03
문제는 여전히 남아 있습니다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
상속을 활용한 코드 재사용
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_inheritance/step04
여기에도 문제는 여전히 남아 있습니다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
강하게 결합된 Phone과 NightlyDiscountPhone
Phone
NightlyDiscountPhone
Super() @Override
어떻게 알 수 있는가?

세금을 계산하는 로직을 추가해보자.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
정답은 추상화에 의존시키자.
• 두 메서드가 유사하게 보인다면 차이점을 메서드로 추출하라. 

메서드 추출을 통해 두 메서드를 동일한 형태로 보이도록 만들 수 있다.
• 부모 클래스의 코드를 하위로 내리지 말고 자식 클래스의 코드를 상위로 올려라. 

즉, 부모클래스의 추상화을 활용해 의존을 역전시켜라.(=추상 메서드 패턴)
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
코드를 추상화에 의존시키자.
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_inheritance/step05
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
세금을 추가하는 요구사항이 들어온다면,
더 이상 중복코드를 일으키지 않았다.
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_inheritance/step05
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
상속을 사용하기 위해서는 지켜야 하는 주의 사항
경고 1

자식 클래스의 메서드 안에서 Super 참조를 이용해 부모 클래스의 메서드를 직접 호출할 경우

두 클래스는 강하게 결합된다. super 호출을 제거할 수 있는 방법을 찾아 결합도를 제거하라.
경고 2

상속받은 부모 클래스의 메서드가 자식 클래스의 내부 구조에 대한 규칙을 깨트릴 수 있다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
상속을 사용하기 위해서는 지켜야 하는 주의 사항
경고 3

자식 클래스가 부모 클래스의 메서드를 오버라이딩할 경우 

부모 클래스가 자신의 메서드를 사용하는 방법에 자식클래스가 결합 될 수 있다.
경고 4

클래스를 상속하면 결합도로 인해 자식 클래스와 부모 클래스의 구현을 영원히 변경하지 않거나, 

자식 클래스와 부모 클래스를 동시에 변경하거나 둘 중 하나를 선택할 수밖에 없다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
위 주의사항을 지키지 않으면 상속은 여러 단점을 가지게 됩니다.
불필요한 인터페이스 상속
메서드 오버라이딩의 오작용 문제
부모 클래스와 자식 클래스의 동시 수정 문제
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다. 불필요한 인터페이스 상속
Stack<String> stack = new Stack<>();

stack.push("1st");

stack.push("2st");

stack.push("3st");

stack.add(0, "4th"); //vector 의 메서드

stack.iterator().forEachRemaining(System.out::println);

System.out.println(stack.pop()); 

//객체지향 관점에서 좋은 코드라고 생각되는가?
Properties properties = new Properties();

properties.setProperty("A", "C++");

properties.setProperty("B", "D++");

properties.put("ABC", 55);

System.out.println(properties.getProperty(“ABC"));

// 위 코드의 정답은? null
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다. 메서드 오버라이딩의 오작용 문제
public class InstrumentedHashSet<E> extends HashSet<E> {

private int addCount = 0;

@Override

public boolean add(E e) {

addCount++;

return super.add(e);

}

@Override

public boolean addAll(Collection<? extends E> c) {

addCount += c.size();

return super.addAll(c);

}

public int getAddCount() {

return addCount;

}

}

public static void main(String[] args) {

//메서드 오버라이딩의 오작용 문제.

InstrumentedHashSet<String> languages = new InstrumentedHashSet<>();

languages.addAll(Arrays.asList("Java", "Ruby", "scala"));

System.out.println(languages.getAddCount()); 

// 결론적으로 위 값은 6이 나온다.

}
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
부모 클래스와 자식 클래스의 동시 수정 문제
public class Song {

private String singer;

private String title;

public Song(String singer, String title) {

this.singer = singer;

this.title = title;

}

public String getSinger() {

return singer;

}

public String getTitle() {

return title;

}

}

public class Playlist {

private List<Song> tracks = new ArrayList<>();

public void append(Song song) {

getTracks().add(song);

}

public List<Song> getTracks() {

return tracks;

}

}

public class PersonalPlaylist extends Playlist {

public void remove(Song song) {

getTracks().remove(song);

}

}
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
부모 클래스와 자식 클래스의 동시 수정 문제
public class Song {

private String singer;

private String title;

public Song(String singer, String title) {

this.singer = singer;

this.title = title;

}

public String getSinger() {

return singer;

}

public String getTitle() {

return title;

}

}

만약, 노래 뿐만아니라, 가수(singer)도 

플레이리스트에서 관리하게 된다면?
public class Playlist {

private List<Song> tracks = new ArrayList<>();

private Map<String, String> singers = new HashMap<>();

public void append(Song song) {

getTracks().add(song);

}

public List<Song> getTracks() {

return tracks;

}

}

public class PersonalPlaylist extends Playlist {

public void remove(Song song) {

getTracks().remove(song);

getSingers().remove(song.getSinger());

}

}
그러나, 상속의 가장 큰 문제는 조합의 폭발적인 증가
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
๏하나의 기능을 추가하거나 수정하기 위해 불필요하게 많은 수
의 클래스를 추가하거나 수정해야 한다.

๏단일 상속만 지원하는 언어에서는 상속으로 인해 오히려 중복
코드의 양이 늘어날 수 있다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
기본 정책

일반 요금제 심야 할인 요금제
부가 정책

세금 정책 기본 요금 할인 정책
만약 요구사항이 더 추가 된다면?
일반 요금제
심야 할인 요금제
세금 정책
기본 요금 할인 정책
기본정책
일반 요금제
심야 할인 요금제
일반 요금제
심야 할인 요금제
세금 정책
기본 요금 할인 정책 세금 정책
부가 정책
일반 요금제
심야 할인 요금제
세금 정책
기본 요금 할인 정책
기본정책
일반 요금제
심야 할인 요금제
일반 요금제
심야 할인 요금제
세금 정책
기본 요금 할인 정책 세금 정책
부가 정책
조합의
폭발적인
증가
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_inheritance/step07
조합의
폭발적인
증가
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_inheritance/step07
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
또한, 다른 요구사항이 추가된다면?
네모박스 친 만큼의 데이터를 추가해야되며,
확장에는 닫혀있고, 수정에는 열려있는 되는 구조를 가집니다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
컴파일타임 의존성 런타임 의존성
합성을 이해하기 앞서
차이를 이해할 수 있어야 합니다.
vs
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
상속 관계는 컴파일타임에 결정되고 고정되기 때문에 코드를 실행하는 도중에는 

런타임 의존성이 변경할 수 없다.
상속 관계는 컴파일타임 의존성과 런타임 의존성이 동일합니다.

그럼 합성 관계는 어떤 모습일까?
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.
유연한 설계를 위해서는
컴파일 타임 의존성을 고정시키고, 런타임 의존성은 변경되어야 한다.
다시 말해,
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.
유연한 설계를 위해서는
컴파일 타임 의존성을 고정시키고, 런타임 의존성은 변경되어야 한다.
다시 말해,
즉, 합성은
컴파일타임 관계를 런타임 관계로 변경함으로써 문제를 해결합니다.
일반 요금제
심야 할인 요금제
세금 정책
기본 요금 할인 정책
기본정책
일반 요금제
심야 할인 요금제
일반 요금제
심야 할인 요금제
세금 정책
기본 요금 할인 정책 세금 정책
부가 정책
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_inheritance/step07
일반 요금제
심야 할인 요금제
세금 정책
기본 요금 할인 정책
기본정책
일반 요금제
심야 할인 요금제
일반 요금제
심야 할인 요금제
세금 정책
기본 요금 할인 정책 세금 정책
부가 정책
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_composition/step01
합성으로 기본정책 구현하기
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
부가 정책까지 추가한다면?
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_composition/step02
합성으로 추가정책까지 구현하기
다이어그램.
다이어그램.
만약 또다른 새로운 요구사항이 들어와 클래스를 추가해야 한다면?
다이어그램.
만약 또다른 새로운 요구사항이 들어와 클래스를 추가해야 한다면?
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
믹스인(mixin)
객체를 생성할 때 코드 일부를 클래스 안에 섞어 넣어 재사용하는 기법을 가리키는 용어
합성이 실행 시점에 객체를 조합하는 재사용 방법이라면
믹스인은 컴파일 시점에 필요한 코드 조각을 조합하는 재사용 방법이다.
https://docs.scala-lang.org/ko/tutorials/tour/mixin-class-composition.html.html
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
역시 이것도 돌아가는 코드로.
https://github.com/LenKIM/code-reuse-seminar/tree/master/src/billing_mixin
오늘우리는왜코드를재사용해야하는가?에대한탐구와,상속을활용
한코드재사용을살펴보고,이과정에서코드추상화로서상속이가진
단점을해결하며,상속이가진단점을다시한번상기시켜봅니다.
더하여,상속이가진고질적인단점을합성으로바꿔보면서상속의궁극적
인단점을극복합니다.이과정에서우리는상속과합성의장단점을이
해할수있습니다.
마지막으로,스칼라에서는믹스인이라는기법을제공하는데,이는상속
과합성의중간쯤에있는문법으로무엇인지이해해보는것이오늘의목
표입니다.
TaxableRegularPolicy
RegularPolicy
TaxablePolicy
BasicRatePolicy
class TaxableRegularPolicy(amount: Money, seconds: Duration, val taxRate: Double) 

extends RegularPolicy(amount, seconds) 

with TaxablePolicy
RateDiscountablePolicy
RegularPolicy
TaxablePolicy
BasicRatePolicy
val traitPhone = new Phone(

List(

Call(LocalDateTime.of(2017, 1, 2, 10, 0), LocalDateTime.of(2017, 1, 2, 10, 1))

),

new RegularPolicy(Money.wons(100), Duration.ofSeconds(10)) 

with RateDiscountablePolicy 

with TaxablePolicy {

val discountAmount: Money = Money.wons(100)

val taxRate = 0.02

})

쌓을 수 있는 변경

More Related Content

More from Jeong-gyu Kim

Deep dive functional thinking
Deep dive functional thinkingDeep dive functional thinking
Deep dive functional thinkingJeong-gyu Kim
 
Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리Jeong-gyu Kim
 
'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나Jeong-gyu Kim
 
Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄Jeong-gyu Kim
 
Intern pt sw_r&amp;d_len_second_mission
Intern pt sw_r&amp;d_len_second_missionIntern pt sw_r&amp;d_len_second_mission
Intern pt sw_r&amp;d_len_second_missionJeong-gyu Kim
 
Log Parser Story In Python3
Log Parser Story In Python3Log Parser Story In Python3
Log Parser Story In Python3Jeong-gyu Kim
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Jeong-gyu Kim
 

More from Jeong-gyu Kim (10)

00.cnn basic
00.cnn basic00.cnn basic
00.cnn basic
 
Deep dive functional thinking
Deep dive functional thinkingDeep dive functional thinking
Deep dive functional thinking
 
Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리
 
'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나
 
Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄
 
Intern pt sw_r&amp;d_len_second_mission
Intern pt sw_r&amp;d_len_second_missionIntern pt sw_r&amp;d_len_second_mission
Intern pt sw_r&amp;d_len_second_mission
 
Log Parser Story In Python3
Log Parser Story In Python3Log Parser Story In Python3
Log Parser Story In Python3
 
Stampfood 2.0
Stampfood 2.0Stampfood 2.0
Stampfood 2.0
 
You dont know_js
You dont know_jsYou dont know_js
You dont know_js
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)
 

코드 재사용에 대해서 생각해보기