TIL(2020.07.30)

Awesome·2020년 7월 30일
0

TIL

목록 보기
20/46
post-custom-banner

객체 지향 프로그래밍 원칙

SOLID

견고하고 짜임새있는 객체지향 프로그래밍을 위해서 지켜야할 원칙이 있다.

1) 단일 책임 원칙 (Single Responsibility Principle)
2) 개방 폐쇄 원칙 (Open-Closed Principle)
3) 리스코프 치환 원칙 (Liskov Substitution Principle)
4) 인터페이스 분리 원칙 (Interface Segregation Principle)
5) 의존 관계 역전 원칙 (Dependency Inversion Principle)


1) 단일 책임 원칙 (Single Responsibility Principle)

모든 클래스는 한 가지 책임만 갖고, 클래스 안에 정의되어 있는 기능은 하나의 책임을 수행하는데 집중되야 한다.

이는 하나의 클래스로 너무 많은 일을 하지 말고(God Objects), 딱 한 가지 책임만 수행하라는 뜻이다.

2) 개방 폐쇄 원칙 (Open-Closed Principle)

클래스는 확장에 열려있어야 하며, 수정에는 닫혀있어야 한다.

개방 폐쇄 원칙은 추상 클래스를 사용하므로서 지킬 수 있다. 추상 클래스를 통해 코드의 수정 없이(폐쇄), 클래스의 확장(개방)이 가능하기 때문이다.

3) 리스코프 치환 원칙 (Liskov Substitution Principle)

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

리스코프 치환 원칙을 지키기 위해서는 다음 두 가지 조건을 만족해야 한다.

  • 형식적인 측면에서 자식 클래스가 오버라이딩하는 변수와 메소드가 부모 클래스에 있는 형식과 일치해야 한다. 변수의 경우에는 그 타입, 메소드의 경우에는 파라미터와 리턴값의 타입 및 개수가 그 형식이다.
  • 내용적인 측면에서 자식 클래스가 부모 클래스의 메소드에 담긴 의도, 그러니까 부모 클래스의 행동 규약을 위반하지 않는 것이다. 이는 부모-자식 클래스 간의 기능적인 충돌이 발생하는 경우 클래스를 분리해야 함을 뜻한다.

4) 인터페이스 분리 원칙 (Interface Segregation Principle)

인터페이스란 파이썬에서는 일반 메서드가 없이 순수 추상 메서드만으로 구성된 추상 클래스로 볼 수 있다.
지나치게 많은 추상 메서드를 가진 거대한 인터페이스 하나를, 관련된 추상 메서드들만 모여있도록 작은 크기의 인터페이스로 분리하라는 뜻이다.

인터페이스가 서로 관련성이 높은, 적절한 개수의 추상 메소드들을 포함하게 될 때 그걸 역할 인터페이스(role interface)라고 한다. 인터페이스 하나가 있는 것보다는 작은 역할 인터페이스 여러 개가 있으면 각 클래스가 본인에 해당하는 인터페이스만 적절히 상속받게 된다. 그럼 각 클래스가 어떤 기능을 갖는지 더 세밀하게 파악할 수 있게 해준다는 장점도 있다.

5) 의존 관계 역전 원칙 (Dependency Inversion Principle)

상위 모듈은 하위 모듈의 구현 내용에 의존하면 안 된다. 상위 모듈과 하위 모듈 모두 추상화된 내용에 의존해야 한다

여기서 상위 모듈이란 다른 클래스를 사용하는 주된 클래스, 하위 모듈은 사용되는 클래스를 나타낸다. 상위 모듈은 보통 프로그램의 메인 흐름에 좀더 가깝고 하위 모듈은 상대적으로 좀더 멀리 있다.

의존 관계 역전 원칙은 상위 모듈이 하위 모듈을 사용할 때 직접 인스턴스를 가져다가 쓰지 말라는 뜻입니다. 왜냐하면 인스턴스를 바로 가져다가 쓴다는 말은 하위 모듈의 구체적인 내용에 상위 모듈이 의존하게 되어 하위 모듈에 변화가 있을 때마다 상위 모듈의 코드를 자주 바꿔줘야 하기 때문입니다. 이에 대한 해결책은 추상 클래스로 상위 모듈과 하위 모듈 사이에 추상화 레이어를 만드는 것입니다. 이렇게 되면

상위 모듈에는 추상 클래스의 자식 클래스의 인스턴스를 사용한다는 가정 하에 그 하위 모듈을 사용하는 코드를 작성해두면 되고, 하위 모듈은 추상 클래스의 추상 메소드들을 구현(오버라이딩)만 하면 된다. 그럼 상위 모듈은 새로운 하위 모듈이 생겨도 기존 코드를 수정하지 않고 새 하위 모듈을 자유롭게 가져다 쓸 수 있게 되고, 그만큼 코드를 유지보수하기 편해진다.

profile
keep calm and carry on
post-custom-banner

0개의 댓글