동적바인딩과 추상화

화낼거양's avatar
Nov 12, 2024
동적바인딩과 추상화
 
 
OCP : Open-Closed 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) { 길동 gi = new 길동(); 영희 yo = new 영희(); 코스 cos = new 코스(); Game game = new Game(); game.init(gi, yo); } }
init 메소드에 길동과 영희만 들어갈 수 있으며, 코스를 넣게되면 오류 발생.
코스를 넣을 수 있도록 수정하려면 기존에 작성한 코드를 수정하여야만 합니다.
 

수정 예제

 
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(); } } abstract class 재판관 { abstract void start(); } public class StarApp2 { public static void main(String[] args) { 영희2 yo = new 영희2(); // 영희2 (start) 재판관 cos = new 코스2(); // 코스2 (start - 재정의) + 재판관 (start - 무효화) Game2 game2= new Game2(); game2.init(cos, yo); } }
 
‘재판관’ 이라는 추상 클래스를 작성.
init 메소드 매개변수 타입을 길동 > 재판관 으로 변경.
따라서 재판관을 상속하고 있는 클래스들은 init 메소드의 매개변수로 활용할 수 있게 되어 기존의 작성한 코드를 수정하지 않아도 됩니다.
 
 
  • 이처럼 추상 클래스나 인터페이스등을 이용하여 코드의 재사용성과 유지보수를 쉽게 만드는 과정을 추상화라고 합니다.
  • 위 예제에서 추상 클래스의 start 메소드 대신, 자식 클래스의 start 메소드를 실행하게 되는데
    • 이것을 동적 바인딩이라고 합니다.
 
Share article

moohyun