Java 객체 지향 프로그래밍 - 캡슐화
앞에서 개발한 음악 플레이어를 데이터와 기능을 분리되어 있었다. 데이터와 기능을 하나로 묶어 음악 플레이어 개념을 세워보도록 한다. 그리고 클래스 객체를 지향하는 방법에 대해 생각을 생각해보도록 한다.
프로그램의 실행 순서 보다는 음악 플레이어 클래스를 만드는 것에 집중을 갖고 속성(데이터)과 기능(메소드)을 제공해야하는지 초점을 맞춰야 한다. 이 방법이 어렵다면 음악 플레이어를 만드는 개발자와 그리고 음악 플레이어를 사용하는 개발자 입장이 되어 생각을 정리할 필요가 있다.
음악 플레이어 - 객체 지향
음악플레이어를 만들어본다. 음악 플레이어에는 다음과 같은 속성(데이터)와 기능(메소드)로 구성한다.
음악 플레이어 속성과 메소드
- 속성:
volume
,isOn
- 기능:
on()
,off()
,volumeUp()
,voulmeDown()
,showStatus()
이것을 가지고 음악 플레이어를 만들어본다.
객체 지향 음악 플레이어 - class
public static class MusicPlayerData {
private int volume;
private boolean isOn;
public void volumeUp() {
volume++;
System.out.println("음악 플레이어 볼륨: " + volume);
}
public void volumeDown() {
volume--;
System.out.println("음악 플레이어 볼륨: " + volume);
}
public void on() {
isOn = true;
System.out.println("음악 플레이어를 시작합니다.");
}
public void off() {
isOn = false;
System.out.println("음악 플레이어를 종료합니다.");
}
public void showStatus() {
if (isOn) {
System.out.println("음악 플레이어 상태: ON 볼륨: " + volume);
} else {
System.out.println("음악 플레이어 상태: OFF");
}
}
}
객체 지향 음악 플레이어 - main
public static void main(String[] args) {
MusicPlayerData data = new MusicPlayerData();
data.on();
data.volumeUp();
data.volumeUp();
data.volumeDown();
data.showStatus();
data.off();
}
출력 결과:
음악 플레이어를 시작합니다.
음악 플레이어 볼륨: 1
음악 플레이어 볼륨: 2
음악 플레이어 볼륨: 1
음악 플레이어 상태: ON 볼륨: 1
음악 플레이어를 종료합니다.
객체지향 방식으로 class 내부에 속성과 기능으로 이루어져 정상적으로 동작한다는 것을 볼 수 있다.
필요한 모든 것은 MusicPlayerData 안에 있어서 이 클래스를 가져다 사용하면 누구나 다 사용 가능하다.
- main 에서 개발하는 입장에서는 MusicPlayerData 데이터인 isOn, volume 를 사용하지 않는다.
- main 에서 개발하는 입장에서는 이제 MusicPlayerData 내부에는 어떤 속성이 있는지 몰라도 알아서 동작한다.
- main 에서 개발하는 입장에서는 MusicPlayerData 가 제공하는 기능 중 필요한 기능을 호출해서 사용하기만 해도 된다.
음악 플레이어처럼 객체 지향으로 만들어지면 캡슐화로 외부에서 호출해서 사용할 수 있다.
캡슐화
MusicPlayer 를 음악 플레이어를 구성하기 위해 MusicPlayerData 클래스를 구성하였다 . 이 클래스의 속성과 기능이 하나로 묶여 하나의 캡슐처럼 쌓이게 된 것이다. 이렇게 캡슐화된 클래스를 외부에서 필요한 기능을 제공하는 것은 캡슐화라고 한다.
음악 플레이어 객체를 사용하면 개발하는 입장에서는 마치 사용하는 것처럼 느껴진다. 친숙하고 코드 읽기가 수월하다. 속성과 기능이 한 곳에 있어 변경도 쉬워진다. MusicPlayerData의 속성 volume 이름 , 출력하는 메시지 기능을 변경 하여도 MusicPlayerData 클래스 내부만 변경해주어도 된다. 변경 한 후에는 main 에서 MusicPlayerData 클래스 사용한 개발자에게도 main 코드는 변경하지 않아도 잘 동작되는 모습을 확인할 수 있다.
단, 메소드 이름을 변경한 경우 main 코드에서도 변경해주어야 한다.