로버트 C. 마틴 그는 객체지향 설계에 다섯 가지 기본원칙을 명명했는데 마이클 페더스가 기억술로 소개한 것이다.
프로그래머가 시간이 지나도 유지보수와 확장이 쉬운 시스템을 만들고자할 때 이원칙들을 함께 적용할 수 있다.
어떠한 기본원칙이 있을까?
1. SRP (Single responsibility principle)
단일 책임의 원칙
로버트 C.마틴은 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이여야한다.
한 클래스는 하나의 책임만을 가져야한다는 이야기이다. 책임은 무엇을뜻할까?
클래스가 만들어질때 하나의 목표를 가져야한다는 소리가 아닐까싶다.
하나의 클래스에 여러가지 기능과 여려가지 멤버를 가지게하지말고 클래스가 맡은 책임에대한 메소드와 멤버만을 가지도록 하여 관련된 책임에대한 것만 맡도록 하는 이야기이다.
2. ocp (Open closed Principle)
개방 폐쇄의 원칙
"소프트웨어 엔티티는 확장에 대해서는 열려있어야하지만 변경에 대해서는 닫혀있어야한다."
클래스는 확장에대해서 열려있어야하며 다른 클래스의 변경으로 인해서 영향을 받는 일이 없어야한다.
캡슐화를 의미하는것같다.
어떤식으로 열려있어야하고 어떻게 닫혀있어야할까?
클래스가 직접적으로 다른 클래스에 연관되어있지않고 중간 중간 다리를 두어서 즉 인터페이스나 추상클래스로써 간접적으로 연관되게한다는 말이다. 자신의 클래스를 확장시키지만 다른 클래스에게 영향을주지않으며 영향을 받지도 않는 좋은 방법일 것이다.
3.LSP(Liskov Substitution Principle)
리스코프 치환 원칙
"서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다"
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다는 이야기다. 좀 어려운 말인데 오해하지않아야한다 상속이라는 말은 아닌거같고 상속은 약간 확장하는쪽에 가깝고 인터페이스와 클래스 관계와 상위,하위클래스의 상속 관계가 얼마나 논리적으로 설계되었느냐가 중요한 요점같다.
우리가 사용하는 인터페이스나 접했던 인터페이스를보면 able으로 끝나는 단어가 많았을것이다.
즉 클래스는 able = 할수있는 이라는 뜻이다.
인터페이스를 구현한 클래스는 인터페이스가 가지고있는 기능을 할 수 있다라는 말인 것이다.
그럼 서브타입이 자신의 기반 타입으로 교체한다라는 말은 무엇일까?
하위 클래스가 상위클래스 역할을 대신할때 논리적으로 오류가 없어야한다는 뜻이다.
부모 형식을 가지고 아들이 태어난다라는 말과
아들 형식을 가지고 부모가 태어난다라는 말중에 어느것이 더논리적인가
당연히 첫번째일것이다 관계 자체에서 논리적이어야 한다.
객치 지향론은 실세계를 보면서 논리적으로 이해한 것을 프로그래밍하는데 적용 시키기위해 나온 방법이기때문에 논리적이어야 합니다.
4. ISP(Interface segregation principle)
인터페이스 분리원칙
"클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다."
특정 클라이언트를 위한 여러개의 인터페이스가 범용되는 하나의 인터페이스보다 좋다라는 말입니다.
ISP와 SRP는 같은 상황에따른 다른 해결책을 보여주는데 하나의 클래스가 많은 책임을 가지고있다면 SRP(단일 책임)은 그 클래스를 분할시켜 책임을 덜어주지만 ISP는 클래스가 많은 책임을 가지고있되 다양한 인터페이스를 상속받아 특정한 책임을 맡아서 해야할때 특정한 기능만을 위해 만들어진 인터페이스를 참조형식으로 받아 그 인터페이스의 기능만을 사용하도록 하는 이야기다. 각 상황에 맞는 기능만 제공하는 인터페이스를 사용한다고 생각하면된다.
5.DIP(Dependency Inversion Principle)
의존 역전 원칙
"고차원 모듈은 저차원 모듈에 의존하면 안되며 이 두 모듈 모두 다른 추상화 된것에 의존해야한다 프러그래머는 추상화에 의존해야하며 구체화에 의존하게되면 안된다 자주변경되는 클래스에 의존하지 마라"
상위클래스와 추상클래스는 하위클래스와 구현클래스에 의존적이면 안된다.
상위클래스와 추상클래스는 하위클래스와 구현클래스에게 지정된 사용방식을 제공해주어야하지 자신들이 변화를 당하게 되면 안된다는 이야기다. 상위가 변하게되면 그 상위를 이용하는 모든것을에대한 책임을 지게되기때문이다. 하위가 변한다고 상위가 영향을 받는다는것은 논리적이지 않다. 여러개의 인터페이스로 분리하거나 상위클래스가 다양한 하위클래스를 두는것은 하위클래스에 의존하지않기위해 분리시키는 방식중 하나인것 같다. 의존성을 반대로 하위가 의존하도록 만들고 상위클래스는 변화에 둔감하거나 변화가 없어야한다.
'JAVA > [JAVA] 바구니' 카테고리의 다른 글
[JAVA] Anonymous Class (0) | 2020.04.08 |
---|---|
[JAVA] 유효범위 (0) | 2020.04.02 |
[JAVA] Java Thread (0) | 2020.03.12 |
JAVA GUI (0) | 2020.03.11 |
[JAVA] 기본 타입과 참조타입 (0) | 2020.03.10 |
댓글