본문 바로가기
개발 지식/Java 자바

[Java/자바] 객체 지향의 특징, 장단점과 5대 원칙 SOLID 설명

by 머그워트 2023. 6. 1.
728x90

출처: CodingNomads

 

자바는 대표적인 객체 지향 언어로, 객체지향의 5대 원칙인 SOLID라는 것이 있다.

객체 지향에 대해 간단히 알아보고, 특징과 SOLID에 대해서도 알아 보자.

 

객체 지향 프로그래밍 (OOP, Object-Oriented Programming)

자바를 처음 배울 때부터 정말 수도 없이 들어 본 용어이다.

 

우선, 객체 지향에 반대가 되는 개념으로는 절차 지향이라는 것이 있다.

절차 지향 프로그래밍은 말 그대로 코드를 절차 별로, 순서대로 실행되게 프로그래밍하는 것이다. 그러므로 프로그램의 흐름에 중점을 두게 된다. C언어가 대표적인 절차 지향 프로그래밍 언어이다.

 

객체 지향은, 객체들 간의 관계와 상호 작용을 이용하여 프로그램을 구성하는 것을 말한다. 현실 세계의 사물 등을 프로그래밍에 이용하기 위해 객체로 표현하고,  이것들의 관계와 상호 작용 등을 함수(메소드)변수(필드)로 구현한다. Java와 C++ 등이 대표적인 객체 지향 프로그래밍 언어이다.

 

장점

  1. 코드의 재사용성: 클래스를 가져와서 사용하거나 상속 가능
  2. 유지보수가 용이함: 캡슐화를 통해 결합도가 낮아고 응집력은 올라감
  3. 확장성: 클래스 단위 모듈화 가능

 

단점

  1. 절차지향보다 느린 속도: 객체를 찾는 시간이 소요됨. 절차지향은 순서대로 실행되므로 빠름.
  2. 설계의 어려움: 객체의 상호작용을 고려한 설계가 필요하므로 시간과 노력을 요함

 

 

이 객체 지향의 특징에는 추상화, 상속, 캡슐화, 다형성이라는 것이 있다.

 

추상화 (abstraction)

불필요한 정보는 숨기고, 객체의 공통 속성과 기능을 포착해서 필요한 정보만을 이용해 프로그래밍 한다.

 

예를 들어, 철수, 영희, 민수, 민희는 모두 학교를 다닌다.

근데 각 학생들은 다니는 학교가 모두 다르다고 치자.

그렇다면 이들의 공통 속성은 "학교를 간다"라는 사실일 것이다.

이러한 공통 속성을 빼서 인터페이스로 정의하고, 각 학생들이 다니는 학교는 이것을 상속받아 구현할 수 있을 것이다.

 

그렇다면 상속은 무엇일까?

 

 

상속 (inheritance)

부모 클래스의 메소드를 자식 클래스에서 물려 받는 것을 말한다.

현실 세계에서도, 상속은 부모로부터 자식이 재산 등을 물려 받는 것을 표현하는 단어이다.

객체지향 프로그래밍에서도 마찬가지로 부모에게 속성을 물려 받는 것을 상속이라고 부른다.

 

자바에서 클래스는 1개만 상속 받을 수 있지만, 인터페이스는 여러 개 상속 받을 수 있다.

인터페이스와 클래스를 동시에 상속 받는 경우도 존재한다.

이것을 다중 상속이라고 부른다.

 

클래스를 여러 개 상속받을 수 없는 이유는, 클래스에서는 이미 메소드가 구현되어 있기 때문이다.

만약 2개의 클래스를 상속 받는데 2개의 클래스에 같은 이름, 리턴타입, 매개변수를 가지는 메소드가 있다고 하자.

이 경우 이것을 상속받는 클래스에서는 둘 중 어떤 메소드를 상속받을 것인지 판단할 수가 없게 된다.

 

하지만 인터페이스는 여러 개 상속받을 수 있는 것은, 인터페이스의 메소드는 아직 구현되어 있지 않기 때문에

상속받는 자식 클래스에서 새롭게 정의해야 하기 때문에 충돌 가능성이 없기 때문이다.

 

 

캡슐화 (encapsulation)

클래스라는 캡슐에 어떠한 목적의 변수와 메소드를 넣고, 접근 제어자를 활용해 정보 은닉을 하는 것을 말한다.

정보 은닉(information hiding)은 외부에서 필요하지 않은 정보는 접근할 수 없도록 하는 것을 말한다.

이렇게 하면 응집도는 올라가고, 결합도는 낮아져 유지보수하기가 용이해 진다.

(응집도: 클래스 내 요소들의 관련성, 결합도: 다른 클래스에 의존하는 정도)

 

예를 들어, 우리가 TV의 전원을 켤 때, 우린 TV의 전원 버튼을 누르면 TV가 켜진다는 사실만 알면 되지, 어떠한 원리로 기계 내부에서 동작이 일어나서 전원이 켜지는지 까지는 알지 못해도 된다. 이렇게 필요한 정보만 보여주고 그 외의 정보는 숨기는 것을 정보 은닉이라고 한다.

 

 

다형성 (polymorphism)

하나의 이름을 가진 메소드를 여러 형태로 만드는 것을 말한다. 즉, 같은 형태이지만 다른 기능을 하는 것이다.

오버로딩과 오버라이딩이 대표적인 예시인데, 두 용어에 대한 설명은 이 포스팅을 참고하면 된다.

[Java/자바] 오버라이딩(Overriding)과 오버로딩(Overloading)

 

 

 

SOLID 원칙

아래 각 원칙의 맨 앞 알파벳을 따서 만든 용어이다.

  1. Single Responsibility Principle(SRP): 단일 책임 원칙
    • 객체(클래스)는 단 하나의 책임을 가져야 한다.
    • 각 역할 별로 클래스를 구분한다.
  2. Open Close Principle(OCP): 개방 폐쇄 원칙
    • 본인의 확장에는 열려 있어야 하고, 주변의 변화에는 닫혀 있어야 한다.
    • 즉, 기존 코드의 변경 없이 기능 추가가 가능해야 한다. (인터페이스 등으로 추상화)
  3. Liskov Substitution Principle(LSP): 리스코프 치환 원칙
    • 자식 클래스는 부모 클래스의 행위를 수행하는 것이 논리적으로 가능해야 한다. 
    • 즉, 자식 클래스가 부모 클래스를 상속 받는 것이 적합한 지에 대한 원칙이다.
    • 예를 들어, 호랑이가 사자를 상속받는 것은 적합하지 않다. 호랑이는 사자의 한 종류가 아니기 때문이다. 하지만 호랑이가 동물을 상속받는 것은 적합하다.
    • 그러므로 동물을 선언하고 호랑이로 구현하는 것은 이 원칙에 적합하나, 사자를 선언하고 호랑이로 구현하는 것은 이 원칙에 맞지 않는다.
  4. Interface Segregation Principle(ISP): 인터페이스 분리 원칙
    • 인터페이스는 각각 상황에 맞게 기능을 제공할 수 있도록 분리되어야 한다.
  5. Dependency Inversion Principle(DIP): 의존 역전 원칙
    • 자주 바뀌는 것은 의존하지 않는 것이 좋다.
    • 부모 클래스가 자식 클래스에 의존하면 안 된다.
    • 공통이 되고 자주 바뀌지 않는 속성을 부모 클래스로 두는 것이 좋다.

 

마지막으로 SOLID를 예시와 함께 잘 설명한 블로그 글을 공유하고 마치고자 한다.

https://limkydev.tistory.com/77

728x90

댓글