Hyoza
129
2017-07-18 11:24:49
5
489

객체지향과 참조에 대한 질문 드립니다


안녕하세요 :) 객체지향을 공부하고 있습니다

블랙잭 프로젝트를 따라하고 있는 중입니다 하면서 질문이 있는데

일단 프로젝트 내용을 몰라도 알 수 있게끔 쓰겠습니다 :) 객체지향 개념을 묻는거니까요

BlackJack이란 클래스가 있고

BlackJack은 Dealer, Gamer, CardDeck 클래스 객체를 생성해서 가지고 있습니다

이 상태에서는 Dealer와 Gamer는 CardDeck에 직접적으로 접근 할 수 없겠죠?

BlackJack에서만 직접적으로 접근 할 수 있는데

만약에 어떤 기능을 구현할 때 (어떤 기능은 BlackJack에서 처음 호출 하는 겁니다)




버전 1. Dealer와 Gamer의 생성자를 호출 할 때 CardDeck을 매개변수로 줘서 직접 참조 할 수 있게 만든다


< BlackJack 메소드 호출

-> BlackJack에서 Gamer 메소드 호출

->Gamer 메소드 안에서 직접 CardDeck의 메소드 호출 >




버전2. 직접 참조 불가


<BlackJack 메소드 호출

-> BlackJack에서 Gamer 메소드 호출

-> BlackJack에서 CardDeck 메소드 호출 >




무심코 버전 1로 짜버렸는데 나중에 생각하니까 CardDeck을 여러 군데에서 참조 하면 안될꺼 같더라구요

버전 2가 맞는거 같은데...

이런식으로 객체지향에서 참조는 어느 정도 까지 허용 되고 이런게 아직 초보자 입장에서 애매합니다 ㅠㅠ

객체지향에서 이러한 참조에 대해서 논해주실 고수분들 없으신가요? :)



0
0
  • 답변 5

  • LichKing
    13k
    2017-07-18 11:57:14

    음..그냥 코드를 보여주는게 나을거같아요..

    0
  • Hyoza
    129
    2017-07-18 12:10:45 작성 2017-07-18 12:11:46 수정됨




    버전 1

    import java.util.ArrayList;
    import java.util.Scanner;
     
    public class BlackJack {
     
        CardDeck mCardDeck;
        Gamer mGamer;
        Dealer mDealer;
        
        public void startGame() {
            
            mCardDeck = new CardDeck();
            mGamer = new Gamer(mCardDeck);
            mDealer = new Dealer(mCardDeck);
            
            System.out.println("===== 블랙잭 게임을 시작하겠습니다 =====");
            
            // 번갈아 가면서 게이머와 딜러에게 각각 카드 2장을 나눠줌
            for(int i=0; i<2; i++) {
                divideCard(mGamer);
                divideCard(mDealer);
            }
           
        }
        
        /**
         * 카드를 1장 나눠줌
         * @param participant
         */
        private void divideCard(Participant participant) {
            
            participant.recieveCard();
            
        }
       
    }
    
    public class Participant {
        
        protected CardDeck mCardDeck;
        
        protected int mScore;
        protected ArrayList<Card> mCards = new ArrayList<>();
        
        Participant(CardDeck cardDeck) {
            
            mCardDeck = cardDeck;
        }
        
        
        /**
         * 카드를 받는다
         */
        protected void recieveCard() {
            
            Card card = mCardDeck.getCard();
        
            mScore += card.getPoint();
            mCards.add(card);
        }
        
        
    }
     
    



    버전 2는 아직 안짰지만 BlackJack 의 divideCard 메소드가

        private void divideCard(Participant participant) {
            Card card = mCardDeck.getCard();
    
            participant.recieveCard(card);
       
        }
       

    이런식이 될꺼 같아요

    0
  • 모드쿠
    657
    2017-07-18 15:56:22

    카드덱이 공통 자원이라고 보면 여기저기서 참조하는게 맞죠.

    게이머나 딜러는 Participant이거 상속한건가요?

    0
  • Hyoza
    129
    2017-07-18 22:19:24

    모드쿠


    예 현재는 그렇게 되어 있습니다 :)
     

    0
  • 모드쿠
    657
    2017-07-19 09:12:35

    일단 완성 하시고 디자인 패턴 책 한번 보심은 어떠세요?

    저도 패턴책 보고 있는데, 여기에도 적용할 패턴이 있을 것 같아요.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.