1. 절차 지향 프로그래밍
- 객체 지향 프로그래밍을 알기 위해 우선 절차 지향 프로그래밍을 알아야 할 필요가 있다.
- 절차 지향 프로그래밍은 실행 순서를 중요하게 생각하고 처리하는 방식이다.
package oop1;
public class MusicPlayerMain1 {
public static void main(String[] args) {
int volume = 0;
boolean isOn = false;
isOn = true;
System.out.println("음악 플레이어를 시작합니다.");
volume++;
System.out.println("음악 플레이어 볼륨:" + volume);
volume++;
System.out.println("음악 플레이어 볼륨:" + volume);
volume--;
System.out.println("음악 플레이어 볼륨:" + volume);
System.out.println("음악 플레이어 상태 확인");
if(isOn) {
System.out.println("음악 플레이어 ON, 볼륨:" + volume);
} else {
System.out.println("음악 플레이어 OFF");
}
isOn = false;
System.out.println("음악 플레이어를 종료합니다.");
}
}
- 메인 메서드에 정의된 전역변수들을 하나의 클래스의 멤버변수로 옮기고 싶다면 클래스를 따로 지정하고 사용자가 지정한 타입을 지정한다.
package oop1;
public class MusicPlayerMain2 {
public static void main(String[] args) {
MusicPlayerData data = new MusicPlayerData();
data.isOn = true;
System.out.println("음악 플레이어를 시작합니다.");
data.volume++;
System.out.println("음악 플레이어 볼륨:" + data.volume);
data.volume++;
System.out.println("음악 플레이어 볼륨:" + data.volume);
data.volume--;
System.out.println("음악 플레이어 볼륨:" + data.volume);
System.out.println("음악 플레이어 상태 확인");
if(data.isOn) {
System.out.println("음악 플레이어 ON, 볼륨:" + data.volume);
} else {
System.out.println("음악 플레이어 OFF");
}
data.isOn = false;
System.out.println("음악 플레이어를 종료합니다.");
}
}
- 객체를 생성하지 않고 static을 선언하여 메서드를 정의하였다.
package oop1;
public class MusicPlayerMain3 {
public static void main(String[] args) {
MusicPlayerData data = new MusicPlayerData();
on(data);
volumeUp(data);
volumeUp(data);
volumeDown(data);
showStatus(data);
off(data);
}
static void on(MusicPlayerData data) {
data.isOn = true;
System.out.println("음악 플레이어를 ON");
}
static void off(MusicPlayerData data) {
data.isOn = false;
System.out.println("음악 플레이어를 OFF");
}
static void volumeUp(MusicPlayerData data) {
data.volume++;
System.out.println("음악 플레이어 볼륨:" + data.volume);
}
static void volumeDown(MusicPlayerData data) {
data.volume--;
System.out.println("음악 플레이어 볼륨:" + data.volume);
}
static void showStatus(MusicPlayerData data) {
System.out.println("음악 플레이어 상태 확인");
if(data.isOn) {
System.out.println("음악 플레이어 ON, 볼륨:" + data.volume);
} else {
System.out.println("음악 플레이어 OFF");
}
}
}
- 이 코드들은 중복을 제거하고 변경 영향 범위 및 메서드 이름을 추가할 수 있지만 어디까지 절차 지향 프로그래밍이다.
- 위 코드들은 MusicPlayerData 기반으로 사용되기 때문에 데이터가 변경되면 메인 코드도 같이 변경해야 하기 때문에 유지보수 하기에 어렵다.
2. 클래스와 메서드
- 클래스는 속성과 기능을 정의할 수 있다.(변수, 메서드)
- 객체는 자신의 메서드를 통해 자신의 멤버 변수에 접근할 수 있다.
package oop1;
public class ValueObject {
int value;
void add() {
value++;
System.out.println("숫자 증가 value=" + value);
}
}
package oop1;
public class ValueObjectMain {
public static void main(String[] args) {
ValueObject valueObject = new ValueObject();
valueObject.add();
valueObject.add();
valueObject.add();
System.out.println("최종 숫자: " + valueObject.value);
}
}
3. 객체 지향 프로그래밍
- 객체 지향 프로그래밍에서는 하나의 클래스에 변수를 선언하고 메서드를 정의하면 메인 메서드에서 호출하면 된다.
package oop1;
public class MusicPlayerMain4 {
public static void main(String[] args) {
MusicPlayer play = new MusicPlayer();
play.on();
play.volumeUp();
play.volumeUp();
play.volumeDown();
play.showStatus();
play.off();
}
}
(1) 캡슐화
- MusicPlayer가 음악 플레이어를 구성하기 위한 속성과 기능이 하나로 합쳐져 있는 상태.
- 이러한 기능들을 묶어서 외부에 제공하는 것을 캡슐화라고 한다.