2025.12.18

박민재 (Daype)·2025년 12월 18일

2025 12 18 요약노트

인터페이스와 추상클래스의 차이

인터페이스는 순수가상함수로만 이루어진 클래스
추상클래스는 순수가상함수가 1개 이상 포함하고있는 클래스
두 클래스의 차이 예시
일반고블린과 변종고블린이있다고 가정 변종고블린은 고블린의 상속체 이때 구현할때 멤버변수가 필요하니 추상클래스를 이용하는것이 적절
NPC가있다고 가정 NPC는 플레이어와 상호작용만 하는 존재 즉, 멤버변수가 필요없음 이럴경우 인터페이스 사용하는것이 적절.

SRP 단일 책임 원칙

하나의 클래스는 하나의 책임만 가져야한다
ex) 학생들의 성적을 받는 클래스 A, 학생들의 성적을 계산하는 클래스 B, 학생들의 성적을 출력해주는 클래스 C

OCP 개방 폐쇄 원칙

어떠한 클래스가 A 가수정되면 B라는 클래스에는 영향을 미치면 안된다.
어떠한 기능이 추가되면 그 추가되는 기능만 구현하면 되는식 기능이 추가될 때,
다른 클래스에 영향을 미치면 안됨

인터페이스를 인자로 받으면 해결

LSP 리스 코프 치환 원칙

자식 클래스는 부모클래스에서 기대되는 행동을 보장해야한다
ex) 직사각형과 정사각형이있다고 가정

틀린정리
정사각형을 상속받는 직사각형 이 있다고 가정해보자
정사각형의 가로 세로 길이는 동일하기 때문에 한가지의 길이만 있으면 구현할 수있다.
그러나, 직사각형은 가로와 세로의 길이가 둘 다 필요하기때문에 자식에서 세로의 길이를 만들어 줘야한다 |이 동작이 자식클래스가 부모클래스에서 기대되는 행동을 벗어난 행위이다 [리스코프 치환 원칙의 잘못된 예시] | = 잘못 상속했다 라고 정의 가능


  1. LSP (리스코프 치환 원칙) - 예시 보완
    작성하신 내용: 직사각형과 정사각형 예시를 잘 드셨습니다.
    보완점: 보통 "부모인 직사각형을 상속받는 자식 정사각형"의 예시가 더 많이 쓰입니다.
    부모(직사각형)는 "가로와 세로를 따로 바꿀 수 있다"고 기대되는데, 자식(정사각형)은 "가로를 바꾸면 세로도 같이 바뀌어버리는" 동작을 합니다.
    이때 부모의 행동(가로만 바꾸기)을 자식이 보장하지 못하므로 LSP 위반입니다.
    결론: "자식 객체는 언제나 부모 객체 자리를 대신해도 프로그램이 망가지지 않아야 한다"는 설명이 들어가면 더 좋습니다.

ISP 인터페이스 분리 원칙

메서드와 함수의 차이
소속이 독립적이다 : 함수
소속이 되어있다 : 메서드 (클래스 안 또는 객체)

클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.

각 클래스는 불필요한 메서드를 구현하지말고 자신의 역할이 아닌 메서드는 인터페이스에 의존해야 한다.
프린트랑 스캔이 같이 구현된 머신 클래스
머신에 관련이 없는 스캔과 프린트는 인터페이스로 프린트를 구현해서 사용해야한다.

프린터와 스캐너라는 인터페이스를 만들어서 머신에 상속시킨다.

DIP 의존 역전 원칙

고수준 모듈은 저수준 모듈에 의존하지않고 둘다 추상화해서 의존해야한다.

키보드와 모니터 클래스를 받는 컴퓨터가 있다고 생각해보자
컴퓨터 클래스 안에서 [클래스(키보드) 변수] 와 [클래스(모니터) 변수] 를 직접 받게되면
다른 키보드나 다른 모니터를 사용하려면 클래스 자체를 변경해주어야 한다.
이러한 상황이 일어나서는 안된다.

따라서, 입력기기, 출력기기 로 나누어서 입력기기에선 키보드 A B C D 를 모두 사용이 가능하고
모니터도 마찬가지로 A B C D 모두 사용하게 구현이 되어있어야 의존 역전 원칙을 지키는 것이다.

결과적으로 고수준모듈이란 실제동작을 수행하는 클래스를 얘기하고 ex) Computer
저수준 모듈이란 고수준모듈이 동작에 필요한 클래스 ex) keyboard, moniter
정리하자면, 컴퓨터가 키보드와 모니터에 의존을 하게되면 해당 기기들이 바뀔때 컴퓨터도 바뀌어야한다
하지만 의존을 하지 않게되면 입력기기와 출력기기로 나누어 전달하는 기계만 바꿔주면 컴퓨터에 내부동작은
수정이 불필요해진다 이것을 의존 역전 원칙 이라고한다.

0개의 댓글