👀 본 포스팅은 Oracle-Java Documentation 원문을 의역한 내용입니다.(오역이 있을 수 있음)
객체지향 프로그래밍
객체 지향 프로그래밍 언어를 한 번도 사용해 본 적이 없다면,
코드 작성을 시작하기 전에 몇 가지 기본 컨셉을 익힐 필요가 있습니다.
객체, 클래스, 상속, 인터페이스, 그리고 패키지라는 기본 컨셉들에 대해서 먼저 배우게 됩니다.
자바의 문법을 공부하는 동시에 이 컨셉들이 어떻게 현실세계와 연관되어있는지 알아보도록 합니다.
What is an Object?:객체란?
객체란 객체-지향 기술을 이해하는 핵심입니다.
우리는 주변에서 쉽게 **객체**
를 찾아볼 수 있습니다: 🐶강아지, 📙책, 🖥TV, 🚴♂️자전거 같은 것들!
현실 세계의 강아지, 책, TV는 서로 공통점이 없어보이지만, 사실 두 가지 공통된 성질이 있습니다.
바로 **상태와 행위**
인데요, 예를 들면 강아지는 다음과 같은 상태와 행위가 가능합니다.
1
2
3
4
5
6
7
8
// 강아지의 상태
종, 털 색상, 배고픔, 크기 등등
// 강아지의 행위
짖기, 킁킁 냄새 맡기, 공 물어오기, 꼬리 흔들기 등등
자전거도 마찬가지입니다.
1
2
3
4
5
6
7
8
// 자전거의 상태
현재 기어, 현재 패달의 rpm, 현재 속도
// 자전거의 행위
기어 바꾸기, 패달 빨리 밟기, 브레이크 잡기 등등
이렇게 현실 세계의 어떠한 객체에 대해
상태와 행위를 구분하는 것은 객체 지향 프로그래밍에 있어 매우 중요한 사고방식입니다.
잠시 시간을 들여 현실 세계의 객체들을 관찰해 본 뒤, 다음의 두 가지 질문을 던져보세요.
1
2
3
4
Q1. 이 객체는 어떤 상태일 수 있지?
Q2. 이 객체는 어떤 행위를 할 수 있지?
하나씩 답을 하다 보면 현실 세계의 객체는 무수히 많은 상태와 행위가 가능하다는 것을 알게 됩니다.
예를 들어 책상에 놓인 램프는 딱 두 가지 상태만 있습니다.
1
2
3
4
5
// 책상 위의 램프가 지닐 수 있는 상태
On
Off
그리고 두 가지 행위가 가능하죠
1
2
3
4
5
// 책상 위의 램프가 지닐 수 있는 상태
Turn On
Turn Off
그러나 책상에 놓인 라디오는 조금 더 많은 상태일 수 있습니다.
그리고 조금 더 많은 행위가 가능하죠!
1
2
3
4
5
6
7
8
// 책상 위의 라디오가 지닐 수 있는 상태
(켜짐, 꺼짐, 현재 볼륨, 현재 채널)
// 책상 위의 라디오가 할 수 있는 행위
(켜기, 끄기, 볼륨 키우기, 줄이기, 채널 찾기, 주파수 맟추기)
어떤 객체는 다른 객체들을 포함한 상태를 지닐 수도 있고, 행위를 할 수도 있을거예요.
이러한 현실 세계에 대한 실제 관찰을 객체 지향 프로그래밍으로 해석하는 것!
이것이 바로 객체 지향 프로그래밍의 매우 중요한 핵심 컨셉입니다.
소프트웨어의 '객체'
는 현실세계의 객체와 흡사합니다.
소프트웨어의 객체도 상태
와 행위
로 구성되어 있거든요.
하나의 객체가 지닌 상태는 필드(변수)
에 저장되고, 행위는 메소드(기능)
을 통해 노출됩니다.
메소드는 객체 내부 상태에서 작동하며, 객체와 객체가 서로 소통하기 위한 기본 메커니즘으로 사용됩니다.
1
2
3
4
5
// 소프트웨어의 객체
상태는 필드(변수)에 저장되고,
행위는 메소드(기능)를 통해 노출된다!
그리고 객체의 메소드들을 통해 객체 내부의 상태와 관련된 모든 상호작용을 숨기는 것,
이것이 **데이터 캡슐화(Data Encapsulation)**
입니다. (객체지향 프로그래밍의 토대)
자전거를 통한 예시를 들어보도록 할게요
위 그림을 보면, 자전거의 상태(State)
에 여러가지 속성이 있죠? 속도(mph)
, 패달(rpm)
, 기어(5th)
처럼요.
그리고 브레이크 잡기
, 기어 바꾸기
, rpm 바꾸기
와 같은 행위(Method)
를 통해 각각의 상태를 변경할 수 있죠.
이렇게 자전거(객체)의 상태에 속성을 부여하고, 메소드를 제공하면,
이 객체를 현실 세계에서도 사용할 수 있도록 컨트롤 할 수 있는 상태가 되죠?
예를 들어서, 자전거의 기어가 1~6단까지만 조절 된다면,
Change gears 메소드로 1보다 작거나 6보다 큰 값으로 기어를 조절해보려고 해도, 조절 할 수 없을 거예요.
이렇게 자전거라는 하나의 독립된 객체는 안에 들어 있는 상태를 통해 속성을 정의하고,
메소드를 통해 다양한 기능이 노출됩니다.
이렇게 하나의 객체 안에 각각의 상태와 메소드가 번들처럼 들어있는 소프트웨어는 다음과 같은 장점이 있어요.
1️⃣ 모듈화(Modularity):
모듈식 주택(조립식 주택)을 생각하면 쉬운 개념인데요
조립식 주택은 기본 골조에 방이나 거실 모듈을 붙여 공간을 확장해 나갈 수 있습니다.
거실 모듈 옆에 방 모듈을 추가로 붙여도, 거실 모듈의 인테리어나 구조에는 영향을 주지 않죠?
모듈화된 공간을 외부에서 통째로 붙이는 것이니까요.
마찬가지로 방 모듈의 도배를 새로하고 장판을 새로 깔아도 거실 모듈에는 아무런 영향을 주지 않습니다.
이렇게 서로의 상태나 기능이 서로에게 영향을 미치지 않는 것이죠.
소프트웨어에서는 객체들이 하나의 소프트웨어를 구성하는 요소(모듈)로 존재하면서,
각자의 독립성이 유지되는 것을 ‘모듈화 되어있다’라고 합니다.
모듈화 되어있는 객체들은 각 객체마다 독립적으로 코드를 작성하고, 유지보수 할 수 있어요!
2️⃣ 정보 은닉(Information-Hiding):
객체의 메소드하고만 상호작용함으로써 객체 내부에 구현되어 있는 세부 사항은 외부로부터 숨겨놓습니다.
예를 들어, 스마트폰을 구매한 사람은 목적을 달성하기 위한 기능만 사용할 수 있으면 되요.
전화걸기, 어플 다운받기, 카톡하기와 같은 것들 말이죠.
하지만 전화를 거는 행위(메소드)가 어떤 시스템 경로를 통해 실행되는지,
어떤 코드로 구현되어 있는지와 같은 상세한 정보는 사용자가 알 필요가 없어요.
우리는 전화만 걸면 되니깐요!
3️⃣코드 재사용(Code Re-use):
한 번 만들어 놓은 객체는 프로그램 안에서 재사용할 수 있어요.
어떠한 개발자가 작업별 객체를 구현/테스트/디버그 해 놓으면,
다른 개발자들은 이것을 자신의 코드에서 재사용할 수 있는거죠.
4️⃣플러그와 디버깅 용이성(Pluggability and debugging ease):
플러그를 꽂고, 빼는 것 처럼 특정 객체에 문제가 생겼을 경우, 그 객체를 빼고, 다른 객체를 끼울 수 있어요.
레고를 조립할 때 특정 블럭이 잘 맞지 않으면 레고 전체를 부수고 다시 조립하지 않고,
문제가 되는 부분에 잘 맞는 다른 블럭을 찾아 바꾸어 끼지요?
객체지향 프로그래밍에서도 마찬가지입니다.
문제가 되는 객체를 빼고, 다른 객체로 바꾸어 끼워 넣습니다.
프로그램 전체를 갈아 엎는 것이 아니구요!