-
OOP 4대 원칙과 SOLID 5대 원칙다시한번 개발자도전! 2026. 1. 13. 17:25
1. OOP 4대 원칙 (Object-Oriented Programming Pillars)
객체지향 프로그래밍이라면 **"반드시 갖춰야 할 네 가지 성질"**
① 캡슐화 (Encapsulation)
- 의미: 데이터(변수)와 기능을 하나로 묶고, 외부에서 직접 접근하지 못하게 감추는 것임.
- 목적: 데이터 보호 및 결합도 낮춤.
② 상속 (Inheritance)
- 의미: 부모 클래스의 특성을 자식 클래스가 물려받는 것임.
- 목적: 코드의 재사용 및 계층 구조 형성.
③ 다형성 (Polymorphism)
- 의미: 하나의 이름(메서드)이 상황에 따라 다르게 동작하는 성질임.
- 목적: 코드의 유연함과 확장성 확보.
④ 추상화 (Abstraction)
- 의미: 구체적인 구현보다는 핵심적인 개념(인터페이스)에 집중하는 것임.
- 목적: 구조 단순화 및 의존성 감소.
2. SOLID 5대 원칙 (Design Principles)
이건 OOP의 성질을 이용해서 **"어떻게 하면 유지보수가 쉬운 좋은 코드를 짤 것인가?"**에 대한 구체적인 가이드라인임. (설계 지침)
① SRP (Single Responsibility Principle) - 단일 책임 원칙
- 핵심: "하나의 클래스는 하나의 책임만 가져야 함."
- 상세: 플레이어 클래스에 이동, 소리, 점수 계산을 다 넣지 말라는 것임. 이동은 Mover, 소리는 AudioPlayer로 쪼개야 함. 그래야 수정할 때 다른 기능이 안 터짐.
- ex) player 클래스 안에 이동로직, 사운드 재생 등 모든 걸 때려 넣으면 안 됨! 각 기능 분리
② OCP (Open-Closed Principle) - 개방-폐쇄 원칙
- 핵심: "확장에는 열려 있고, 수정에는 닫혀 있어야 함."
- 상세: 새로운 기능을 추가할 때 기존의 코드를 건드리지 않고도 가능하게 설계해야 함. 주로 상속이나 인터페이스를 통해 구현함.
- ex) 몬스터가 새로 추가될때 마다 플레이어 공격 함수에 코드를 수정하면 안 됨! 추상화나 인터페이스 활용
③ LSP (Liskov Substitution Principle) - 리스코프 치환 원칙
- 핵심: "자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 함."
- 상세: 부모 클래스를 쓰는 곳에 자식 클래스를 넣어도 프로그램이 문제없이 돌아가야 함. 자식이 부모의 기능을 억지로 막거나 왜곡하면 안 됨.
- ex) '새' 클래스를 상속받은 '타조' 클래스. 부모의 Fly() 메서드를 호출했는데 타조는 못 날아서 에러를 뿜음.
- 부모 클래스에는 공통된 확실한 기능만 넣거나, 인터페이스로 분리함.
④ ISP (Interface Segregation Principle) - 인터페이스 분리 원칙
- 핵심: "사용하지 않는 인터페이스에 의존하도록 강제하면 안 됨."
- 상세: 너무 큰 인터페이스 하나보다, 작게 쪼개진 여러 개의 인터페이스가 낫다는 뜻임. (예: IMoveable, IAttackable 등으로 분리)
- ex) IUnit 인터페이스에 Move(), Attack(), Magic()을 다 넣으면 안 됨, 인터페이스 쪼개서 사용하기.
⑤ DIP (Dependency Inversion Principle) - 의존 역전 원칙
- 핵심: "추상화에 의존해야지, 구체화에 의존하면 안 됨."
- 상세: 상위 모듈이 하위 모듈의 구체적인 구현을 직접 알게 하지 말고, 중간에 인터페이스를 둬서 서로 소통하게 만드는 것임.
- ex) Player가 Sword 클래스를 직접 참조시. 무기를 Gun으로 바꾸려면 Player 코드를 다 뜯어고쳐야 함
- 중간에 무기 인터페이스를 두어 관계의 결합도를 낮춤
'다시한번 개발자도전!' 카테고리의 다른 글
Unity | 다형성(Polymorphism) 이란? (0) 2026.01.14 다시한번 개발자도전! 9일차 (상속, 캐스팅,base,오버라이딩) (0) 2026.01.14 절차지향(Procedural)과 객체지향(Object-Oriented, OOP) (0) 2026.01.13 다시한번 개발자도전! 8일차(클래스,생성자,접근제한자,프로퍼티) (0) 2026.01.13 c# 컬렉션(Collection)/List,Dictionary,Stack,Queue (3) 2026.01.12