[김영한_자바기본][3. 객체 지향 프로그래밍] (보충) 객체 지향 메서드 이해 (p.8-9, p.12)
▶ 클래스와 메서드 이해 : 객체 지향 / 절차 지향 차이 이해
https://zoooom-in.tistory.com/51
[김영한_자바기본][3. 객체 지향 프로그래밍] 클래스와 메서드 / (복습) 객체 이해(p.8-11)
두 코드 모두 원본 클래스 내의 데이터 값을 참조하는 특징이 있다. 따라서 클래스의 내부 상태가 메서드에 의해 변경되며, 이 변경은 메서드를 호출한 외부에서도 반영된다. 이런식으로 객체의
zoooom-in.tistory.com
절차 지향은 데이터/기능이 분리되며, 메서드는 객체를 전달받아 해당 객체의 필드를 증가시킨다.
객체 지향은 데이터/기능이 한 공간에 함께 있으며, 메서드를 통해 내부 상태를 '직접 참조하여' 조작한다.
1. 절차 지향
[p.8 / ValueData]
public class ValueData {
int value;
}
[p.8 / ValueDataMain] 절차 지향 : 객체를 전달받아서 메서드를 통해 객체를 증가시킨다.
public class ValueDataMain {
public static void main(String[] args) {
ValueData valueData = new ValueData();
add(valueData);
add(valueData);
add(valueData);
System.out.println("최종 숫자 = " + valueData.value);
}
static void add(ValueData valueData) {
valueData.value++;
System.out.println("숫자 증가 value = " + valueData.value);
}
}
- 데이터와 기능이 개별적으로 분리되어 있다.
- 메서드 `add`가 `ValueData` 객체를 받아서 해당 객체의 `value` 필드를 증가시킨다.
> 이때 메서드는 객체의 참조를 통해 객체 데이터에 접근한다.
2. 객체 지향
[p.9 / ValueObject] 객체 지향 : 메서드를 통해 내부 상태를 조작한다.
public class ValueObject {
int value;
void add() {//절차지향과 동일하게 참조하여 증가시키지만, 외부 위치를 통해 따로 접근할 필요가 없음
//즉 실제로는 참조해서 값을 증가시키는 구조이나 코드는 직접 값을 증가시키는 것처럼 보임
value++;
System.out.println("숫자 증가 value = " + value);
}
}
- 데이터와 기능이 한 공간에 같이 있다.
- `ValueObject` 클래스의 `add` 메서드는 객체 내의 `value` 필드를 증가시킨다.
> 이때 외부적으로 따로 접근할 필요가 없다.
> 메서드 내에서 `value` 필드에 직접 접근하여 값을 증가시키기 때문이다.
[p.8 / ValueDataMain] 객체 지향 : 메서드가 클래스의 멤버 변수를 직접 접근하여 내부 상태를 조작한다.
public class ValueObjectMain {
public static void main(String[] args) {
ValueObject data = new ValueObject();
data.add(); //기능
data.add();
data.add();
System.out.println("Value objcet value = " + data.value); //실제데이터
}
}
- 클래스 내부의 메서드는 보통 멤버 변수에 자체적으로 접근하여 조작한다.
- 클래스 내부의 메서드는 자체적으로 멤버 변수에 접근하여 조작하지만,
외부에서는 객체를 통해 해당 메서드를 호출하여 객체의 내부 상태를 변경하는 것이 보통의 사용 방식이다.
*객체 지향 도식화 : 참조값 이해 (묶음으로 본다)
클래스 내부 메서드에는 'static'키워드를 사용하지 않는다.
메서드는 객체를 생성해야 호출할 수 있다.
그러나 static이 있을 경우 객체를 생성하지 않고도 메서드를 사용할 수 있다.
3. 실제 객체 지향 코드 작성해보기
[p.12 / MusicPlayer] 객체 지향, 내부 데이터 활용
public class MusicPlayer {
boolean isOn;
int volume;
void turnOn() { //호출자를 받을 필요가 없어짐, 내 내부 데이터로 활용 가능
isOn = true;
System.out.println("음악 플레이어를 시작합니다.");
}
void turnOff() {
isOn = false;
System.out.println("음악 플레이어를 종료합니다.");
}
void volumeUp() {
volume++;
System.out.println("음악 플레이어 볼륨 : " + volume);
}
void volumeDown() {
volume--;
System.out.println("음악 플레이어 볼륨 : " + volume);
}
void checkStatus() {
System.out.println("음악 플레이어 상태 확인");
if (isOn) {
System.out.println("음악 플레이어 On, 볼륨 : " + volume);
} else {
System.out.println("음악 플에이어 OFF");
}
}
}
- 호출자를 받을 필요 없이 내부 데이터를 활용하기 때문에 매개 변수를 작성하지 않았다.
[p.12 / MusicPlayerMain4] 객체 참조값을 통해 클래스 자체 기능 사용
public static void main(String[] args) {
MusicPlayer digit = new MusicPlayer();
digit.turnOn();
digit.volumeUp();
digit.volumeUp();
digit.volumeDown();
digit.checkStatus();
digit.turnOff();
}
▶ 매서드 타입(void / int / boolean) 사용 복습
https://zoooom-in.tistory.com/52
[김영한_자바기본][3. 객체 지향 프로그래밍] 매서드 보충
`void`를 사용하는 경우는 메소드가 값을 반환하지 않고, 단순한 정보전달 작업을 수행할 때 사용한다. '다른 타입'을 사용하는 경우는 메소드가 어떤 값을 계산하거나 반환하여 호출자에게 제공
zoooom-in.tistory.com