[디자인패턴] 동적바인딩과 추상화

이나겸's avatar
Nov 12, 2024
[디자인패턴] 동적바인딩과 추상화

추상화

  • 역할을 가지지않음
  • 추상 클래스(abstract)는 new 불가 ⇒ 추상적인건 존재하지않기때문
  • 공통적인 것을 하나로 모아둔 추상클래스(부모클래스)가 자식클래스들에 상속(extends)
  • 클래스들의 공통적인 부분들을 찾아서 재사용 가능한 클래스 설계

상속 (extends 부모클래스)

  • is 관계 : ‘~ 이다’

다형성

  • 한 객체가 역할을 여러개 가짐
  • 하나의 공통되는 메소드가 상속 받은곳에서 모두 다른 동작을 함 ⇒ 여러가지 기능을 만들 수 있음 (ex. 탈 것(추상)에는 자동차(바퀴4), 오토바이(바퀴2), 비행기(날개)가 있고 셋 다 움직이는 방법이 다름) (ex. 동물(추상)에는 강아지(멍멍), 고양이(야옹), 오리(꽥꽥)가 있고 셋 다 울음소리가 다름)
  • 오버라이딩과 오버로딩으로 구현
    • 오버라이드 : 자식클래스에서 메소드 재정의하고 부모클래스의 동일 메소드 무효화 (동적바인딩)
    • 오버로드 : 같은 이름의 메소드 여러개 정의

오버라이드 (재정의→무효화), 동적바인딩

  • 자식이 부모와의 동일 메소드를 재정의하면 부모의 메소드는 무효화 ⇒ 동적바인딩
  • 자식것을 같은 타입으로 만들고 활성화 시키기위해 부모것을 무효화함(오버라이드의 목적)

ocp (Open Close Principle)

  • 개방폐쇄의 원칙
  • 컴포넌트, 클래스, 함수 등 구성 요소는 확장에 대해서는 개방되어야 하지만 변경에 대해서는 폐쇄되어야함
  • 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 하는 설계가 되어야함
 
<ocp 위배>
// ocp 위배 // 이 경우, 길동도 코스도 둘 다 심문 가능하게 하려면 기존 코드를 수정해야됨 // 위배되지않게 하려면 추상클래스와 상속 필요 class 길동 { void start() { System.out.println("심문을 시작하시오"); } } class 코스 { void start() { System.out.println("심문을 시작하시오"); } } class 영희 { void start() { System.out.println("죄인은 응답하시오"); } } class Game { void init(길동 gi, 영희 yo) { gi.start(); yo.start(); } } public class StarApp1 { public static void main(String[] args) { // 1. 의존적인 것들 생성하기 길동 gi = new 길동(); 영희 yo = new 영희(); 코스 cos = new 코스(); // 2. 게임 실행 Game game = new Game(); game.init(gi, yo); } }
 
<추상화, 다형성, 오버라이드>
// 추상클래스(abstract) abstract class 재판관 { abstract void start(); } // 재판관 class 상속(extends) // is 관계 (~이다.) : '길동2는 재판관이다.' // => 다형성(한 객체가 역할 여러개(길동2, 재판관)) class 길동2 extends 재판관 { // 오버라이드 (재정의) // 자식이 부모와의 동일 메소드를 오버라이드하면 부모의 메소드는 무효화됨 // => 동적바인딩 void start() { System.out.println("심문을 시작하시오"); } } // 재판관 class 상속(extends) // is 관계 (~이다.) : '코스2는 재판관이다.' // => 다형성(한 객체가 역할 여러개) class 코스2 extends 재판관 { // 오버라이드 (재정의) // 자식이 부모와의 동일 메소드를 오버라이드하면 부모의 메소드는 무효화됨 // => 동적바인딩 void start() { System.out.println("심문을 시작하시오"); } } class 영희2 { void start() { System.out.println("죄인은 응답하시오"); } } class Game2 { void init(재판관 gi, 영희2 yo) { gi.start(); yo.start(); } } public class StarApp2 { public static void main(String[] args) { // 1. 의존적인 것들 생성하기 길동2 gi = new 길동2(); 영희2 yo = new 영희2(); // 영희2 (start) 코스2 cos = new 코스2(); // 코스2 (start => 재정의) + 재판관 (start => 무효화) // 2. 게임 실행 Game2 game2 = new Game2(); game2.init(cos, yo); } }
 
<is 관계, has 관계>
class 버튼 { // 기능 } // 버튼 class 상속(extends) // is 관계 (~이다.) : '엘레베이티드버튼은 버튼이다.' // => 다형성(한 객체가 역할 여러개 (버튼, 엘레베이티드버튼)) class 엘레베이티드버튼 extends 버튼{ } class 엔진 { int power = 5000; } // has 관계 (~을 가진다.) : '자동차는 엔진을 가진다.' class 자동차 { 엔진 e; public 자동차(엔진 e){ this.e = e; } } public class DataTest { }
Share article

Nakyeom's Study