Java - OOP

2 minute read

객체지향프로그래밍

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

- 프로그래밍 패러다임
- 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것
- 여러가지 목적성을 갖고 있는 로직들의 모임
- 변수와 메소드를 그룹핑한 단위를 객체라고 한다.

객체지향하면 주로 언급되는 것들이다. 이를 요약해보면 객체지향 프로그래밍은구현하고자 하는 대상을 객체로 바라보며 프로그래밍하는 것이다.

예를들어, 커피숍을 객체지향 관점에서 구현해보자.

image

[출처 - 우아한 형제들 기술블로그 : 생각하라, 객체지향처럼]

커피숍은 우리가 흔히 얘기하는도메인이 될 것이고, 커피, 바리스타, 매니저, 손님, 커피 메뉴판 등은 객체가 된다. 커피는 가격, 사이즈와 같은 상태가 존재한다. 손님은 커피를 주문하고, 매니저는 주문을 관리하고, 바리스타는 커피를 제조하는 행위를 가진다. 이와 같이 상태와 행위를 가질 수 있는 모든 것들을 객체화할 수 있다.

또 하나의 예를 통해 살펴보자.

게시판을 객체지향관점에서 구현해본다고 생각하자.

image

이때, 게시판 본문, 댓글이 하나의 객체이다. 본문에는 게시글, 작성자, 작성시간과 같은 변수와 게시글 게시, 게시글 수정, 게시글 삭제와 같은 메소드가 존재한다.

이러한 변수와 메소드의 모임을 객체라고한다.

이처럼 구현하고자 하는 대상을 객체로 바라보며, 객체가 상태와 행위를 가지도록 프로그래밍하는 것이 객체 지향 프로그래밍이라 할 수 있다.

객체지향에서 설계란 무엇일까?

현실 => SW로 만드는 것!

객체지향에서 설계란, 현실의 문제를 SW 관점에서 추상화시키는 것이다.

- 추상화(abstract)
  현실에서 필요로하는 것만을 추출해놓은 것
  해결해야할 문제, 반영해야할 현실을 SW적으로 단순화 시켜서 만드는 행위
- SW를 설계하는 것?
  복잡한 현실을 추상화 하는 것

지도와 지하철 노선도를 비교해, 추상화를 알아보자.

image

현실지도는 상세하게 그 지역에 있는 건물, 도로 등 모든것을 표현한다. 현실의 복잡함을 보여준다.

image

지하철 노선도는 지하철 탑승자의 관심사만을 반영한다. 역 간의 거리나 실제위치들은 모두 배제하고, 현재 위치가 어디인지 다음역은 어디로 향하는지 지하철을 이용하는데 필요한 정보만을 담고있다.
즉, 복잡함 속에서 불필요한 것들은 배제하고, 필요한 관점만을 추출하고 있다. 이것을 추상화라고한다.

부품화는 객체지향의 정점이다!

부품화는 동일한 기능의 메소드와 변수를 그룹핑하는 것이다. 부품화를 통해 프로그램 설계나 유지보수가 수월해진다. 절차지향을 적용해 생각해보자. 하나의 변수 값이나, 함수가 변경되면 이후 코드에 영향을 미치게 된다. 객체지향은 부품화를 통해 이를 방지할 수 있다. 부품에 문제가 생겼다면, 부품을 새롭게 갈아끼우기만 하면 된다.

ex) 컴퓨터를 추상화해보자. 본체, 모니터, 키보드, 마우스를 객체로 바라보고, 이들 하나 하나를 부품화할 수 있다.

부품화 장점

- 코드의 양을 극적으로 줄일 수 있다.
- 메소드 별로 기능이 분류되어 필요한 코드를 쉽게 찾을수 있고
  문제 진단도 빨라진다.

은닉화, 캡슐화

부품화는 단순 동일 기능 메소드,변수를 그룹핑한다고 달성되는 것이 아니다.

제대로 된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도
그 부품을 사용하는 방법만 안다면 사용 가능하도록 해야한다!

예를들어, 모니터가 어떻게 동작하는지 몰라도 컴퓨터와 모니터를 연결하는 방법만 알면 화면을 표시할 수 있는 것과 같은 이치이다.

즉, 내부 동작 방법을 단단한 케이스 안으로 숨기고, 사용자에게는 그 부품의 사용방법만 노출한다. 이러한 컨셉을 은닉화, 캡슐화라고 부른다.

인터페이스

잘 만들어진 부품이라면 부품과 부품을 서로 교환할 수 있어야한다.

image

예를들면, A사의 모니터를 연결하다, B사의 모니터를 연결하는 것이다. 이는 모니터 케이블의 규격을 표준화해 가능하다. 즉, 연결점의 모양(신호를 입,출력 핀의 구조, 기능 등)을 표준에 맞게 만들면 된다.

이러한 연결점을 인터페이스라고 한다.

마무리

객체지향이 무엇인지, 객체지향의 특징에 대해 간략하게 살펴봤다. 은닉화, 캡슐화, 인터페이스 등 객체지향을 잘 나타내는 개념은 추후에 예제를 통해 작성할 예정이다.

Reference

  • https://opentutorials.org/course/743/6553

  • https://woowabros.github.io/study/2016/07/07/think_object_oriented.html

Tags: ,

Categories:

Updated:

Leave a comment