국비 수업 9일차

김성수·2022년 10월 31일
0
post-thumbnail

객체지향 프로그램의 개념

oop : Object Oriented Programming
  • 프로그램 내의 모든 사물, 개념, 요소를 객체(object)로 규정하고, 객체와 객체의 상호작용에 의해 프로그램이 진행되는 방식으로 작성

  • 1) 내 프로그램의 주제가 무엇인가?

  • 2) 프로그램이 다루어야 할 데이터의 자료형은 어떤 것인가?
    - 기본 데이터 자료형을 정의하기 위한 클래스 (속성 중심의 클래스) (VO, DTO)

  • 3) 프로그램이 갖추어야 할 기능에는 어떤 것들이 있는가?
    - 프로그램이 가져야 할 기능을 모아둔 클래스 (기능 중심의 클래스) (DAO)

1. 사용자 입력을 받을 메인페이지

내부 구조를 살펴보면 이 페이지에서는 사용자 입력 받고, 처리하고 싶은 메뉴 결과에 따라 컨트롤러에 작성한 함수의 실행을 구현한다

package chicken;

import java.util.Scanner;

public class Main {
	
	// main 함수 안에 있던 지역변수를 Main 클래스의 멤버 필드로 변경
	static Handler handler = new Handler();
	
	public static void main(String[] args) {
		// 사용자와 입출력으로 상호작용하면서 프로그램을 진행하는 코드
		
		int menu;
		Scanner sc = new Scanner(System.in);
		int result = 0;
		
		do {
			System.out.println("1. 메뉴 추가");
			System.out.println("2. 메뉴 목록");
			System.out.println("0. 종료");
			System.out.print("선택 >>> ");
			menu = Integer.parseInt(sc.nextLine());
			
			switch(menu) {
			case 1:
				Chicken ob = input(sc);
				result = handler.insert(ob);
				System.out.println(result == 1 ? "추가 성공" : "추가 실패");
				break;
			case 2:
				handler.show();
				break;
			}
			
		} while(menu != 0);
		System.out.println("=== 프로그램 종료 ===");
		sc.close();
	}	// end of main
	
	static Chicken input(Scanner sc) {
		String brand, store, menu;
		int price;
		double starPoint;
		
		System.out.print("브랜드 : ");	brand = sc.nextLine();
		System.out.print("점포명 : ");	store = sc.nextLine();
		System.out.print("메뉴 이름 : ");	menu = sc.nextLine();
		System.out.print("가격 : ");		price = Integer.parseInt(sc.nextLine());
		System.out.print("별점 : ");		starPoint = Double.parseDouble(sc.nextLine());
		
		Chicken ob = new Chicken(brand, store, menu, price, starPoint);
		return ob;
	}

}

2. 원하는 작업을 처리할 Handler(작업) 페이지

main에서 입력을 받은 매개변수로 프로그램의 모든 작업처리는 이곳에서 수행한다

package chicken;

public class Handler {	// 데이터를 제어하고, 기능을 포함하는 클래스
	
	// 여러 데이터를 저장하기 위한 배열
	Chicken[] arr = new Chicken[10];
	
	// Chicken 타입의 객체를 전달받아서 배열의 빈 칸에 저장하는 기능(메서드)
	int insert(Chicken ob) {
		// data 배열에서 빈칸(null)을 찾아서, 추가하고 반복 종료
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] == null) {
				arr[i] = ob;
				return 1;	// 1개가 추가되었습니다
			}
		}
		return 0;	// 0개가 추가되었습니다 (빈칸이 없으면 추가할 수 없음)
	}
	
	// data 배열의 데이터 중 빈칸이 아닌것만 화면에 출력하기
	void show() {
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] != null) {
				arr[i].show();
			}
		}
	}

}

3. 데이터를 생성하고 보관을 하는 VO, DTO 페이지

객체의 데이터를 보관하는 페이지

package chicken;
/*
 * 		배달 앱에서 주문 가능한 치킨 메뉴의 목록을 하나의 객체로 구성하고 싶다
 * 		무슨 속성이 필요할까?
 * 
 * 		브랜드, 매장(ㅇㅇ점), 메뉴이름, 가격, 별점
 * 		속성이 정리되면, 클래스의 멤버 필드로 구성하면 된다 
 * 
 * 		속성 중심의 객체를 표현할 클래스를 작성할 때
 * 		여러 객체를 생각하면서 구성하지 않고, 
 * 		단일 객체를 기반으로 생각하면서 구성한다
 */
public class Chicken {
	// 클래스의 멤버 필드는 초기값을 지정하지 않아도, 0에 맞는 값으로 초기화된다
	String brand;
	String store;
	String menu;
	int price;
	double starPoint;
	
	// 객체를 생성할 때, 필요한 초기 작업(필드 초기화)을 수행할 생성자를 작성한다
	// 정의된 생성자를 통하지 않고서는, 객체를 생성할 수 없다 !!
	Chicken(String brand, String store, String menu, int price, double starPoint) {
		// this는 생성된 객체 자기자신을 가리키는 0번째 매개변수이다
		this.brand = brand;
		this.store = store;
		this.menu = menu;
		this.price = price;
		this.starPoint = starPoint;
	}
	
	// 속성이 정리되면 관련된 함수를 메서드로 작성한다
	void show() {
		String form = "%s %s) %s\t%,d원 (☆%.1f)";	// 서식만 지정
		form = String.format(form, brand, store, menu, price, starPoint);	// 값 넣기
		System.out.println(form);	// 출력
	}
}
profile
다들 잘하는데 나만 못해?

0개의 댓글