프로그래밍 방식
→ 객체 지향과 절차 지향은 대치 되는 이론이 아니다.
→ 객체 지향 프로그램일지라도 절차는 중요하다.
→ 어디에 초점이 집중 되어있는지 나눈다.
- 절차 지향 방식 프로그래밍
- 이름 그래도 실행 순서를 중요하게 하는 방식
- 프로그램의 흐름을 순차적으로 따르며 처리하는 방식
- 객체 지향 방식 프로그래밍
- 이름 그대로 객체를 지향하는 방식
- 실제 세계의 사물이나 사건을 객체로 보고, 객체들 간의 상호 작용을 중심으로 프로그래밍 하는 방식 → 즉 “무엇” 을 중심으로 프로그래밍 한다.
- 차이점 → 절차 지향 방식은 데이터에 대한 처리 방식이 분리 되어 있지만 객체 지향 방식에서는 데이터와 그 데이터의 처리 방식이 하나의 객체 안에 포함되어 있다.
절차 지향 프로그램을 → 순차적으로 개선 하기
- 다음은 절차 지향 프로그래밍으로 코드를 짠 것이다. 🔽
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("음악 플레이어를 종료 합니다.");
}
}
- 순서대로 코드가 실행 되었다.
음악 플레이어를 시작합니다.
음악 플레이어 볼륨 : 1
음악 플레이어 볼륨 : 2
음악 플레이어 볼륨 : 1
음악 플레이어 상태 확인
음악 플레이어 ON, 볼륨 : 1
음악 플레이어를 종료 합니다.
// 코드를 짠 대로 위에서부터 순서대로 코드를 실행 한 것이다.
- 절차 지향 프로그램 → 클래스 묶기
public class MusicPlayerData {
int volume = 0;
boolean isOn = false;
}
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("음악 플레이어를 종료 합니다.");
}
}
이런식으로 볼륨과 상태를 하나의 클래스로 묶어 관리하기때문에 관리가 쉬워진다.
- 절차 지향 프로그램 → 메서드 추출
// 뮤직플레이어2 에서 선언한 클래스를 동일하게 사용한다.
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("음악 플레이어를 시작합니다.");
}
static void off(MusicPlayerData data) {
data.isOn = false;
System.out.println("음악 플레이어를 종료 합니다.");
}
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 에 담겨있고
- 음악 플레이어의 기능은 MusicPlayerMain3 에 나뉘어 담겨있다.
- MusicPlayerData 의 맴버 변수의 변수 명이나 타입이 변경되면 MusicPlayerMain3 내부의 메서드도 함께 변경이 되어야 한다.
- 이런식으로 데이터와 기능이 분리되어있으면 관리포인트가 2곳으로 나뉘어 있게 된다.
객체 지향 프로그래밍
→ 속성과 기능이 한 곳에 정의됨
- 클래스와 메서드
- 해당 코드는 데이터인 value 와 데이터를 사용하는 기능인 add() 메서드를 함께 정의 했다.
public class ValueData { int value; void add() { value++; System.out.println("숫자 증가 value = " + value); } } // 이런 코드를 객체 지향 프로그래밍이라고 할 수 있다. // 속성과 기능이 한 곳에 정의 된것
- 참고 → 메서드는 원래 객체를 생성해야 호출 할 수 있다. 하지만 static 이 붙으면 객체 생성 없이 메서드 호출이 가능하다. (나중에 설명 예정)
이렇게 클래스 내부의 메서드도 호출 할 수 있다.public class ValueObjectMain { public static void main(String[] args) { ValueData valueData = new ValueData(); valueData.add(); valueData.add(); valueData.add(); System.out.println("최종 숫자 = " + valueData.value); } }
- 정리
- 클래스 속성 (데이터, 멤버 변수)과 기능(메서드)을 정의할 수 있다.
- 객체는 자신의 메서드를 통해 멤버 변수에 접근할 수 있다.
- 객체 지향 프로그래밍
- 위에서 만든 음악 플레이어를 활용할 것 인데
- 지금은 음악 플레이어 라는 개념을 중요하게 생각하고 객체 지향적으로 프로그램을 작성할 예정이다.
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"); } } } // 온전한 음악 플레이어에 필요한 속성과 기능을 작성 하였다.
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의 데이터 (변수) 가 무었이 들어있는지 신경 쓰지 않고 단순하게 기능만 호출해서 사용할 수 있게 된다.
- 속성과 기능이 마치 하나로 뭉쳐있는 것을 캡슐화 라고 한다.
'자바 공부 > [ 完 ] 자바 실전 - 기본편' 카테고리의 다른 글
6. 접근 제어자 (0) | 2024.03.07 |
---|---|
5. 패키지 (0) | 2024.03.06 |
4. 생성자 (0) | 2024.03.06 |
2. 기본형과 참조형 (0) | 2024.03.01 |
1. 클래스와 데이터 (0) | 2024.02.28 |