[JAVA] 객체 지향 프로그래밍, SOLID

mingsso·2023년 10월 9일
0

Java-Kotlin

목록 보기
10/17

1️⃣ 객체 지향 프로그래밍(OOP, Object Oriented Programing)

현실 세계의 사물 및 개념들을 객체로 보고, 그 객체를 조립하여 프로그래밍 하는 기법

  • 절차 지향 프로그래밍의 코드 중복제거가 가장 큰 목적
  • 객체를 추출해 객체들 간 관계를 결정하고, 이들의 상호작용에 필요한 함수와 변수를 설계 및 구현함
  • 사람의 사고와 가장 비슷하게 프로그래밍을 하기 위해서 생성된 기법
  • 하나의 클래스를 바탕으로 서로 다른 상태를 가진 인스턴스를 만들면 서로 다른 행동을 하게 됨(재사용성)

특징 1. 추상화(Abstraction)

추상화의 사전적 의미는 “사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것”

같은 맥락에서 객체 지향 프로그래밍에서 의미하는 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말함
자바에서 추상화를 구현할 수 있는 문법 요소로는 추상 클래스인터페이스가 있음

ex)

자동차와 오토바이는 모두 이동 수단이며, 전진과 후진을 할 수 있다는 공통점을 가짐
자동차와 오토바이라는 하위 클래스들의 공통적인 기능(전진과 후진)을 추출하여 이동 수단 이라는 상위 클래스에 정의했음

특징 2. 상속(Inheritance)

기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소

  • 클래스 간 공유될 수 있는 속성/기능들을 상위 클래스로 추상화시켜, 해당 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 상위 클래스의 속성/기능들을 간편하게 사용할 수 있도록 함
  • 클래스들 간 공유하는 속성/기능들을 반복적으로 정의할 필요 없이 딱 한 번만 정의해두고 재사용할 수 있어, 반복을 최소화하고 공유하는 속성/기능에 간편하게 접근하여 사용할 수 있도록 함
  • 상위 클래스의 기능/속성들을 그대로 사용할 수도 있지만, 각각의 클래스의 맥락에 맞게 메서드 오버라이딩을 사용하여 내용을 재정의할 수도 있음

💡 상속 vs 추상화

  • 상속의 경우 상위 클래스의 속성/기능들을 하위 클래스에서 그대로 사용하거나 오버라이딩을 통해 선택적으로 재정의하여 사용할 수 있는 반면,
    인터페이스를 통한 구현은 반드시 인터페이스에 정의된 추상 메서드의 내용이 하위 클래스에서 정의되어야 함
  • 결론적으로, 상속 관계의 경우 인터페이스를 사용하는 구현에 비해 추상화의 정도가 낮다고 할 수 있음

ex)

특징 3. 다형성

어떤 객체의 속성/기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미
(어떤 중년의 남성이 있다고 했을 때 그 남자의 역할이 아내에게는 남편, 자식에게는 아버지, 부모님에게는 자식, 회사에서는 회사원 등 상황과 환경에 따라서 달라지는 것과 비슷)

자바에서 다형성를 구현할 수 있는 문법 요소로는 메소드 오버라이딩메소드 오버로딩이 있음

ex)

public interface Vehicle {
	public abstract void start();
    void moveForward();
    void moveBackward();
}
// 이동 수단을 구체화한 자동차 클래스 
public class Car implements Vehicle {

	// 같은 이름의 메소드가 상황에 따라 다른 역할을 수행하도록 정의 가능
	@Override
    public void moveForward() {
    	System.out.println("지동차가 앞으로 전송합니다");
    }
    
    @Override
    public void moveBackward() {
    	System.out.println("자동차가 뒤로 후진합니다");
    }
}

특징 4. 캡슐화(Encapsulation)

클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것

  • 데이터 보호와 데이터 은닉을 위함
    • 데이터 보호 : 외부로부터 클래스에 정의된 속성과 기능들을 보호
    • 데이터 은닉 : 내부의 동작을 감추고 외부에는 필요한 부분만 노출
  • 자바에서 추상화를 구현할 수 있는 문법 요소로는 접근 제어자getter/setter 메서드가 있음


OOP의 장단점

  • 장점
    • 사람의 관점에서 프로그래밍하므로 이해하기 쉬움
    • 강한 응집력과 약한 결합력을 가짐
    • 재사용성, 확장성이 높음
  • 단점
    • 실행 속도가 느림
    • 객체가 많으면 프로그램 용량이 커질 수 있음
    • 설계 시 많은 시간이 소요됨



2️⃣ SOLID

객체지향 프로그래밍의 설계 원칙을 의미함

S; 단일 책임의 원칙(SRP)

  • 모든 클래스는 단 하나의 책임만 가져야 함
  • 클래스를 그 책임을 완전히 캡슐화 해야함을 의미
  • ex) 결제 클래스는 오직 결제 기능만을 책임지고, 만약 수정해야 하면 결제에 관한 문제만 수정해야 함

O; 개방 폐쇄의 원칙(OCP)

  • 기존 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 함
  • 확장에는 열려있고, 수정에는 닫혀있어야 함
  • ex) 캐릭터를 하나 생성하는데 캐릭터마다 움직임이 다른 경우, 움직임 패턴 구현을 하위 클래스에 맡긴다면 캐릭터 클래스의 수정은 필요없고(Closed), 움직임 패턴만 재정의 하면 됨(Open)
  • 관련 매커니즘 : 추상화, 다형성, 상속, 컴포지트

L; 리스코프 치환 원칙(LSP)

  • (일반화 관계에서) 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 함
  • 하위 타입은 항상 상위 타입을 대체할 수 있어야 함
  • 다형성과 확장성을 극대화하며, 개방-폐쇄 원칙을 구성함
  • 관련 매커니즘 : 상속, 합성, 제너릭
  • 부모 클래스 자리에 자식 클래스를 넣어도 역할을 수행하는데 문제가 없어야함

I; 인터페이스 분리 원칙(ISP)

  • 인터페이스를 클라이언트에 특화되도록 분리시키라는 설계 원칙
  • 인터페이스 내에 메소드는 최소한일수록 좋음 (하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 나음)
  • 최소한의 기능만 제공하면서 하나의 역할에 집중하라는 의미
  • 단일책임원칙과, 인터페이스 분리 원칙은 같은 문제에 대한 2가지 다른 해결책이다.
  • 가능한 최소한 인터페이스를 사용하여 단일 책임을 강조
  • 일반적으로 ISP보다 SRP할 것을 권장함

D; 의존관계 역전 원칙(DIP)

  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안됨
  • 의존 관계를 맺을 때 변화하기 쉬운 것, 자주 변화하는 것 보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존해야한다는 의미
  • DIP 원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI; Dependency Injection)을 활용






참고자료

https://computer-science-student.tistory.com/140
https://theheydaze.tistory.com/603
https://dev-coco.tistory.com/142

profile
🐥👩‍💻💰

0개의 댓글