본문 바로가기

유튜브 스크립트/JAVA

[JAVA | 영상스크립트 | 백문이 불여일타!!] 참조형

1. 문제 설명

앞서 만들었던 다음 클래스에 있는 "상품 주문 시스템"을 리팩토링 하자.

이 코드는 클래스와 배열을 사용하긴 했지만 주문정보, 출력, 총액 메서드가 분리 되어 있지 않아서 정보의 구분이 어렵고 반복되는 구조를 갖고 있다.

public class RefactoringQ {
    public static void main(String[] args) {
        ProductOrder[] orders = new ProductOrder[3];

        ProductOrder order1 = new ProductOrder();
        order1.productName = "두부";
        order1.price = 3000;
        order1.quantity = 2;
        orders[0] = order1;

        ProductOrder order2 = new ProductOrder();
        order2.productName = "김치";
        order2.price = 8000;
        order2.quantity = 1;
        orders[1] = order2;

        ProductOrder order3 = new ProductOrder();
        order3.productName = "콜라";
        order3.price = 1000;
        order3.quantity = 3;
        orders[2] = order3;

        int totalAmount = 0;
        for(ProductOrder o : orders){

            System.out.println("상품명: " + o.productName + ", 가격: " + o.price + ", 수량: " + o.quantity);
            totalAmount += o.price * o.quantity;
        }
        System.out.println("총 결제 금액:" + totalAmount);

    }
}

2. 요구 사항

public class RefactoringA {
     public static void main(String[] args) {
	// 여러 상품의 주문 정보를 담는 배열 생성
	// createOrder()를 여러번 사용해서 상품 주문 정보들을 생성하고 배열에 저장 
	// printOrders()를 사용해서 상품 주문 정보 출력
	// getTotalAmount()를 사용해서 총 결제 금액 계산
	// 총 결제 금액 출력
	} 
}​

출력예시

상품명: 두부, 가격: 3000, 수량: 2
상품명: 김치, 가격: 8000, 수량: 1
상품명: 콜라, 가격: 1000, 수량: 3
총 결제 금액:17000

 

  • static ProductOrder createOrder(String productName, int price, int quantity) 
    ProductOrder를 생성하고 매개변수로 초기값을 설정. 마지막으로 생성한 ProductOrder를 반환
  • static void printOrders(ProductOrder[] orders)

    배열을 받아서 배열에 들어있는 전체 ProductOrder의 상품명, 가격, 수량을 출력

  • static int getTotalAmount(ProductOrder[] orders)

    배열을 받아서 배열에 들어있는 전체 ProductOrder의 총 결제 금액을 계산하고, 계산 결과를 반환

 3. 문제 해결

public class RefactoringA {

    public static void main(String[] args) {
        ProductOrder[] orders = new ProductOrder[3];

        orders[0] = createOrder("두부" , 3000, 2);
        orders[1] = createOrder("김치" , 8000, 1);
        orders[2]= createOrder("콜라" , 1000, 3);

        printOrders(orders);
        int totalAmount = getTotalAmount(orders);
        System.out.println("총 결제 금액:" + totalAmount);
    }

    static ProductOrder createOrder(String productName, int price, int quantity) {
        ProductOrder order = new ProductOrder();
        order.productName = productName;
        order.price = price;
        order.quantity = quantity;
        return order;
    }

    static void printOrders(ProductOrder[] orders) {
        for (ProductOrder o : orders) {
            System.out.println("상품명: " + o.productName + ", 가격: " + o.price + ", 수량: " + o.quantity);
        }
    }

    static int getTotalAmount(ProductOrder[] orders){
        int totalAmount = 0;
        for (ProductOrder o : orders) {
            totalAmount += o.price* o.quantity;
        }
        return totalAmount;
    }
}

 

4. 스크립트

이 코드는 클래스를 사용하여 데이터를 배열로 분류해 놓았지만 이름, 가격, 수량을 변수로 하는 데이터가 반복

중복을 나누어 공부해보자 

 

기본형: 메서드로 기본형 데이터를 전달하면, 해당 값이 복사되어 전달된다. 이 경우, 메서드 내부에서 매개변수 (파라미터)의 값을 변경해도, 호출자의 변수 값에는 영향이 없다.
참조형: 메서드로 참조형 데이터를 전달하면, 참조값이 복사되어 전달된다. 이 경우, 메서드 내부에서 매개변수(파 라미터)로 전달된 객체의 멤버 변수를 변경하면, 호출자의 객체도 변경된다.

 

중복되는 2가지 부분중 첫번째 중복 : 값 할당의 반복

createOrder()를 만들어서 메서드 호출시 매개변수로 초기값 설정 void로 반환값 없음

 

참조형의 경우 밖에서 인스턴스를 생성하고 메서드안에서 매개변수를 할당하여 값을 반환하지 않아도 객체와 메서드가 같은 참조값을 바라보고 있기 때문에  객체가 생성되면서 초기화가 되는 것을 볼수 있다.

 

두번째 중복 : 객체생성과 초기값 설정부분의 반복

createOrder()메서드에 객체를 생성하는 부분도 메서드안에 함께 포함했다. 이제 이 메서드 하나로 객체의 생성과 초기값 설정을 모두 처리한다.
그런데 메서드 안에서 객체를 생성했기 때문에 만들어진 객체를 메서드 밖에서 사용할 수 있게 돌려주어야 한다. 그래야 메서드 밖에서 이 객체를 사용할 수 있다. 메서드는 호출 결과를 반환(return)

 

출력메서드와 총액메서드

출력메서드는 배열을 매개변수로 받아 반환타입이 없는 형태

총액메서드는 총액을 초기화하고 Int를 반환하는 형태