상속과 다형성

Lee DoYeon·2024년 10월 18일
post-thumbnail

우테코 7기 프리코스 1주차를 진행하면서 헷갈렸던 내용을 정리해본다.

상황은 이렇다.
CalculatorStrategy라는 인터페이스가 있고, 이를 상속받는 CustomSeparatorStrategy, OriginalSeparatorStrategy 두 클래스가 존재한다. 기존에는 CalculatorStrategy 인터페이스 내부에 메서드를 따로 정의하지 않고, 다형성을 활용해 코드를 작성하고자 인터페이스만 선언했다.

문제의 상황은 아래와 같다.

CalculatorStrategy calculatorStrategy; // 인터페이스
calculatorStrategy = new CustomSeparatorStrategy(); //CalculatorStrategy를 상속받는 구체 클래스
calculatorStrategy.calculateCustomSeparator();

처음에 CalculatorStrategy 인터페이스 내부에 메서드를 정의하지 않았다. 그렇다, calculateCustomSeparator 메서드는 CustomSeparatorStrategy 클래스 내부에 새롭게 정의한 메서드이다.

이렇게 설계한 이유는 인터페이스 타입의 참조 변수를 통해, if 조건문으로 특정 상황에서 CustomSeparatorStrategy의 메서드를 호출하려고 했기 때문이다. 그러나 "인터페이스를 구현한 구체 클래스의 인스턴스를 참조하더라도, 인터페이스에 정의된 메서드만 호출할 수 있다"는 사실을 간과했다.

이를 개선하기 위해 CalculatorStrategy 인터페이스 내부에 calculate 메서드를 선언하고, 이를 상속받는 클래스에서 오버라이딩해 메서드를 재정의했다.

CalculatorStrategy calculatorStrategy;
calculatorStrategy = new CustomSeparatorStrategy();
calculatorStrategy.calculate();

결론으로 보자면 인터페이스를 상속받은 후 다형성을 이용해 CustomSeparatorStrategy 내부 calculate, OriginalSeparatorStrategy 내부 calculate를 자유롭게 사용할 수 있었다.

profile
I can do this all day

0개의 댓글