[NHN NEXT] Java 강의 - Week4

2,604 views

Published on

Published in: Software

[NHN NEXT] Java 강의 - Week4

  1. 1. PL in Java Week04 Polymorphism 조영호 snatcher@nhn.com
  2. 2. 지난 주에…
  3. 3. 사람과 킬러
  4. 4. 일반화와 특수화 일반화 특수화
  5. 5. 일반화와 특수화 일반화 특수화 설명은 더 추상적이고 집합의 크기는 더 크고
  6. 6. 일반화와 특수화 일반화 특수화 설명은 더 구체적이고 집합의 크기는 더 작고
  7. 7. 일반화와 특수화 일반화 특수화 특수화 집합은 일반화 집합의 부분집합 ⊂
  8. 8. 사람 킬러더 일반적인 개념 더 특수한 개념
  9. 9. class Person { String name; int age; String introduce() { } } Person & Killer class Killer extends Person { String warning; String weapon; String getWeapon() { } } 일반화 특수화
  10. 10. is-a Relationship Killer is-a Person
  11. 11. Person KillerClass Class new Killer() new Killer() new Killer() new Person() new Person() new Person() new Person() new Person() new Person() new Person() new Person() new Person() new Person()
  12. 12. name = 요츠바 age = 5 warning = You.. weapon = 총 Person Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); yotsuba Killer
  13. 13. this
  14. 14. class Person { String name; int age; ... String introduce() { return "이름 : " + name + ", 나이 " + age + "세 "; } } Person yotsuba = new Person("요츠바", 5); name = 요츠바 age = 5 this class Person String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } class class Object superclass String toString() { ... }
  15. 15. Method Lookup this에서 시작
  16. 16. class Person { String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } } name = 요츠바 age = 5 this class Person String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } class class Object superclass String toString() { ... } yotsuba.introduce()
  17. 17. class Person { String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } } name = 요츠바 age = 5 this class Person String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } class class Object superclass String toString() { ... } yotsuba.toString()
  18. 18. class Killer extends Person { } Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); name = 요츠바 age = 5 warning = You.. weapon = 총 this class Person String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } class class Object superclass String toString() { ... } class Killer superclass class Person { String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } }
  19. 19. name = 요츠바 age = 5 warning = You.. weapon = 총 this class Person String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } class class Object superclass String toString() { ... } class Killer superclass yotsuba.introduce() class Killer extends Person { } class Object class Person { String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } }
  20. 20. name = 요츠바 age = 5 warning = You.. weapon = 총 this class Person String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } class superclass String toString() { ... } class Killer superclass yotsuba.introduce() String introduce() { return "무기 : " + weapon + "," + "이름 : " + name + ", 나이 " + age + "세"; } class Killer extends Person { String introduce() { return "무기 : " + weapon + "," + "이름 : " + name + ", 나이 " + age + "세"; } } class Person { String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } } class Object
  21. 21. To p i c s UpCasting Polymorphism Polymorphic Arguments Role Abstract Class Interface
  22. 22. class Person { } class Killer extends Person { } Person Killer UML
  23. 23. Person Killer Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); Parent <= Child
  24. 24. Person Killer Parent <= Child UpCasting Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총");
  25. 25. Person Killer Child <= Parent Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); Killer killerYotsuba = yotsuba;
  26. 26. Person Killer Child <= Parent Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); Killer killerYotsuba = yotsuba; Compile Error!
  27. 27. Person Killer Child <= Parent DownCasting Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); Killer killerYotsuba = yotsuba;
  28. 28. Person Killer Child <= (Child)Parent DownCasting Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); Killer killerYotsuba = (Killer)yotsuba;
  29. 29. Person Killer Killer yotsuba = (Killer)new Person("요츠바", 5); Compile Success
  30. 30. Person Killer Killer yotsuba = (Killer)new Person("요츠바", 5); Runtime Exception ClassCastException
  31. 31. Compile Time Runtime vs
  32. 32. Compile Time Person yotsuba = ... Killer killeryotsuba = ... Person yotsuba = killeryotsuba; Killer killeryotsuba = (Killer)yotsuba; 실제 생성된 객체 타입이 무엇이건 상관없이 참조 변수의 타입만을 이용해 업/다운 캐스팅
  33. 33. Runtime Person yotsuba = new Person("요츠바", 5); Killer killeryotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); Killer killeryotsuba = (Killer)yotsuba; 실제 생성된 객체 타입을 이용해 업/다운 캐스팅 ClassCastException
  34. 34. Runtime - instanceof instanceof DownCast Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); if (yotsuba instanceof Killer) { Killer killerYotsuba = (Killer)yotsuba; killerYotsuba.getWeapon(); }
  35. 35. To p i c s UpCasting Polymorphism Polymorphic Arguments Role Abstract Class Interface
  36. 36. Polymorphism many forms
  37. 37. 서로 다른 타입 서로 다른 행동 같은 메시지
  38. 38. Person yotsuba = ... yotsuba.introduce();
  39. 39. Person yotsuba = new Person("요츠바", 5); yotsuba.introduce(); 이름 : 요츠바, 나이 5세
  40. 40. Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); yotsuba.introduce(); 무기 : 총, 이름 : 요츠바, 나이 5세
  41. 41. UpCasting Person = Person Person = Killer
  42. 42. this Method Lookup
  43. 43. class Person { String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } } name = 요츠바 age = 5 this class Person String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } class class Object superclass String toString() { ... } yotsuba.introduce() Person yotsuba = new Person("요츠바", 5);
  44. 44. name = 요츠바 age = 5 warning = You.. weapon = 총 this class Person String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } class class Object superclass String toString() { ... } class Killer superclass yotsuba.introduce() class Killer extends Person { String introduce() { return "무기 : " + weapon + "," + "이름 : " + name + ", 나이 " + age + "세"; } } class Person { String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } } Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); String introduce() { return "무기 : " + weapon + "," + "이름 : " + name + ", 나이 " + age + "세"; }
  45. 45. Runtime Binding or Dynamic Binding
  46. 46. To p i c s UpCasting Polymorphism Polymorphic Arguments Role Abstract Class Interface
  47. 47. Person yotsuba = new Killer("요츠바", 5, "You can tell me in hell.", "총"); 이게 가능하다면
  48. 48. void method(Person person) { ... } 이것도 가능합니다 method(new Killer("요츠바", 5, "You can tell me in hell.", "총"));
  49. 49. IronMan Person
  50. 50. class IronMan { Person person; IronMan(Person person) { this.person = person; } } 생성자도 일종의 메소드 IronMan ironMan = new IronMan(new Person("토니 스타크", 40)); IronMan ironYotsuba = new IronMan(new Killer("요츠바", 5, "You can tell me in hell.", "총"));
  51. 51. public class IronMan { Person person; IronMan(Person person) { this.person = person; } String introduce() { return person.introduce(); } } Polymorphism
  52. 52. To p i c s UpCasting Polymorphism Polymorphic Arguments Role Abstract Class Interface
  53. 53. 역할, 책임, 협력
  54. 54. 시체를 검시해 주게 사건을 수사해 주세요 경감 탐정 조수 역할 책임 협력
  55. 55. public class IronMan { Person person; IronMan(Person person) { this.person = person; } String introduce() { return person.introduce(); } } IronMan.introduce()
  56. 56. introduce introduce Collaboration IronMan Person
  57. 57. introduce introduce Responsibility IronMan Person
  58. 58. IronMan Person introduce introduce Role
  59. 59. IronMan Person introduce introduce Introduce라는 메시지를 수신하고 처리할 수만 있다면 introduce
  60. 60. IronMan introduce introduce 모두 다 Person 역할을 수행할 수 있다고 볼 수 있습니다. Person
  61. 61. IronMan introduce introduce 다형성은 동일한 역할을 수행하는 객체들이 동일한 메시지에 대해 서로 다른 방식으로 반응하는 것을 의미 Person
  62. 62. IronMan introduce introduce Person in OO Paradigm Generalization
  63. 63. IronMan introduce introduce Person in Class-Based OOPL Inheritance
  64. 64. Person Role class Person { } class Killer extends Person { } class Musician extends Person { } Person KillerMusician
  65. 65. IronMan introduce introduce 모두 다 Person 역할을 수행할 수 있다는 것은 Person
  66. 66. IronMan introduce introduce Person 대신 사용될 수 있다는 것을 의미합니다 Person
  67. 67. UpCasting class Person { } class Killer extends Person { } class Musician extends Person { } Person KillerMusician
  68. 68. IronMan은 미래에 등장할 Person의 서브 클래스와도 협력이 가능 Person KillerMusician IronMan
  69. 69. Flexible
  70. 70. To p i c s UpCasting Polymorphism Polymorphic Arguments Role Abstract Class Interface
  71. 71. IronMan introduce introduce Person IronMan의 입장에서는
  72. 72. IronMan introduce introduce Person 대신 사용되는 객체들이 introduce 메시지를 이해할 수만 있으면 됩니다. Person
  73. 73. IronMan introduce introduce Introduce에 대한 메소드가 실제로 어떻게 구현되어 있는지는 상관이 없습니다. Person
  74. 74. class Person { String name; int age; String introduce() { } } introduce()의 시그니처만 알면 되죠
  75. 75. class Person { String name; int age; abstract String introduce(); } Abstract Method Child Class는 반드시 Abstract Method를 Override 해야 합니다
  76. 76. abstract class Person { String name; int age; abstract String introduce(); } Abstract Class Abstract Method를 가진 Class는 Abstract Class로 선언되어야 합니다.
  77. 77. abstract class Person { String name; int age; abstract String introduce(); } Abstract Class Abstract Class는 new를 이용해 인스턴스를 생성할 수 없습니다.
  78. 78. class Kid extends Person { String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } } Kid class
  79. 79. class Killer extends Person { String introduce() { return "무기 : " + weapon + ", " + "이름 : " + name + ", 나이 " + age + "세"; } } Killer class
  80. 80. class Musician extends Person { String introduce() { return "악기 : " + instrument + ", " + "이름 : " + name + ", 나이 " + age + "세"; } } Musician class
  81. 81. abstract class Person { String name; int age; abstract String introduce(); } Specification IronMan과 협력하려면 introduce를 구현해야 한다
  82. 82. abstract class Person { String name; int age; abstract String introduce(); } Remove Code Duplication Person 역할을 하는 모든 객체들은 name과 age를 가져야 한다
  83. 83. To p i c s UpCasting Polymorphism Polymorphic Arguments Role Abstract Class Interface
  84. 84. IronMan introduce introduce Person Iron과 함께 협력하는 클래스들은
  85. 85. IronMan introduce introduce Person IronMan과 함께 협력하는 클래스들은
  86. 86. Person의 서브 클래스들로 한정 Person KillerMusician IronMan
  87. 87. 만약 IronMan 안에 펭귄을 넣고 싶다면?
  88. 88. Person 상속 계층에 속하지 않은 객체와도 협력해야 합니다. Person KillerMusician IronMan Penguin Animal
  89. 89. class Person { } class Killer extends Person { } Person Killer Java - Single Inheritance
  90. 90. Multiple Inheritance Person KillerMusician IronMan Penguin Animal
  91. 91. Animal is-a Person??? Person KillerMusician IronMan Penguin Animal
  92. 92. Interface
  93. 93. interface Tellable { String introduce(); } 메소드 구현이 없습니다 모든 메소드가 abstract method
  94. 94. public abstract class Person implements Tellable { ... } Person implements Tellable
  95. 95. public class Kid extends Person { public String introduce() { return "이름 : " + name + ", 나이 " + age + "세"; } } 인터페이스에서 받은 메소드는 public으로
  96. 96. public abstract class Animal implements Tellable { ... } Animal implements Tellable
  97. 97. public class IronMan { Tellable tellable; IronMan(Tellable tellable) { this.tellable = tellable; } String introduce() { return tellable.introduce(); } } IronMan – Tellable Interface
  98. 98. Person KillerMusician IronMan Penguin Animal <<interface>> Tellable
  99. 99. More Flexible 클래스 계층 구조에 독립적
  100. 100. http://www.slideshare.net/baejja e93/dependency-injection- 36867592 Coupling & Dependency

×