본 게시글은 김영한 강사님의 [김영한의 실전 자바 - 기본편]을 수강하며 작성한 글입니다.
01. 절차 지향 프로그래밍
프로그래밍 방식은 크게 절차 지향 프로그래밍과 객체 지향 프로그래밍으로 나눌 수 있다.
절차 지향 프로그래밍
- 실행 순서를 중요하게 생각하는 방식이다. 따라서 절차를 지향한다.
- 프로그램의 흐름을 순차적으로 따르며 처리하는 방식이다. 즉, “어떻게”를 중심으로 프로그래밍 한다.
객체 지향 프로그래밍
- 객체를 중요하게 생각하는 방식이다. 따라서 객체를 지향한다.
- 실제 세계의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그래밍하는 방식이다. 즉, “무엇을”을 중심으로 프로그래밍 한다.
둘의 중요한 차이
절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있다. 반면, 객체 지향에서는 데이터와 그 데이터에 대한 행동이 하나의 객체 안에 포함되어 있다.
MusicPlayerData
package oop1;
public class MusicPlayerData {
int volume = 0;
boolean isOn = false;
}
MusicPlayerMain3
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("음악 플레이어를 시작합니다");
}
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곳이 된다.
하지만 객체 지향 프로그래밍을 통해 데이터와 기능을 온전히 하나로 묶어서 사용할 수 있다.
02. 클래스와 메서드
클래스는 속성(데이터)과 기능(메서드)을 함께 포함할 수 있다.
인스턴스의 메서드 호출
인스턴스의 메서드를 호출하는 방법은 멤버 변수를 사용하는 방법과 동일하다.
.
(dot)을 찍어서 객체에 접근한 다음 원하는 메서드를 호출하면 된다.
valueObject.add(); // 1
x002.add(); // 2: x002 ValueObject 인스턴스에 있는 add() 메서드를 호출
- 3: add() 메서드를 호출하면 메서드 내부에서 value++을 호출하게 된다. 이때 value에 접근할 때 기본적으로 본인 인스턴스에 있는 멤버 변수에 접근한다. 따라서 x002.value에 접근한다.
- 4: ++ 연산으로 value의 값을 1 증가시킨다.
03. 객체 지향 프로그래밍
- 음악 플레이어
- 속성: volume, isOn
- 기능: on(), off(), volumeUp(), volumeDown(), showStatus()
MusicPlayer
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");
}
}
}
MusicPlayerMain4
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의 데이터인 volume, isOn과 같은 데이터는 전혀 사용하지 않는다.
- MusicPlayer 내부에 어떤 속성(데이터)이 있는지 전혀 몰라도 된다.
- 단순하게 MusicPlayer가 제공하는 기능 중에 필요한 기능을 호출해서 사용하기만 하면 된다.
캡슐화
속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것을 캡슐화라 한다.
속성과 기능이 한 곳에 있기 때문에 변경도 더 쉬워진다. MusicPlayer 내부 코드가 변하는 경우에 다른 코드는 변경하지 않아도 된다.
- volume이라는 필드 이름이 바뀔 때 MusicPlayer 내부만 변경하면 된다.
- 음악 플레이어가 내부에서 출력하는 메시지를 변경할 때도 MusicPlayer 내부만 변경하면 된다.
'Courses > Java' 카테고리의 다른 글
[김영한의 실전 자바 - 기본편] 2. 기본형과 참조형 (0) | 2024.04.29 |
---|---|
[김영한의 실전 자바 - 기본편] 1. 클래스와 데이터 (0) | 2024.03.21 |