인프런 커뮤니티 질문&답변

김민정님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

좋은 객체 지향 설계의 5가지 원칙(SOLID)

다형성, OCP, DIP의 차이점

작성

·

202

·

수정됨

0


[질문 내용]

다형성 : 하나의 타입으로 여러개의 객체를 다룰 수 있는 것

OCP : 변경에는 닫혀있고, 확장엔 열려있는것 따라서 클라이언트 기존의 코드는 변경하지 않고 확장을 통해 기능을 추가하고 변경할 수 있다

DIP : 클라이언트와 구현체는 추상화에 의존해야된다는 것 따라서 클라이언트가 구현 객체에 의존하는 것이 아닌 클라이언트와 구현객체 사이에 인터페이스를 두고 클라이언트와 구현객체가 인터페이스에 의존하여 구현객체를 변경해도 클라이언트에 영향이 없음을 의미한다

전 아무리 생각해도 다형성, OCP, DIP 이 세가지가 결국엔 추상화에 의존해서 클라이언트의 코드 변경없이 기능을 확장시킨다를 의미하고 있고, 다형성, OCP, DIP 이 세가지가 말만다르지 다 똑같아 보이는데 ,,

명확한 차이점이 있을까요? 그리고 예를들어 OCP를 위반해도 DIP는 지켜지는 그런 상황도 있을까요?

답변 2

0

비슷한 생각이 들어서 고민해봤는데 Collection Framework에서 LinkedList를 생각해보면 좋을 것 같습니다. (짧은 식견이라 부족한 답변일 거 같은데 양해 부탁드립니다.)

LinkedList는 Node라는 객체로 이루어진 자료구조인데, OCP의 원칙을 위해서는 Node의 값을 수정할 때 직접 수정하지 못하게 폐쇄하면서도, 연관관계를 맺어주는 설정자를 구성해야 합니다. 따라서
private E item;
private Node next;
private int size;
로 외부에서 Node의 값에 접근하지 못하도록 private 접근 제어자를 사용하고, 각각의 변수에 대해 setter와 getter를 설정해서 외부에서 Node의 내부 값을 변경하거나 출력하도록 하는 거죠. 그러면서도 LinkedList는 List라는 추상적인 인터페이스에 의존하고 있고, 실제 구현 내에서 LinkedList를 사용하는 자리에 ArrayList를 사용해도 상관없습니다.

그런데 여기서 private을 public으로 바꾸면 외부에서 Node의 item, next, size에 접근 가능하므로 OCP 원칙에 어긋납니다. 그러나 LinkedList를 사용하는 구현체 내에서 ArrayList로 바꾼다 한들 add, remove 등의 메서드는 전부 추상적인 List라는 인터페이스에 의존하므로 DIP는 지켜지겠죠.

두 관계가 쉽게 떼어내기가 애매한 부분이 확실히 있는 것 같은데, 어쨌거나 확실히 다른 개념이라는 생각이 들어서 이렇게 답변 남겨드려요.

0

안녕하세요. 김민정님, 공식 서포터즈 David입니다.

다형성을 사용했지만 OCP를 지키지 못하는 케이스는 6분 43초부터 보시면 장표에 언급됩니다.

똑같은 의미라면 다형성을 사용하지만 OCP를 지키지 못하는 경우가 발생하지 않을 것입니다.

OCP를 지키기 위해서 다형성이 사용됩니다.

이외 자세한 내용은 아래 답변을 참고해 주세요:)

https://www.inflearn.com/questions/652219/comment/212582

감사합니다.