클래스
package ex02.classobj.class00;
/*
1. 프로그래밍의 탄생
1) 변수, 연산자, 조건문으로 코딩
2) 복사/붙여넣기가 주로 하는 일
3) Goto 문 => 스파게티 코드 => 개발비 < 유지보수비
4) 규모가 작은 프로그램
2. 반복문이 추가
1) 복사/붙여넣기가 줄어듬
2) 반복되는 코드외에는 사람이 주석으로 부분적인 그룹을 표시만 해놓았다
3) 규모가 조금 커짐, 하지만 조금 커져도 원하는 곳을 찾기 위해 시간이 걸린다
4) 아직까지 실수가 잦다
3. 함수(메서드)의 탄생
1) 본격적인 설계가 시작
2) 역할을 나눌 수가 있게 됨
3) 주석하던 영역 표시를 확실하게 함수로 구분지을 수 있다
4) 절차지향/구조적 프로그램 시대
5) 함수가 주체, 변수가 보조(매개변수, 리턴값)
6) 함수는 부분독립적이기는 하나
별도로 따로 놓기는 어렵다
왜 이전의 값을 매개변수로 입력받고, 다음 함수한테 내가 처리한 값을
리턴해줘야 하니까
7) 1개의 함수가 이상이 생기면 전체에 영향을 주는 일이 빈번하게 발생함
4. 객체지향 프로그래밍의 시대
1) 설계가 대폭 확장/설계가 매우 중요해지기 시작함
2) 대규모의 시스템이 탄생하는 시기
3) 함수는 별도로 독립하기 어렵다
=> 1군데 에러가 나면 다른데 영향을 주기도 쉽다
=> 에러 찾을 때 전체 프로세스를 따라가야 하는 일이 종종 생긴다
=> 대규모 시스템을 만들 때 독립적으로 만들고 합치는 공정에 부족함이 느껴진다
4) 함수는 외부에서 변수를 주입받고 다시 변수를 리턴한다
=> idea! => 그럼 외부에서 변수를 가져오지 말고 꼭 필요한 것은
함께 묶어놓으면 어떨까?
5) 함수 : 동사, 변수 : 명사
절차지향 : 동사가 주, 명사가 보조
6) 독립성이 있으려면 마치 세상의 사물/사람처럼
눈에 보이는 특징과 그 대상의 쓰임이 동시에 존재해야 한다
동사 + 명사 => 문장이 탄생
프로그래밍 => 동사 + 명사 => 메서드(함수) + 필드(변수) => 클래스
클래스 : 학급, 그룹
7) 세상이 돌아가는 것처럼 사람과 사람, 사람과 사물, 사물과 사물의 상호작용으로
프로그래밍 세계도 구성하자
8) 고양이 클래스 : 클래스 변수=객체 : 꼬치, 코, ...
10) 함수+변수 : 보다 큰단위로 복잡한 시스템은 단순하게 설계하려고 했다
*/
// 강아지 클래스
class Puppy{
// 문장 = 주어 + 동사 : 1형식
// 주어 + 동사 + 목적어 : 3형식
// 필드
String name;
int age;
String kind;
// 메서드
void setInfo(String name, int age, String kind) {
this.name = name;
this.age = age;
this.kind = kind;
}
void eat() {
System.out.println(name + "이 맛있게 밥을 먹는다");
}
void sleep() {
System.out.println(name + "이 잘잔다~");
}
void pretty() {
System.out.println(name + "이 이쁜 짓을 한다^^");
}
void showInfo() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("종류 : " + kind);
}
}
public class PuppyMain {
public static void main(String[] args) {
// 객체, 오브젝트, 인스턴스(실체화 되었다)
Puppy coach = new Puppy();
Puppy co = new Puppy();
coach.setInfo("꼬치", 2, "진도개");
coach.eat();
coach.sleep();
coach.pretty();
coach.showInfo();
co.setInfo("코", 3, "풍산개");
co.eat();
co.sleep();
co.pretty();
co.showInfo();
}
}
캡슐화
package ex02.classobj.class01;
/*
(식당)클래스 설계
1) 명사형과 동사형으로 구분한다
2) 명사형 => 필드
3) 동사형 => 메서드
4) 필드 : 메서드가 사용하는 재료
값을 보관(재료 보관)
ex) 식당의 재료, 돈
값이 외부에 의해 잘못 변경된다면 => 프로그래밍의 오류!
클래스내에서만 접근허용 => private 접근 권한
5) 메서드 : 일반적으로 외부에서 호출해야 의미가 있다
ex) Relation : 관계를 맺고 있다(연결되어 있다)
외부접근을 허용함 => public : 모두 접근 가능
default : 같은 패키지내에서 모두 접근 가능
메서드 중에 클래스 내부에서만 호출되는 메서드는 private으로 전환한다
외부에서 사용되지 않는 메서드는 불필요하게 노출하지 않는다
=> "캡슐화(encapsulization)"
*/
import java.util.Arrays;
import java.util.Random;
class Restaurant{
// 필드
private int money = 100000;
private String[] foods = {"떡볶이", "순대", "라면", "쫄면"};
private int selFood; // 자동으로 0으로 초기화
// 메서드
private void cleaning() {
System.out.println("식당을 청소한다");
}
private void prepareFoods() {
System.out.println("음식 재료를 손질하다");
}
private void calcMoney() {
System.out.println("오늘 금고의 금액은 " + money + "이다");
}
// 식당 사전준비
void prepareRestaurant() {
cleaning();
prepareFoods();
}
// 식당 마감정리
void arrangeRestaurant() {
calcMoney();
cleaning();
}
void welcome() {
System.out.println("어서 오세요");
}
void byeBye() {
System.out.println("안녕히 가세요");
}
void getMoney(int m) {
if(m < 0) {
System.out.println("음식값을 주세요");
return;
}
money += m;
System.out.println(m + "을 음식값으로 받음");
}
void anyFood() {
System.out.println("어떤 음식 주문하실래요?");
System.out.println(Arrays.deepToString(foods));
Random rd = new Random();
selFood = rd.nextInt(foods.length);
System.out.println(foods[selFood] + "이요");
}
void cookFood() {
System.out.println(foods[selFood] + "을 요리하다");
}
void sendFood() {
System.out.println(foods[selFood] + " 나왔습니다");
System.out.println("맛있게 드세요");
}
}
public class ManageRestaurant {
public static void main(String[] args) {
Restaurant rest = new Restaurant();
// 손님이 오시기 전 사전준비
rest.prepareRestaurant();
// 손님 맞이
for (int i = 0; i < 10; i++) {
System.out.println("----------------------");
rest.welcome();
rest.anyFood();
rest.cookFood();
rest.sendFood();
rest.getMoney(9000);
rest.byeBye();
System.out.println("----------------------");
}
// 하루를 마치고 정리하기
rest.arrangeRestaurant();
}
}