이번 챕터에서 배운 리스코프 치환 원칙
의 내용을 한번 더 정리해보겠다.
이 원칙의 정의는
"부모 클래스의 인스턴스를 사용하는 위치에 자식 클래스의 인스턴스를 대신 사용했을 때 코드가 원래 의도대로 작동해야 한다"
이다.
이 정의에 있는 내용대로 자식 클래스의 인스턴스가 부모 클래스의 인스턴스 대신 사용되어도 문제가 없으려면 2가지 조건을 만족해야 한다.
1. 형식적인 측면에서 자식 클래스가 오버라이딩
하는 변수와 메서드가 부모 클래스에 있는 형식과 일치해야 한다.
변수의 경우에는 그 타입, 메서드의 경우에는 파라미터와 리턴값의 타입 및 개수가 그 형식이다.
이런 형식적인 측면을 지키지 않으면 프로그램 실행 시에 에러가 발생하게 된다.
2. 내용적인 측면에서 자식 클래스가 부모 클래스의 메서드에 담긴 의도, 그러니까 부모 클래스의 행동규약을 위반하지 않는 것이다.
처럼 이 경우에는 프로그램을 실행해도 에러가 나지는 않는다. 하지만 예상했던 결과와는 전혀 다른 결과를 프로그램이 내놓게 된다.
에러는 안 나는데 프로그램의 동작이 우리의 예상을 벗어난다는 것은 좀 무서운 일이다. 예시로 봤던 코드들은 모두 내용이 짧아서 이런 문제를 쉽게 발견했을 수도 있다.
하지만 만약 코드의 양이 많고 여러 객체 간의 관계가 복잡한 프로그램에서 이런 문제가 발생한다면 보이지 않는 치명적인 모순이 프로그램에 오랫동안 숨어있을 수 있다.
이런 일 이 발생하지 않도록 하려면 자식 클래스를 설계할 때 부모 클래스의 행동 규약을 벗어나지 않도록 유의해야 한다.
형식적인 측면 → 파라미터, 변수, 리턴 등은 같은 형식이고 개수여야 한다.
내용적인 측면 → 상속
받아 사용하는 메서드가 의미하는 것이 무엇인지 제대로 알고 사용해야 한다. 만약에 사용하는 방식대로 했는데, 클래스와 맞지 않은 느낌이면 그건 상속
을 하면 안된다.
상속
받아 가로 결정하는 메서드, 세로 결정하는 메서드, 넓이 구하는 메서드 사용 중, 가로와 세로를 다르게 설정가능 그러면 정사각형이 아님... 뭔가 이상함 그러면 상속
받으면 안됨