객체지향과 SOLID원칙

2025. 2. 6. 17:20·이론공부

□ 정의

  • 객체지향(Object-Oriented Programming, OOP)은 프로그램을 객체(object)라는 단위로 구성하는 프로그래밍 패러다임
  • 객체는 데이터와 데이터를 처리하는 메서드를 함께 묶은 단위로, 현실 세계의 사물과 개념을 모델링하여 코드로 표현하는 방식

 

□ 주요 개념

  • 클래스 (Class): 객체의 설계도나 템플릿으로, 객체의 속성(필드)과 동작(메서드)을 정의
  • 객체 (Object): 클래스를 기반으로 생성된 실체로, 속성과 동작을 갖는 구체적인 인스턴스
  • 캡슐화 (Encapsulation): 객체의 데이터(속성)를 외부에서 직접 접근하지 못하게 하고, 메서드를 통해서만 접근하게 제한하는 방식, 이는 데이터를 보호하고, 객체의 내부 구현을 숨겨서 코드의 복잡성을 줄인다.
  • 상속 (Inheritance): 하나의 클래스가 다른 클래스의 속성과 메서드를 물려받아 확장할 수 있는 기능, 이를 통해 코드의 재사용성을 높이고, 계층 구조를 만들 수 있다.
  • 다형성 (Polymorphism): 하나의 메서드나 객체가 여러 형태로 동작할 수 있는 성질, 메서드 오버로딩, 메서드 오버라이딩 등을 통해 구현된다.
  • 추상화 (Abstraction): 복잡한 시스템을 단순화하여 필요한 부분만 표현하는 과정, 구체적인 구현을 숨기고, 사용자에게 필요한 기능만을 제공한다.

 

□ SOLID원칙

  • S - Single Responsibility Principle (SRP, 단일 책임 원칙)
    • 클래스는 하나의 책임만 가져야 한다는 원칙
    • 클래스는 하나의 이유로만 변경되어야 하며, 여러 가지 기능을 수행하는 클래스는 나누어서 책임을 분리해야 한다.
    • 이렇게 하면 클래스의 변경이나 수정이 다른 부분에 미치는 영향을 최소화할 수 있다.
    • ex) UserManager 클래스가 사용자 관리와 이메일 발송 두 가지 일을 한다면, 이를 두 개의 클래스로 분리하는 것이 좋다.
  • O - Open/Closed Principle (OCP, 개방/폐쇄 원칙)
    • 소프트웨어 엔티티(클래스, 모듈 등)는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다는 원칙
    • 기존 코드를 수정하지 않고도 새로운 기능을 추가할 수 있어야한다.
    • ex) 새로운 기능을 추가할 때 기존 클래스를 변경하는 대신, 인터페이스를 통해 확장하거나, 새로운 클래스를 추가하는 방식으로 구현할 수 있다.
  • L - Liskov Substitution Principle (LSP, 리스코프 치환 원칙)
    • 자식 클래스는 부모 클래스의 역할을 대신할 수 있어야 한다는 원칙
    • 자식 클래스는 부모 클래스의 기능을 확장하거나 수정할 수 있지만, 부모 클래스를 대체할 수 있어야 한다.
    • 부모 클래스 타입의 객체를 자식 클래스 타입으로 교체해도 시스템의 동작에 문제가 없어야한다.
    • ex) Bird 클래스에 Flyable이라는 메서드가 있고, 이를 상속받은 Duck과 Penguin이 있을 때, Penguin은 Flyable을 구현할 수 없으므로, Flyable을 Duck에만 적용하는 것이 좋다.
  • I - Interface Segregation Principle (ISP, 인터페이스 분리 원칙)
    • 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 한다는 원칙
    • 하나의 큰 인터페이스보다는 클라이언트가 필요한 여러 개의 작은 인터페이스를 만드는 것이 좋다.
    • ex) Printer 인터페이스가 Print와 Scan 메서드를 가지고 있다면, 프린터만 사용하는 클래스는 Scan을 구현할 필요가 없다. 이를 분리하여 필요한 메서드만 제공하는 작은 인터페이스로 만드는 것이 좋다.
  • D - Dependency Inversion Principle (DIP, 의존성 역전 원칙)
    • 고수준 모듈은 저수준 모듈에 의존하면 안 되고, 둘 다 추상화에 의존해야 한다는 원칙
    • 추상화는 세부사항에 의존하지 않고, 세부사항이 추상화에 의존해야한다.
    • 이는 클래스 간의 결합도를 낮추고, 코드의 유연성을 높이는 데 도움된다.
    • ex) 데이터베이스에 의존하는 클래스가 있다면, 데이터베이스의 세부 구현에 의존하지 않고, DataAccess라는 추상화된 인터페이스를 통해 의존하도록 변경하는 것.

 

'이론공부' 카테고리의 다른 글

CORS(Cross-Origin Resource Sharing)  (0) 2025.02.13
자료구조 - R트리(R-Tree)  (0) 2024.11.16
DB 인덱싱(Database Indexing)  (0) 2024.11.10
기술면접 준비(2)  (1) 2024.09.30
프록시(Proxy)란?  (0) 2024.09.05
'이론공부' 카테고리의 다른 글
  • CORS(Cross-Origin Resource Sharing)
  • 자료구조 - R트리(R-Tree)
  • DB 인덱싱(Database Indexing)
  • 기술면접 준비(2)
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 이론공부
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • DB
      • AWS
      • CI-CD
      • 웹
      • git & github
      • 구인공고분석
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java 세수의합
    java two-pointer
    java enhance switch
    java
    java 제어자
    java arrays.copyofrnage()
    java 멤버
    java super
    java 메서드
    Java 생성자
    Java this
    자료구조
    java 에라토스테네스의 체
    데이터 타입
    java 유클리드 호제법
    프로그래머스 java 기초트레이닝
    데이터 크기
    java기초
    개발로드맵
    프로그래머스 java 기초 트레이닝
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
객체지향과 SOLID원칙
상단으로

티스토리툴바