본문 바로가기

BE/JAVA

[JAVA] 객체 지향 프로그래밍 기본 및 활용 (SOLID)

목차
1. 객체지향프로그래밍이란? 

2. 객체지향 프로그래밍의 유연성 
3. 클래스/객체/인스턴스란? 
4. 객체 지향 프로그래밍 : 역할과 구현을 분리 (SOC) 
5. 좋은 객체 지향 설계의 5가지 원칙 (SOLID) 

 

 

📌 1. 객체지향프로그래밍이란? 

자바는 객체 지향 프로그래밍 언어입니다.

객체 지향 프로그래밍은 기존의 절차 지향 프로그래밍에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것입니다. 객체란, 물리적/추상적으로 독립된 단위로서 고유의 속성을 가지고 있고 식별 가능한 것을 말합니다. 우리 현실에 있는 차, 냉장고, 고객, 배송 등을 객체라고 부릅니다. 객체지향프로그래밍의 대표적 특징에는 상속,캡슐화(은닉),다형성,추상화가 있습니다.

 

📌  2. 객체지향 프로그래밍의 유연성 

유연한 구조 : 프로그램을 유연하고 변경을 용이하게 만들어 줍니다.

즉 클라이언트를 변경하지 않고 서버의 구현 기능만을 유연하게 변경할 수 있습니다. 

 

📌  3. 클래스/객체/인스턴스란? 

클래스란, 객체를 만들어 내기 위한 설계도를 의미하며, 연관되어 있는 변수와 메서드의 집합입니다. 

객체란, ‘클래스의 인스턴스'로  클래스 모양 그대로 구현되고 사용되는 실체를 의미합니다. 

인스턴스란, '객체를 실체화'한 것으로 객체가 실제로 실행되는 경우 인스턴스라고 부릅니다. 

 

📌 4. 객체 지향 프로그래밍 : 역할과 구현을 분리 (SOC) 

자바는 "다형성"을 활용하여 역할과 구현을 분리하여 사용합니다.

역할은 인터페이스, 구현은 인터페이스를 구현한 클래스 및 구현 객체를 의미합니다. 

그러나 역할(인터페이스)가 변하면 구현 자체에 영향을 줄 수 있기 때문에 인터페이스를 잘 설계해야 합니다. 

 

📌 5. 좋은 객체 지향 설계의 5가지 원칙 (SOLID) 

1) SRP: 단일 책임 원칙(single responsibility principle)

하나의 클래스는 하나의 책임만 가져야 한다는 원칙입니다. 각 클래스와 메소드는 하나의 역할만 하도록 하는 것입니다.

여기서 "하나의 역할"이란 어떠한 변경이 있을 경우 영향도가 적은 것을 의미합니다. 

 

아래 컴퓨터 클래스 및 컴퓨터 주변기기인 마우스,키보드 클래스를 예시로 들어보겠습니다. 

아래 Computer 클래스의 경우

Computer 클래스가 키보드/마우스를 포함하여 하나 이상의 역할을 하고 있기 때문에 SRP 원칙에 어긋납니다. 

public interface Computer {
    void KeyboardInputText(); //키보드입력
    void MouseClick(); //마우스클릭
}

KeyBoard, Mouse 클래스의 경우 하나의 역할을 하고 있기 때문에 SRP 원칙에 맞습니다. 

public interface KeyBoard {
    void inputText(); 
}

public interface Mouse {
    void click(); 
}


 2) OCP: 개방-폐쇄 원칙 (open/closed principle)

모든 소프트웨어 요소(컴포넌트, 클래스, 모듈, 함수)가 확장에는 열려 있으나 변경에는 닫혀 있어야 하는 원칙입니다. 

자바의 다형성을 활용하면 확장에는 열려있으나 변경에는 닫혀있는 OCP 원칙을 지키며 개발할 수 있습니다.


 3) LSP: 리스코프 치환 원칙 (liskov substitution principle)

리스코프 치환 원칙은 상속과 관련된 SOLID 원칙인데요. 

하위 클래스(자식)의 경우 상위 클래스(부모)로 교체할 수 있어야 한다는  원칙입니다. 


 4) ISP: 인터페이스 분리 원칙 (interface segregation principle)

여러 클라이언트가 공통 인터페이스보다 낫다는 원칙으로, 역할이 명확한 여러개의 클라이언트로 분리해야 한다는 원칙입니다. 

 

 5) DIP: 의존관계 역전 원칙 (dependency inversion principle)

사용자가 기능이 아닌 역할에 의존해야 하며, 추상화가 아닌 구체화에 의존해야한다는 원칙입니다.

클라이언트가 구현 클래스가 아닌 인터페이스에 의존해야 한다는 원칙입니다.

구현클래스에 의존하게 되면 변경이 복잡해지기 때문입니다.