프로그래밍 방식의 종류
절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분히되어 있다.
객체 지향에서는 데이터와 그 데이터에 대한 행봉(메스더)이 하나의 '객체' 안에 포함되어 있다.
package ref.ex;
import java.util.Scanner;
public class ProductOrderMain3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("주문 개수 입력 : ");
int n = scanner.nextInt();
scanner.nextLine();
ProductOrder[] orders = new ProductOrder[n];
for (int i = 0; i < orders.length; i++) {
System.out.println((i + 1) + " 번째 주문 정보를 입력하세요. ");
System.out.print("name : ");
String productName = scanner.nextLine();
System.out.println("price : ");
int price = scanner.nextInt();
System.out.println("quantity : ");
int quantity = scanner.nextInt();
scanner.nextLine();
orders[i] = createOrder(productName, price, quantity);
}
printOrders(orders);
int totalAmount = getTotalAmount(orders);
System.out.println("Total : " + totalAmount);
}
static ProductOrder createOrder(String productName, int price, int quantity) {
ProductOrder order1 = new ProductOrder();
order1.productName = productName;
order1.price = price;
order1.quantity = quantity;
return order1;
}
static void printOrders(ProductOrder[] orders) {
for(ProductOrder order : orders) {
System.out.println("name " + order.productName + ", price : " + order.price + ", quantity : " + order.quantity);
}
}
static int getTotalAmount(ProductOrder[] orders) {
int totalAmount = 0;
for (ProductOrder order : orders) {
totalAmount += order.price * order.quantity;
}
return totalAmount;
}
}
package oop1;
public class MusicPlayerMain2 {
public static void main(String[] args) {
MusicPlayerData data = new MusicPlayerData();
//player on
data.isOn = true;
System.out.println("player start");
//volume ++
data.volume++;
System.out.println("player vol : " + data.volume);
//volume ++
data.volume++;
System.out.println("player vol : " + data.volume);
//volume --;
data.volume--;
System.out.println("player vol : " + data.volume);
//player status
System.out.println("status");
if (data.isOn) {
System.out.println("player on, vol : " + data.volume);
} else {
System.out.println("player off");
}
data.isOn = false;
System.out.println("player off");
}
코드에서 중복되는 부분들,
재사용 되는 부분들 파악
package oop1;
public class MusicPlayerMain3 {
public static void main(String[] args) {
MusicPlayerData data = new MusicPlayerData();
//player on
on(data);
//volume ++
volumeUp(data);
//volume ++
volumeUp(data);
//volume --;
volumeDown(data);
//player status
showStatus(data);
//off player
off(data);
}
static void on(MusicPlayerData data) {
data.isOn = true;
System.out.println("player start");
}
static void off(MusicPlayerData data) {
data.isOn = false;
System.out.println("player off");
}
static void volumeUp(MusicPlayerData data) {
data.volume++;
System.out.println("volume : " + data.volume);
}
static void volumeDown(MusicPlayerData data) {
data.volume--;
System.out.println("volume : " + data.volume);
}
static void showStatus(MusicPlayerData data) {
System.out.println("player status");
if (data.isOn) {
System.out.println("player on, volume : " + data.volume);
} else {
System.out.println("player off");
}
}
}
데이터와 기능이 분리되어 있다는 점이다.
플레이어의 데이터는 MusicPlayerData에 있는데, 그 데이터를 사용하는 기능은 MusicPlayerMain3에 있는 각각의 메서드에 분리ㅗ디어 있다. 그래서 데이터는 MusicPlayerData를 사용하고, 플레이어 관련된 기능은 MusicPlayerMain3의 메서드를 사용해야 한다.
이후 데이터가 변경 되면 MusicPlayerMain3의 메서드들도 함께 변경해야 한다. 데이터와 기능이 분리되어 있으면 유지보수 관점에서도 관리 포인트가 두 곳으로 늘어난다.
객체 지향 프로그래은 데이터와 기능을 온전히 하나로 묶어서 사용할 수 있다
클래스는 데이터인 멤버 변수 뿐 아니라 기능 역할을 하는 메서드도 포함할 수 있다.
package oop1;
public class valueData {
int value;
}
package oop1;
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);
}
}
위 코드를 보면 value와 value를 증가시키는 add() 메서드가 서로 분리되어 있다.
자바와 같은 객체지향언어는 클래스 내부에 속성(데이터)과 기능(메서드)을 함께 포함할 수 있다. 클래스 내부에 멤버 변수 뿐만 아니라 메서드도 함께 포함할 수 있다는 듯이다.
package oop1;
public class ValueObject {
int value;
void add() {
value++;
System.out.println("숫자 증가 value = " + value);
}
}
c.f
void add()에 static 을 사용하지 않은 이유static 이 붙으면 객체를 생성하지 않고도 메서드를 호출할 수 있다.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);
}
}
ValueObject valueObject = new ValueObject();

valueObject 라는 객체를 생성하면, 이 객체에는 멤버 변수 뿐만 아니라 내부에 기능을 수행하는 add() 메서드도 함께 존재한다.

인스턴스의 메서드를 호출하는 방법은 멤버 변수를 사용하는 방법과 동일. . (dot)을 찍어서 객체 접근한 다음에 원하는 메서드를 호출하면 된다.
valueObject.add(); //1
x002.add(); //2: x002 ValueObject 인스턴스에 있는 add() 메서드를 호출한다.
package oop1;
import org.w3c.dom.ls.LSOutput;
public class MusicPlayer {
int volume = 0;
boolean isOn = false;
void on() {
isOn = true;
System.out.println("player start");
}
void off() {
isOn = false;
System.out.println("player off");
}
void volumeUp() {
volume++;
System.out.println("volume : " + volume);
}
void volumeDown() {
volume--;
System.out.println("volume : " + volume);
}
void showStatus() {
System.out.println("player status : ");
if (isOn) {
System.out.println("player on, volume : " + volume);
} else {
System.out.println("player off");
}
}
}
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을 보면 속성과 기능이 하나의 캡슐에 쌓여있는 것 같다. 이렇게 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것을 캡슐화라고 한다.
package oop1.ex;
public class Rectangle {
int width;
int height;
int caculateArea() {
return width * height;
}
int calculatePerimeter() {
return 2 * (width + height);
}
boolean isSquare() {
return width == height;
}
}
package oop1.ex;
public class RectangleMain {
public static void main(String[] args) {
Rectangle rectangle = new Rectangle();
rectangle.width = 5;
rectangle.height = 8;
int area = rectangle.caculateArea();
System.out.println("area : " + area);
int perimeter = rectangle.calculatePerimeter();
System.out.println("perimeter : " + perimeter);
boolean square = rectangle.isSquare();
System.out.println("squere? : " + square);
}
}
package oop1.ex;
public class Account {
int balance;
void deposit(int amount) {
balance += amount;
}
void withdraw(int amount) {
if (balance >= amount) {
balance -= amount;
} else {
System.out.println("잔액 부족");
}
}
}
package oop1.ex;
public class AccountMain {
public static void main(String[] args) {
Account account = new Account();
account.deposit(10000);
account.withdraw(9000);
account.withdraw(2000);
System.out.println("잔고 : " + account.balance);
}
}