회원가입

5. [리스코프치환원칙] 리스코프 치환 원칙 정리 노트

NULL 2021-10-18

이번 챕터에서 배운 리스코프 치환 원칙의 내용을 한번 더 정리해보겠다.

 

이 원칙의 정의는

"부모 클래스의 인스턴스를 사용하는 위치에 자식 클래스의 인스턴스를 대신 사용했을 때 코드가 원래 의도대로 작동해야 한다"

이다.

 

이 정의에 있는 내용대로 자식 클래스인스턴스부모 클래스인스턴스 대신 사용되어도 문제가 없으려면 2가지 조건을 만족해야 한다.

 

1. 형식적인 측면에서 자식 클래스오버라이딩하는 변수메서드부모 클래스에 있는 형식과 일치해야 한다.

변수의 경우에는 그 타입, 메서드의 경우에는 파라미터리턴값타입 및 개수가 그 형식이다.

이런 형식적인 측면을 지키지 않으면 프로그램 실행 시에 에러가 발생하게 된다.

 

2. 내용적인 측면에서 자식 클래스부모 클래스메서드에 담긴 의도, 그러니까 부모 클래스의 행동규약을 위반하지 않는 것이다. 

  • 정사각형 - 직사각형 예시
  • 음악 플레이어 예시

처럼 이 경우에는 프로그램을 실행해도 에러가 나지는 않는다. 하지만 예상했던 결과와는 전혀 다른 결과를 프로그램이 내놓게 된다.

 

에러는 안 나는데 프로그램의 동작이 우리의 예상을 벗어난다는 것은 좀 무서운 일이다. 예시로 봤던 코드들은 모두 내용이 짧아서 이런 문제를 쉽게 발견했을 수도 있다.

하지만 만약 코드의 양이 많고 여러 객체 간의 관계가 복잡한 프로그램에서 이런 문제가 발생한다면 보이지 않는 치명적인 모순이 프로그램에 오랫동안 숨어있을 수 있다.

이런 일 이 발생하지 않도록 하려면 자식 클래스를 설계할 때 부모 클래스의 행동 규약을 벗어나지 않도록 유의해야 한다.

 

나만의 정리


형식적인 측면 → 파라미터, 변수, 리턴 등은 같은 형식이고 개수여야 한다.

내용적인 측면 → 상속 받아 사용하는 메서드가 의미하는 것이 무엇인지 제대로 알고 사용해야 한다. 만약에 사용하는 방식대로 했는데, 클래스와 맞지 않은 느낌이면 그건 상속을 하면 안된다.

  • 직사각형 가로 결정하는 메서드, 세로 결정하는 메서드, 넓이 구하는 메서드
  • 정사각형이 직사각형을 상속 받아 가로 결정하는 메서드, 세로 결정하는 메서드, 넓이 구하는 메서드 사용 중, 가로와 세로를 다르게 설정가능 그러면 정사각형이 아님... 뭔가 이상함 그러면 상속 받으면 안됨
0 0