본 게시글은 면접준비 및 자기계발을 목적으로 작성된 게시글입니다
공부한 내용을 토대로 남들에게 설명할 수 있도록 이해하는 과정에 작성한 게시글이니 참고바랍니다
모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과
단일 책임 원칙은 "하나의 클래스는 하나의 책임만 갖는다"라는 원칙이다
게임에서 플레이어의 오디오, 인풋, 움직임 등의 기능을 별도의 클래스로 나눠서 만들고
이것들을 각각 별도의 컴포넌트로 오브젝트에 부착한다
⭐ 단일 책임 원칙의 장점
한 클래스를 한 관심사에 집중하도록 유지하는 것이 중요한 이유는, 이것이 클래스를 더욱 튼튼하게 만들기 때문이다
'소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다'는 프로그래밍 원칙이다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과
클래스가
Calculator 클래스에 새로운 도형에 대한 함수를 만들게되면 클래스 자체를 수정해야함
Shape이라는 클래스를 선언하여 Rectangle과 Circle같은 도형들이 상속받도록 함
public class Calculator
{
public float GetArea(Shape shape)
{
return shape.CalculateArea();
}
}
다음과 같은 코드에서 Shape을 파라미터로 받아 해당 도형의 CalculateArea를 실행
위와 같은 방법으로 할 시 도형이 더 추가되더라도 기존 코드를 변경하지 않고 shape을 상속시키면 됨
추상화를 통한 개방-폐쇄 원칙
: 객체 지향 프로그래밍 언어에서는 고정되기는 해도 제한되지는 않은, 가능한 동작의 묶음을 표현하는 추상화가 가능하다. 모듈은 추상화를 조작할 수 있다. 이런 모듈은 고정된 추상화에 의존하기 때문에 수정에 대해 닫혀 있을 수 있고, 반대로 추상화의 새 파생 클래스를 만드는 것을 통해 확장도 가능하다. 따라서 추상화는 개방-폐쇄 원칙의 핵심 요소이다
(출처: https://ko.wikipedia.org/wiki/개방-폐쇄_원칙)
'소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다'는 프로그래밍 원칙이다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과
파생 클래스가 기본 클래스를 대체할 수 있어야 한다. 상속을 할 때 지켜야하는 원칙을 말함
하위 클래스는 어떠한 경우에도 부모 클래스를 대체할 수 있어야 한다
ex) 자동차를 상속받아서 다양한 자동차를 만드는건 괜찮은데 자동차를 상속받아놓고 비행기를 만들면 안됨
해당 원칙을 잘 지키기 위해서는 추상 클래스를
하는 것이 좋다
클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과
인터페이스를 사용할 때 한번에 크게 사용하지말고 작은 단위로 나눠서 사용해라
인터페이스를 분리해서 쓸수록 코드 간의 결합도가 낮아지고 수정이 용이해진다
🤔인터페이스(interface)란?
인터페이스(interface)는 객체가 수행할 수 있는 작업에 대한 설명이다. 예를 들어 전등 스위치를 켜면 조명이 켜지고 어떻게 작동하든 상관이 없다. 객체 지향 프로그래밍에서 인터페이스는 객체가 "X"가 되기 위해 가져야 하는 모든 기능에 대한 설명이다.
(출처: https://users.cs.utah.edu/~germain/PPS/Topics/interfaces.html)
interface 인터페이스 이름 { 반환형 메소드이름1(매개변수 목록); 반환형 메소드이름2(매개변수 목록); ... }<인터페이스 특징>
- 인터페이스는 메소드, 이벤트, 인덱서, 프로퍼티만 가질 수 있다
- 접근 제한 한정자를 사용할 수 없고, 모든 것이 public으로 선언된다
- 인터페이스는 자신을 상속받는 클래스에게 오버라이딩을 강제한다
- 자식 클래스에서 구현할 메소드들은 public 한정자로 수식해야 한다
- 구현부가 없다
- 인스턴스를 만들 수 없지만, 인터페이스를 상속받는 클래스의 인스턴스를 만드는 것은 가능하다
- 클래스는 인터페이스를 여러 개 상속 받는 것이 가능하다
(출처: https://daekyoulibrary.tistory.com/entry/C-객체지향의-꽃-인터페이스Interface-1편)
소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다.
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ㅤ- 위키 백과
고수준 모듈이 저수준 모듈에서 직접 가져오면 안된다
특정 클래스에 직접적으로 의존하는게 아니라 인터페이스를 거쳐서 사용하기 때문에 느슨한 결합이 이루어짐