객체지향 설계 원칙(SOLID)

김민성·2023년 6월 21일

JAVA

목록 보기
4/11

객체란?

: 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것

  • 객체는 속성(필드)과 동작(메소드)으로 구분됨
  • 객체는 서로 다른 객체와 메소드를 통해 상호작용
  • 메소드 호출을 통해 객체들을 서로 데이터를 주고 받음

객체 간 관계

  • 집합 관계 : 완성품과 부품의 관계
  • 사용 관계 : 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계
  • 상속 관계 : 부모 자식 관계

객체 지향 프로그래밍 특징

캡슐화

: 필드, 메소드를 하나로 묶고 실제 구현 내용을 외부에 감추는 것

  • 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 사용할 수 있음
  • 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되는 것을 방지하기 위함
  • 자바에서는 접근 제어자를 통해 숨김 여부 결정

상속

: 부모 객체는 자기가 가지고 있는 필드와 메소드를 자식 객체에게 물려주어 자식 객체가 사용할 수 있도록 함

  • 부모 객체의 필드와 메소드를 자식이 그대로 사용할 수 있기 때문에 중복 코딩을 하지 않아도 되어 코드의 재사용성이 높아짐
  • 부모 객체에서 필드와 메소드를 수정하면 모든 자식 객체들은 수정된 필드와 메소드를 사용할 수 있기 때문에 유지 보수 시간을 최소화시킴

다형성

: 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질

  • 다형성을 구현하기 위해서는 자동 타입 변환(Casting)과 재정의 기술 필요
    -> 상속과 인터페이스를 통해 구현 가능

SOLID를 모두 무조건 지키는 건 어려움
SOLID 원칙을 따르면 객체 지향적으로 코드를 짜기 용이

객체지향의 목적
: 유지보수하기 쉬운 코드
-> 기존 코드를 최대한 유지하는 방향

interface : 사용설명서
class : interface에 맞게 제품 라인을 구축 해놓은 것
객체 : 제품라인에서 찍어져 나온 제품
-> new로 선언 후 생성자가 찍힘과 동시에 객체가 됨

단일 책임 원칙

: 하나의 객체는 하나의 책임만을 갖는다.

  • 책임 : 코드를 수정해야 하는 이유
  • 클래스가 덩치가 커지면 단일 책임 원칙을 지키지 않을 가능성 커짐
    -> 최대한 작은 클래스로 쪼갬

개방 폐쇄 원칙

: 코드 상에서 기능 확장이 필요할 때, 확장에는 개방적이어야 하고, 변경에는 폐쇄적이어야 한다.

  • 기능 확장 : 상속 / 생성자

상속의 장점
1. 기존 코드 재사용 => 강한의존성 생기는 단점도 있음
2. 타입 계층
-> 상속할수록 클래스(타입)는 구체적이게 됨 / 부모 클래스는 가장 추상적임

리스코프 치환 원칙

: 부모 타입 변수에 해당 부모 자식 인스턴스가 뭐가 오든 간에 코드는 잘 작동해야 한다.

인터페이스 분리 원칙

: 인터페이스 계의 단일 책임 원칙
-> 인터페이스 구성 시 최대한 잘게, 원자적으로 구성
-> 가장 보편적인 기능만 들어가게
인터페이스 : 클래스 설명서
-> 실제 내부 구현은 안 되어있으므로, 인터페이스가 최상단 클래스보다 추상적

의존 역전 법칙

: 구체적인 개념에서 추상적인 개념 방향으로 설계
-> 자기보다 구체적인 객체에게 의존하지 말 것

  • 기존 : 자동차 객체 -> 스피커 객체 ( 의존 방향)
    = 구체적 객체 -> 구체적 객체
  • 의존 역전 : 자동차 객체 -> 스피커 인터페이스 <- 스피커 객체
    = 구체적 객체 -> 추상적 객체 <- 구체적 객체

인터페이스는 최대한 원자적으로 구성되어 있어서 잘 안 바뀜
-> 객체를 수정/변경할 가능성이 낮다
-> 인터페이스를 의존하고 있는 객체들이 변경될 여지가 적다
-> 스피커 객체를 수정해도 자동차 객체는 수정할 필요가 없음

0개의 댓글