객체 지향이란 : OOP(Object Oriented Programming) 이란 말로, 프로그램내의 모든 사물, 개념 요소를 객체(object)로 규정하고 객체와 객체의 상호작용에 의해 프로그램이 진행되는 방식으로 작성함을 말한다.
이의 반대되는 개념으로 C언어의 절차지향프로그램 (procedure-oriented language)으로 단계를 중시한다고 이해하기 보다는, 프로그램의 함수에 초점이 되는 언어라고 볼 수 있다.
자바언어는 객체지향의언어이고, 이를 바탕으로 클래스를 구성하고, 구성된 클래스로 객체를 생성하여 다른 클래스들과 상호작용하여 필요한 코드를 수행할 수있게된다.
프로그래밍 단계에서는 아래의 순서로 생각하고 코드를 작성한다.
1) 내 프로그램의 주제가 무엇인가?
2) 프로그램이 다루어야 할 데이터의 자료형은 어떤 것인가?
- 기본 데이터 자료형을 정의하기 위한 클래스 (속성 중심의 클래스) (VO,DTO)
3) 프로그램이 갖추어야 할 기능에는 어떤 것들이 있는가?
- 프로그램이 가져야 할 기능을 모아둔 클래스 (기능 중심의 클래스) (DAO)
위의 내용을 토대로 프로그래밍 연습하기
배달앱에서 주문가능한 치킨 메뉴의 목록을 하나의 객체로 구성하기
브랜드, 매장(xx점), 메뉴이름, 가격, 별점을 확인하여 멤버필드로 선언
속성 중심의 객체를 표현할 클래스를 작성할때는 여러객체를 생각하면서 구성하지 않고, 단일 객체를 기반으로 생각하면서 구성한다.
먼저 패키지내에서 클래스를 만들어준다. 이때 만들 객체의 속성을 정의할 클래스는 main 함수를 호출하지 않고 만든다.
public class Chicken {
String brand;
String store;
String menu;
int price;
double starPoint;
// 클래스의 멤버 필드는 초기값을 지정하지 않아도, 0에 맞는 값으로 초기화된다
멤버필드 선언이 되면 생성자를 만든다. 생성자는 객체를 생성할 때, 필요한 초기작업(필드 초기화)을 수행한다. 정의된 생성자를 통하지 않고서는, 객체를 생성할 수 없다.
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);
}
동작함수가 만들어지고 나면 이제 생성된 클래스의 데이터를 제어하고, 기능을 다룰 클래스를 작성한다. 이름은 제어하는 클래스여서 handler로 지정
public class Handler {
Chicken[] arr = new Chicken[10];
치킨클래스로 만들어진 객체들을 저장할 배열
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개가 추가되었습니다 (빈칸이 없으면 추가할 수 없음)
}
앞으로 만들어진 메인 클래스에서 객체를 저장할 기능을 만들어준다. 반환형을 두고 1이 반환되면 정상수행, 0이 반환되면 실패로 알림
void show() {
for(int i = 0; i < arr.length; i++) {
if(arr[i] != null) {
arr[i].show();
}
}
}
저장된 객체들중 데이터가 있는 부분만 화면에 출력할 기능을 만든다.
Handler까지 완성이 되면 이제 main 클래스를 만들어준다.
public class Main {
static Handler handler = new Handler();
//main 함수 안에 있던 지역변수를 Main 클래스의 멤버 필드로 변경
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
먼저 콘솔창에서 진행할 번호를 입력 받아서 1 번 선택시 switch문의 1번이 실행이 되고, 2번 선택시 2번이 실행이 된다. 1번 선택시 스캐너로 인풋동작이 실행되어 반환되는 값은 객체로 반환이 되며. 반환 받은 객체를 handler의 insert 기능이 실행된다.
그리고 insert는 반환값으로 1 또는 0을 반환하여 그 결과를 화면에 알려주게 된다.
input 선택시 진행할 함수를 작성해준다.
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;
}
반환시 ob가 반환이 되어 그값을 가지고 이어서 insert 기능을 수행하게 된다.