[JAVA 기초] 객체지향이란?

shooting star·2023년 6월 10일
5

JAVA 기초

목록 보기
2/5

객체지향이란?

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 복잡한 문제를 해결하기 위해 개발된 방법론이다. 객체 지향의 기본적인 사상은 실제 세계를 모델링하여 소프트웨어를 더 이해하기 쉽고, 수정하기 쉽게 만드는 것이다. 이어서 객체지향의 패러다임, 절자지향과의 차이, 특징, 원칙들에 대해서 알아보도록 하겠다.

1) 객체지향 패러다임

  • 적절한 객체에게 적절한 책임을 할당하여 서로 메시지를 주고 받으며 협력하도록 하는 것이다.
  • 점점 증가하는 SW 복잡도를 낮추기 위해 객체지향 패러다임이 대두되었다.
  • 클래스가 아닌 객체에 초점을 맞추고 객체들에게 얼마나 적절한 역할과 책임을 할당하는지가 중요하다.

2) 절차지향 프로그램 vs 객체지향 프로그램

  • 책임이 한 곳에 집중돼 있는 방식은 절차지향
  • 책임이 여러 객체로 적절히 분산돼 있는 방식은 객체지향

3) 객체지향 4가지 특징

  • 추상화(Abstraction) : 불필요한 부분을 제거함으로써 필요한 핵심만 나타내는 것을 말한다. 일반화 단순화라고도 표현할 수 있을 것이다. 주로 복잡성을 낮추기 위해서 사용된다.
  • 다형성(Polymorphism) : 다양한 형태를 가지고 있다. 하나의 타입으로 여러 객체를 창조하는 것을 다형성이라고 한다.
  • 캡슐화(Encapsulation) : 객체 내부의 세부사항을 외부로부터 감추는 것을 의미한다. 인터페이스만 공개해서 변경하기 쉬운 코드를 만들기 위함이다.
  • 상속(Inheritance) : 부모로 부터 물려받는 것이다.

4) 객체지향의 5가지 설계 원칙(SOLID)

  • SRP : Single Responsibility Principle (단일 책임의 원칙)은 하나의 책임을 가진다.
  • OCP : Open/Closed Principle (개방 폐쇄의 원칙)은 확장에는 열려있고 변경에는 닫혀있다. 즉, 기존 코드를 변경하지 않고 기능을 추가할 수 있어야 한다.
  • LSP : Liskov's Substitution Principle (리스코프 치환의 원칙)은 상위 타입의 객체를 하위 타입의 객체로 치환해도 동작해 전혀 문제가 없어야 한다.
  • ISP : Interface Segregation Principle (인터페이스 분리의 원칙)은 많은 기능을 가진 인터페이스를 작은 단위로 분리시킴으로써 클라이언트에게 필요한 인터페이스들만 구현하도록 한다. 즉, 클라이언트가 사용하지 않는 기능에 의존하면 예상하지 못하는 문제가 발생할 수 있는데 이를 예방할 수 있다.
  • DIP : Dependency Inversion Principle (의존성 역정의 원칙)은 의존 관계를 맺을 때 자주 변경되는 쪽이 아니라 변경이 거의 일어나지 않는 쪽에 의존 하라는 것이다. 자기보다 변하기 쉬운것에 의존하게 되면 변화에 영향을 많이 받기 때문에 추상화된 인터페이스나 상위 클래스를 둬서 변화에 영향을 받지 않게 하기 위한 원칙이다.

객체지향 설계

객체지향 설계는 high cohesion, loose coupling로 표현할 수 있을 것 같다. 높은 응집도와 낮은 결합도이다. 설계할때 가장 염두에 둬야한다. 응집도가 높은 것끼리는 하나로 모아둔다. 그리고 다른 성격의 것들은 분리시킴으로써 낮은 결합도를 가진다. 이렇게 하면 응집도가 높은것끼리 묶어두면 변경이 생길때 변경의 포인트가 하나로 집중된다.

프로그램을 하다보면 수정에 대한 요구사항이 많은데 영향 어디까지 인지 모르겠다는 표현을 쓰게된다. 그런 표현자체가 객체지향적으로 설계가 되지 않았다는 것을 뜻한다. 객체지향은 변경에 대한 요구사항이 들어왔을때 특정 한 부분만 수정하면 된다는 것은 응집도가 높은 것이며, 다른 곳에 영향을 미치지 않는다면 낮은 결합도라고 한다. 즉, 유지보수와 관련이 크다. 객체지향 설계를 하는 가장 큰 이유는 변경이 생겼을 때 빠르고 유연하게 대응할 수 있어야 하는 것이다.

객체지향을 설계하는 순서

  • 도메인을 구성하는 객체에는 어떤 것들이 있는지 고민하기
  • 객체들 간의 관계를 고민
  • 동적인 객체를 정적인 타입으로 추상화해서 도메인 모델링 하기
  • 협력을 설계
  • 객체들을 포괄하는 타입에 적절한 책임을 할당
  • 구현하기

0개의 댓글