• 객체 간 협력

    2021. 5. 30.

    by. 와트

    객체로 들어가면서 자바에 대한 자신감이 떨어지고 있다...

    분명히 이해했다고 생각했는데 내 이해는 읽고 아하!하고 끝이었나 보다^^ㅎㅎ

    객체 지향 프로그래밍: 객체를 정의하고 객체 간 협력을 프로그래밍하는 것. 클래스를 기반으로 프로그래밍.

    객체 객체 지향 프로그램의 대상, 생성된 인스턴스
    클래스 객체를 프로그래밍하기 위해 코드로 만든 상태
    인스턴스 클래스가 메모리에 생성된 상태
    멤버 변수 클래스의 속성, 특성
    메서드 멤버 변수를 이용하여 클래스의 기능을 구현
    참조 변수 메모리에 생성된 인스턴스를 가리키는 변수
    참조 값 생성된 인스턴스의 메모리 주소 값

    변수 종류에 따른 유효 범위도 유의해야 한다. 지역 변수, 멤버 변수, static 변수 중 무엇을 사용하느냐에 따라 활용 범위가 달라지기 때문.

    변수 유형 선언 위치 사용 범위 메모리 생성과 소멸
    지역 변수 함수 내부에 선언 함수 내부에서만 사용 스택 함수가 호출될 때 생성도고 함수가 끝나면 소멸함
    멤버 변수(인스턴스 변수) 클래스 멤버 변수로 선언 클래스 내부에서 사용하고 private이 아닌 경우 다른 클래스에서 사용 가능 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸
    static 변수(클래스 변수) static 예약어를 사용하여 클래스 내부에 선언 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 데이터 영역 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸

    싱글톤 패턴: static을 응용하여 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식

     

    객체 간 협력을 응용해보기 위해 카페에서 아메리카노와 라떼를 사 먹는 과정을 프로그래밍 해보았다.

    <김 씨는 4,000원을 내고 별다방에서 아메리카노를, 이 씨는 콩다방에서 4,500원을 내고 라떼를 사 먹었다>

    여기서 우리가 객체로 지정할 것은 사람, 카페, 메뉴.

    패키지를 생성해서 그 안에 Person, BeanCoffee, StarCoffee, Menu 클래스를 만들어야 한다.

    더보기

    여기서 객체 간에 일어나는 액션은 다음과 같다.

      1)김 씨(또는 이씨)가 2)BeanCoffee(또는  StarCoffee)를 가서 3)Menu(아메리카노, 라떼)를 구매한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class Person {
     
        String name;
        int money;
        
        Person(String name, int money ){
            this.name = name;
            this.money = money;
        }
        
        public void buyStarCoffee(StarCoffee sCoffee, int money) {
            String message = sCoffee.brewing(4000);
            if(message != null) {
                this.money -= money;
                System.out.println(name + " 님이 " + money +"으로 "  + message);
            }
        }
        
        public void buyBeanCoffee(BeanCoffee bCoffee, int money) {
            String message = bCoffee.brewing(4500);
            if(message != null) {
                this.money -= money;
                System.out.println(name + " 님이 " + money +"으로 "  + message);
            }
        }
    }
    cs

    Person클래스에서는 구매자와 구매자가 갖고 있는 예산을 멤버 변수로 선언. 이를 클래스를 선언하면서 this예약어를 통해 새로 지정한다.

    더불어 별다방과 콩다방 중 하나에서 커피를 구매하는 메소드를 구현한다. 별다방 클래스 혹은 콩다방 클래스에서 결괏값이 나와 return할 값이 있다면 구매금액을 예산에서 제하고 message를 호출한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class BeanCoffee {
     
        int money;
        
        public String brewing(int money) {
        
            this.money += money;
            if(money == Menu.BEANAMERICANO) {
                return "콩 다방 아메리카노를 구입했습니다";
            }
            else if(money == Menu.BEANLATTE) {
                return "콩 다방 라떼를 구입했습니다";
            }
            else {
                return null;
            }
        }
    }
    cs

    콩다방(별다방) 클래스에서는 money를 지역변수를 선언. 객체 간 협력은 양방향으로 일어나는 것이기 때문에 '사람이 카페에서 메뉴를 구매한다'는 액션도 가능하지만 '카페에서 사람이 메뉴를 사간다'는 액션도 가능하다.

    메뉴 인스턴스 변수를 통해 아메리카노와 라떼를 살 때를 각각 if문을 통해 구현한다. 둘 다 아닐 경우는 null로 결괏값을 제거한다.

    1
    2
    3
    4
    5
    6
    7
    8
    public class Menu {
     
        public static final int STARAMERICANO = 4000;
        public static final int STARLATTE = 4300;
        
        public static final int BEANAMERICANO = 4100;
        public static final int BEANLATTE = 4500;
    }
    cs

    클래스에서 공통으로 사용하는 변수니까 static, 메뉴값은 바뀌면 안되는 값이므로 final을 사용해 값을 고정시켜 준다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class CoffeeTest {
     
        public static void main(String[] args) {
     
            Person kim = new Person("Kim"10000);
            StarCoffee starCoffee = new StarCoffee();
            BeanCoffee beanCoffee = new BeanCoffee();
            
            kim.buyStarCoffee(starCoffee, 4000);
            kim.buyBeanCoffee(beanCoffee, 4500);
     
        }
    }
    cs

    결과적으로 출력은 이렇게. 

    배우면 배울 수록 아리송한 자바의 세계... 열심히 치고 열심히 리뷰해야지.

    '혼자 있는 방 > Java' 카테고리의 다른 글

    상속과 다형성(inheritance&polymorphism)  (0) 2021.06.02
    객체 배열  (1) 2021.05.30
    중간 복습(Review)  (0) 2021.05.06
    DemensionArray(2차원 배열)  (1) 2021.05.04
    Array(배열)  (0) 2021.05.04

    댓글

Designed by Nana