관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

캡슐화와 정보 은닉 3 - 클래스의 상호작용 본문

프로그래밍 언어/자바

캡슐화와 정보 은닉 3 - 클래스의 상호작용

huenuri 2024. 12. 3. 13:03

클래스의 상호작용에 대해서 공부해 보겠다. 여기서부터 공부하는 건 아직 한 번도 공부하지 않은 따끈따끈한 내용이다.


 

 

 

 

이론 2 - 클래스의 상호 작용

 

 

상호작용은 두 개 이상의 클래스가 어떻게 관계를 맺고 상호작용 하는지이다.

 

 

 

 

 

 

 

 

 

 

 

객체는 목적어, 대상, target을 말한다.

 

 

 

 


 

 

 

 

 

실습 3 - 대중교통 이용하기

 


 

 

 

 


 

 

 

 

 

문제 풀기

 

1. boolean pay() 메서드 코드 작성


 

 

 

2. 조건문으로 금액과 승객 수 코드 작성하기

 

 

board()의 경우 else를 추가했고, layoff()의 경우 추가하지 않았는데 그 이유는 다음과 같다.

 

  1. board() 메소드
    • 이 메서드는 승객이 버스에 탑승할 때 호출된다.
    • 승객이 지불할 수 있는 돈이 있을 경우, 즉 passenger.pay()가 true를 반환한다면 승객 수를 증가시키고, 수입을 증가한다.
    • 만약 승객이 돈이 없으면 지불하지 않고 탑승할 수 없으므로 이 경우에는 else 문에서 아무 행동도 하지 않게 되어 있다.
  2. layoff() 메소드
    • 이 메소드는 승객이 버스에서 하차할 때 호출된다.
    • 버스에서 승객이 하차할 수 있는 조건은 승객 수가 1명 이상일 때만 가능하다. 승객 수가 0일 경우에는 하차할 수 없으므로 else 문에서 아무 행동도 하지 않거나, 하차할 수 없다는 메시지를 출력하거나 원하는 다른 처리를 기술할 수 있다.

즉, 각 메서드의 동작이 다르기 때문에 그에 맞춰 else 문도 다르게 구현되는 것이다.

 

 

솔직히 선생님의 강의를 듣는데 무슨 말인지 도대체 알아듣기가 힘들어서 차라리 검색을 해서 코드를 분석해 보기로 했다.


 

 

 

 

코드 분석하기

이 코드는 버스와 승객의 상호작용을 모델링한 간단한 Java 프로그램이다. 승객들이 버스를 탑승하고 요금을 지불하며, 내리는 과정을 시뮬레이션한다. 주요 클래스는 Passenger, Bus, 그리고 Main이며, 각각의 역할을 자세히 설명하겠다.

 

 

1. 클래스 Passenger

승객의 정보를 관리하고 요금을 지불하는 기능을 담당

  • 필드
    • name : 승객의 이름
    • money : 승객이 가지고 있는 돈
  • 생성자
    • 승객의 이름과 초기 금액을 설정
public Passenger(String name, int money)

 

  • 메서드
    • 승객이 버스 요금(1000원)을 지불할 수 있는지 확인하고, 지불 가능하면 money에서 1000원을 차감하며 true를 반환
    • 지불할 돈이 부족하면 false를 반환
       
public boolean pay()

 


 

 

2. 클래스 Bus

버스의 상태를 관리하고 승객의 탑승 및 하차를 처리

  • 필드
    • number : 버스 번호
    • passengerCount : 현재 탑승 중인 승객의 수
    • money : 버스가 벌어들인 총 수익
  • 생성자
    • 버스 번호를 초기화하고, 승객 수와 총수익을 0으로 설정
       
public Bus(int number)

 

  • 메서드
    1. public int getPassengerCount()
      • 현재 버스에 탑승 중인 승객 수를 반환
    2. public int getMoney()
      • 버스의 총 수익을 반환
    3. public int getNumber()
      • 버스 번호를 반환
    4. public void board(Passenger passenger)
      • 승객이 탑승하려고 하면, 승객이 pay() 메서드로 1000원을 지불 가능할 경우
        • 버스의 총수익에 1000원을 추가
        • passengerCount를 증가
      • 지불 불가능한 승객은 탑승하지 않는다.
    5. public void layoff()
      • 현재 탑승 중인 승객이 있으면 passengerCount를 감소
      • 승객 수가 0 이하로 감소하지 않도록 조건 처리

 

 

3. 클래스 Main

프로그램 실행의 진입점으로, 승객과 버스의 상호작용을 테스트

  • 변수 선언 및 초기화
    • 3명의 승객을 생성하여 각각 이름과 초기 소지금을 설정
    • 버스 번호 1024번의 버스를 생성
Passenger[] passengers = new Passenger[3];
passengers[0] = new Passenger("Elice", 3000);
passengers[1] = new Passenger("Alice", 1500);
passengers[2] = new Passenger("Eris", 500);
Bus bus = new Bus(1024);

 


 

 

4. 프로그램 흐름

  1. 승객이 버스 탑승
    • 배열에 있는 각 승객이 버스에 탑승을 시도
    • 승객이 1000원 이상 소지한 경우 탑승하며, 버스 수익이 증가

 

for (Passenger p : passengers) {
    bus.board(p);
}

 

 

2. 모든 승객이 하차

  • 버스에 탑승한 승객이 모두 내릴 때까지 layoff() 메서드를 호출
  • passengerCount가 감소하며, 0이 되면 종료
while(bus.getPassengerCount() > 0) {
    bus.layoff();
}

 

 

3. 승객 재탑승

  • 처음과 동일하게 승객들이 다시 버스에 탑승 시도
  • 이미 요금을 지불했던 승객들은 소지금이 감소했으므로 일부는 탑승 실패
for (Passenger p : passengers) {
    bus.board(p);
}

 

 

 

코드 실행하기

 

 

 


 

 

 

 

학습을 마치고

학습할 단원은 많지 않았으나 실습 문제 하나가 무척 어려웠다. 그래도 모르는 문제는 검색하고 찾아가며 이해해 보려고 노력했다.

실습 문제를 풀다가 너무 졸려서 낮잠을 자며 쉬기도 했다. 난 아침을 먹으면 왜 이렇게 졸린지 모르겠다. 그래도 다시 맑은 정신으로 공부할 수 있어서 감사했다.

 

지금 공부해도 어려운 내용인데 아마 3달 전에는 공부하기 어려웠을 것 같다.