개발언어/Java

[Java] 객체지향프로그램 OOP란

JiWonSon 2020. 12. 26. 01:22

OOP (Object Oirented Programming) 객체지향 프로그래밍

 

프로그래밍에서 필요한 데이터를 추상화시켜 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 만드는 프로그래밍 방법이다.

 

그렇다면 객체지향 프로그래밍은 뭘까?

 

기존의 절차지향 프로그래밍의 관점에서 벗어나 독립 단위의 객체 모임으로 파악하는 것이다.

즉, 각각의 객체들이 있으면 이를 잘 짜여지게 프로그래밍하는 것

객체들 사이에서는 서로 데이터를 주고받으며 처리하는 능력을 가진다.

 

 

OOP의 특징 4가지

  • 캡슐화 - 자료 표현을 실제 구현 내용이 보이지 않게 캡슐화 시키는 개념 (예)변수 앞private선언)
  • 추상화 - 객체들의 공통 특징을 묶어 하나의 클래스로 다루는 것
  • 다형성 - 하나의 객체가 여러가지 타입을 가질 수 있는 것
  • 상속성 - 클래스의 멤버나 함수를 다른 클래스에 물려주는 것

이러한 특징을 통해 코드를 재사용하기 쉽고 유지보수하기 편하다는 장점을 가지고 있다.

 

 

OOP의 기본 요소

  • 클래스 - 같은 종류의 집단에 속하는 속성과 행위를 정의한 것
  • 객체 - 클래스의 객체로, 실제 메모리상에 할당된 실체이다. 클래스에 정의된 메서드를 수행한다.
  • 메서드 - 클래스로부터 생성된 객체를 사용하는 방법

 

OOP의 5대 원칙

SOLID 원칙이라고도 한다.

 

  • SRP (Single Responsibility Principle 단일 책임의 원칙)

        클래스는 한가지 기능만을 가지며 한가지 책임을 수행하는데 집중되어야 한다라는 것을 의미합니다.

     SRP 원칙을 따르면 클래스를 여러가지로 분할하여 유연하게 설계할 수 있으며 다른 행동, 책임이 격리되어 연쇄적인 효과가 발생할 여지가 줄어듭니다. 따라서 수정될 코드가 적어진다는 장점이 있습니다.

       

      

  • OCP(Open Close Principle 개방폐쇄의 원칙)

      변경에 대한 비용을 줄이면서 확장에 대해서 가능한 극대화해야 한다는 것을 의미하는 것으로 즉, 다른 추가사항이 일어나더라도 기존 구성은 변경하지 않으며 확장에 대해 가능성을 열어줘야 한다는 것입니다.

       이를 적용하기 위해 각 모듈 간의 호출을 CLASS가 아닌 Interface 또는 추상화에 의존하도록 설계되어야 합니다.

 

     OCP를 정리하자면 개방-폐쇄는 컴파일 타임의 의존성을 인터페이스에 고정시키고 런타임 의존성을 변경시게 함으로써 추가클래스를 생성하여도 동작은 추가(개방)되지만 기존의 코드는 수정되지 않음(폐쇄)를 의미합니다.

 

 

  • LSP(The Liskov Substitution Principle 리스코브 치환의 원칙)

        사용자의 관점에서 기능에 영향을 미치 지 않고 자식 클래스를 부모 클래스로 대체할 수 있어야 함을 의미합니다.

      예를들어 도형클래스, 사각형클래스, 원클래스가 있다고 합니다.

 

     - 도형클래스

     (1)도형은 둘레를 가지고 있다.

     (2)도형은 넓이를 가지고 있다.

     (3)도형은 각을 가지고 있다.

 

      일반화관계는 단어를 교체해보면 알 수 있습니다. 위의 '도형'이란 단어를 '사각형'으로 대체 해보겠습니다.

     (1)사각형은 둘레를 가지고 있다.

     (2)사각형은 넓이를 가지고 있다.

     (3)사각형은 각을 가지고 있다.

 

     변경 후에 문장들은 어색함이 없습니다. 따라서 도형과 사각형 사이에는 일관성이 있다할 수 있습니다.

      이제는 '원'이라는 단어로 대체해보겠습니다.

     (1)원은 둘레를 가지고 있다.

     (2)원은 넓이를 가지고 있다.

     (3)원은 각을 가지고 있다.

 

     문장에 '원'을 넣으니 상당히 어색함을 알 수 있습니다. 따라서 도형클래스는 LSP만족을 하지 못한 클래스라 할 수 있습니다. 따라서 일반화 관계가 성립하도록 수정되어야 합니다.

 

      

  • ISP(Interface Segregation Principle 인터페이스 분리의 원칙)

    한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 하며, 하나의 일반적인 인터페이스보다는 여러 개      의 구체적인 인터페이스를 사용하는 것을 의미합니다.

    SRP가 클래스의 단일책임을 강조한다면 ISP는 인터페이스의 단일책임을 강조합니다.

   

    예를들어 스마트폰으로 전화, 웹서핑 등의 다양한 기능을 사용할 수 있습니다.

   그런데 전화중에는 웹서핑이라는 기능을 사용하지 않습니다. 따라서 전화기능, 웹서핑 기능은 각각 독립된 인터페이스 로 구분하여 서로에게 영향을 받지 않도록 설계되어야 합니다. 이를 통해 시스템 내부의 의존성을 약화시켜 수정, 재배포를 쉽게 할 수 있습니다. 

 

 

 

  • DIP(Dependency Inversion Principle 의존성역전의 원칙)

      의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운것에 의존해야 한다는 원칙입니다.

      여기서 말하는 변하하기 쉬운것이란 구체적인 것을 말하고 변화하기 어려운 것이란 추상적인 것을 말합니다.

     쉽게 말해서, 의존관계를 맺을 때 구체적인 클래스보다 인터페이스나 추상클래스와 관계를 맺는다는 것을 의미합니다. 

 

     

    

 

 

 

 

 

<참조>

velog.io/@lsb156/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EA%B0%9C%EB%B0%9C-5%EB%8C%80-%EC%9B%90%EC%B9%99-SOLID

dev-momo.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99

'개발언어 > Java' 카테고리의 다른 글

[Java] 입출력 API  (0) 2021.07.04
[Java] 반복문(for,while,for each)  (0) 2020.12.27
[Java] 자바 개념 및 실행과정  (0) 2020.12.14