[Java] Java에서의 객체지향이란
객체지향은 이야기하기에는 너무나 방대한 이야기이지만 자바를 배우기 위해서 꼭 필요한 이야기이므로 하고 넘어가도록 하자.
1. 객체지향
객체지향은 자바 프로그래램을 구현하는 하나의 방법이다. 소프트웨어는 하드웨어와 달리 구체화된 상태가 없어서 오히려 설계하기가 힘들다. 그 이유는 제약 사항이 없기 때문이다. 우리에게 무한한 자유를 주기 때문에 오히려 무엇을 할지 못하는 상태가 되버리는 것이 소프트웨어의 제약이다. 무엇이든 할 수 있지만 그렇기에 모든 것을 할 수 없는 상태가 되는 것이다. 현실 세계에서 톱니바퀴를 만든다면 현실 세계의 톱니바퀴는 만드는데 제약이 아주 많다. 재질부터 시작해서 만들어내기 위한 틀 또한 모든 것이 제약 사항이 될 것이다. 하지만 프로그램에서는 제약이 없다. (또 다른 예로는 수식을 만들고자 한다고 생각해보아라, 어떻게 만들어야 할지, 어떤 것을 변수로 놔야 할지 잘 모를것이다.)
그래서 프로그램을 모델링 하기란 너무나 어려운 것이다. 이를 사람이 설계하기 쉽게 만들기 위해 생각한 것이 객체지향 프로그래밍이다. 객체지향 프로그래밍은 일상 생활을 객체로 표현함으로써 이러한 설계 과정을 추상화하기 위해 노력했다.
예를 들어보자, 커피숍에서 커피를 시키는 상황을 생각해보자. 커피숍에는 바리스타와 손님 그리고 커피머신이 있다. 여기서 바리스타, 손님, 커피머신은 각각 하나의 객체라 볼 수 있다. 손님은 바리스타에게 커피를 주문하는 메시지를 전달할 것이며, 바리스타는 이러한 메시지를 받아서 처리해준다. 그리고 바리스타는 커피머신을 활용해서 커피를 만들게 될 것이다. 그리고 다시 커피머신에 의해 만들어진 커피는 바리스타에게 전달되고, 다시 커피는 손님에게 전달됨으로써 상황이 마무리가 된다.
이러한 상황을 모델링 하는 것을 객체지향이라 볼 수 있다. 대부분의 일을 처리할 수 있는 상상력을 가질 수 있게 되는 것이다. C++과 Java는 이러한 객체지향적 언어라 볼 수 있다.
2. 어떠한 방식으로 만들 것인가?
그러면 이를 만들기 위해서 어떠한 방식으로 설계할 것인가가 새로운 문제가 된다. 어디서부터 어디까지가 하나의 객체이며, 어떠한 방식으로 표현하는가가 문제가 된다. 그래서 객체지향은 기본 원칙을 둠으로써 설계할 때, 너무 많이 벗어난 설계를 하지 않도록 하고 있다. 설계의 기본 방향은 네 가지 기본 원칙으로부터 시작된다.
- 캡슐화
- 추상화
- 상속
- 다형성
이렇게 네 가지 기본 원칙이 존재한다.
캡슐화는 데이터와 데이터에서 작동하는 하나의 단위로 묶는다. 그리고 그 내부의 속성과 메소드의 내부 구조를 숨기는 것을 나타낸다. 이전에 설명한 것처럼 해열제(알약) 안에는 어떠한 성분이 들어있는지 모르더라도 우리는 해열제(알약)이 먹으면 열을 내리는 작용을 한다는 것을 안다.
데이터의 추상화 는 객체의 구현은 현실 세계의 복잡함을 그대로 표현하기 위함이 아닌 추상화된 형태를 표현해야 함을 이야기 한다. 추상화는 특정 일에 대한 구체적인 상황을 제거하고 일에 대한 본질을 표현하는 형태를 이야기한다. (예를 들어, 동사무소에서 하는 일은 민원 처리, 장비 대여, 행정 업무 등 다양한 업무를 보고 있지만 그에 따른 본질은 동에 사는 주민들에 대한 편의를 위한 업무 처리이다.)
상속 은 클래스에서 부모와 자식 간의 관계를 정의하는 메커니즘이다. 사실 이 관계는 부모로부터 물려받은 특정 클래스의 특징을 이야기하는데, 여기서 특징은 부모 클래스에서 가지고 있는 어떠한 기능을 이야기한다. 예를 들어, 부모가 가지고 있는 정수를 처리하는 능력은 자식에게 상속되어 그대로 정수를 처리하는 능력을 가지게 되는 것이다. 이는 중복된 기능에 대한 개발을 막기도 하며, 효율성 증대와 더불어 설계의 계층 구도를 생각하기 위함이라 봐도 좋다.
다형성 이란 하나의 이름에 여러 형태를 의미한다. 프로그래머에 따라 같은 이름을 가지더라도 해석은 다를 수 있다. 이러한 것을 객체지향은 받아들여서 다형성이란 이름으로 새롭게 재해석될 수 있는 것이다. 이전에 우리가 배운 println에서 정수형을 받아들이는지, 실수형을 받아들이는지, 문자형을 받아들이는지 모두 다를 수 있다. 프로그래머가 '특정 값을 받아서 출력한다.'의 의미가 프로그래머마다 다를 수 있는 것이다. 특정 값이 어떤 사람은 정수로 받아들일 수도 있는 것이고, 어떤 사람은 실수로 받아들일 수도 있는 것이다. 이러한 부분을 처리하기 위해 다형성을 두게 된 것이다.
또 다른 예로는 우리가 특정 웹사이트에서 게시판을 만들 때, 게시판의 제목과 글쓰기 등의 형태는 유사하지만, 그걸 실제로 구현하는 게시판에 해당하는 제목과 날짜 그리고 디자인은 다를 수 있음을 이야기한다. 즉 실제로 구현하는 사람의 해석에 따라 그 형태가 달라지는 것이다.
3. 클래스와 인스턴스
자바에서는 클래스란 개념이 있는데, 객체지향에서는 객체란 개념이 있다. 이를 매칭시켜야 설계를 할 것이다. 일반적으로 자바에서 클래스를 이용해서 객체를 설계한다. 하지만 이는 하나의 설계도일 뿐이다. 자동차를 예를 들어보자, 자동차는 기본적으로 동일한 속성이 존재한다.
- 바퀴
- 엔진
- 기본 프레임
더 많은 속성이 있겠지만 이정도라 생각하자. 자동차는 이러한 속성은 같지만 실제로 갖는 값은 서로 다르다. H사에서 만든 자동차와 K사에서 만든 자동차는 실제 속성의 값이 틀리다. 엔진도 있고 바퀴도 있고 기본 프레임도 있지만, 엔진의 출력도 다르고 바퀴의 크기도 다르며, 프레임의 색도 다르다. 우리는 이렇게 기본 설계가 되는 형태를 클래스라 하며 실제로 갖는 값을 인스턴스라 할 수 있다.
- 기본 예시로 H사의 그랜저와 K사의 K9는 인스턴스라 볼 수 있는 것이다. (자동차 객체를 갖는)
객체지향은 이 보다 더 많은 이야기를 담고 있지만, 처음보는 사람이 이 정도만 이해를 하면 충분하다. 대략적인 개념은 이 정도로 담아둔 상태에서 조금 더 프로젝트를 진행시키거나 조금 더 프로그래밍을 연습해보면서 특정 상황적인 부분을 프로그램으로 어떻게 담을지 고민하면서 발전시켜 나가야 한다. 이 글에서도 객체지향의 모든 것을 담지는 못했다. 이는 설계하는 사람에 따라 그 해석 과정이 계속해서 달리지기 때문에 대략적인 이야기를 바탕으로 풀어나가려고 했다.