
데이터와 기능을 하나로 묶어서 음악 플레이어라는 개념을 온전히 하나의 클래스에 담아보자. 음악 플레이어라는 개념을 객체로 온전히 만드는 것이 중요하다.
그러기 위해서는 프로그램의 실행 순서 보다는 음악 플레이어 클래스를 만드는 것 자체에 집중해야 한다. 음악 플레이어가 어떤 속성(데이터)을 가지고 어떤 기능(메서드)을 제공하는지 이 부분에 초점을 맞추어야 한다.
음악 플레이어
volume, isOnon(), off(), volumeUp(), volumeDown(), showStatus()package oop1;
public class MusicPlayer {
int volume = 0;
boolean isOn = false;
void on() {
isOn = true;
System.out.println("음악 플레이어를 시작합니다.");
}
void off() {
isOn = false;
System.out.println("음악 플레이어를 종료합니다.");
}
void volumeUp() {
volume++;
System.out.println("음악 플레이어 볼륨: " + volume);
}
void volumeDown() {
volume--;
System.out.println("음악 플레이어 볼륨: " + volume);
}
void showStatus() {
System.out.println("음악 플레이어 상태 확인");
if (isOn) {
System.out.println("음악 플레이어 ON, 볼륨: " + volume);
} else {
System.out.println("음악 플레이어 OFF");
}
}
}
MusicPlayer 클래스에 음악 플레이어에 필요한 속성과 기능을 모두 정의했다. 이제 음악 플레이어가 필요한 곳에서 이 클래스만 있으면 온전한 음악 플레이어를 생성해서 사용할 수 있다.
package oop1;
/**
* 객체 지향
*/
public class MusicPlayerMain4 {
public static void main(String[] args) {
MusicPlayer player = new MusicPlayer();
// 음악 플레이어 켜기
player.on();;
// 볼륨 증가
player.volumeUp();
// 볼륨 증가
player.volumeUp();
// 볼륨 감소
player.volumeDown();
// 음악 플레이어 상태
player.showStatus();
// 음악 플레이어 끄기
player.off();
}
}

MusicPlayer를 사용하는 코드를 보자. MusicPlayer 객체를 생성하고 필요한 기능(메서드)을 호출하기만 하면 된다.
MusicPlayer를 사용하는 입장에서는 MusicPlayer의 데이터인 volume, isOn 같은 데이터는 전혀 사용하지 않는다.MusicPlayer를 사용하는 입장에서는 이제 MusicPlayer 내부에 어떤 속성(데이터)이 있는지 전혀 몰라도 된다. MusicPlayer를 사용하는 입장에서는 단순하게 MusicPlayer가 제공하는 기능 중에 필요한 기능을 호출해서 사용하기만 하면 된다.MusicPlayer를 보면 음악 플레이어를 구성하기 위한 속성과 기능이 마치 하나의 캡슐에 쌓여있는 것 같다. 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것을 캡슐화라 한다.
객체 지향 프로그래밍을 사용한 후 코드가 더 읽기 쉬운 것은 물론이고, 속성과 기능이 한 곳에 있기 때문에 변경도 더 쉬워졌다.
예를 들어서MusicPlayer내부 코드가 변하는 경우에 다른 코드는 변경하지 않아도 된다.MusicPlayer의volume이라는 필드 이름이 다른 이름으로 변한다고 할 때MusicPlayer내부만 변경하면 된다. 이 경우MusicPlayer를 사용하는 개발자는 코드를 전혀 변경하지 않아도 된다.
물론 외부에서 호출하는MusicPlayer의 메서드 이름을 변경한다면MusicPlayer를 사용하는 곳의 코드도 변경해야 한다.