중급클래스 협력

학생-강의 수강 시스템

학생과 강의 클래스를 설계하고, 수강 신청과 취소 기능을 구현합니다. 정원 제한 로직을 포함한 실무적인 시스템을 학습합니다.

클래스 협력상태 관리비즈니스 로직

학생-강의 수강 시스템

📋 문제 설명

학생과 강의 클래스를 설계하고, 수강 신청과 취소 기능을 구현하는 시스템을 만드세요.

⚠️ 정원 제한 로직을 포함하여 실무적인 수강 신청 시스템을 학습합니다.


🎯 클래스 구조

Student 클래스

필드 (멤버변수)

  • String name - 학생 이름
  • String studentId - 학번
  • Lecture registeredLecture - 수강 중인 강의

Lecture 클래스

필드 (멤버변수)

  • String lectureName - 강의명
  • int maxStudents - 최대 수강 인원
  • int currentStudents - 현재 수강 인원

💻 코드 구조

Student 클래스

Java
public class Student {
    private String name;
    private String studentId;
    private Lecture registeredLecture;

    // 생성자
    public Student(String name, String studentId) {
        // 학생의 이름과 학번을 초기화합니다.
    }

    public boolean registerLecture(Lecture lecture) {
        // 1. 이미 수강 중인 강의가 있는지 확인합니다.
        // 2. 수강 중인 강의가 없다면, 주어진 강의에 학생을 등록합니다.
        //    (lecture.addStudent() 메서드 호출)
        // 3. 강의 등록이 성공하면 registeredLecture를 업데이트하고 true를 반환합니다.
        // 4. 실패하면 (이미 수강 중이거나 강의가 가득 찼을 경우) false를 반환합니다.
    }

    public boolean cancelLecture() {
        // 1. 현재 수강 중인 강의가 있는지 확인합니다.
        // 2. 수강 중인 강의가 있다면, 해당 강의에서 학생을 제거합니다.
        //    (lecture.removeStudent() 메서드 호출)
        // 3. registeredLecture를 null로 설정합니다.
        // 4. 취소가 성공하면 true, 실패하면 false를 반환합니다.
    }

    public void printInfo() {
        // 학생의 이름, 학번을 출력합니다.
        // 수강 중인 강의가 있다면 강의명도 출력합니다.
        // 수강 중인 강의가 없다면 "수강 중인 강의 없음"을 출력합니다.
    }
}

Lecture 클래스

Java
public class Lecture {
    private String lectureName;
    private int maxStudents;
    private int currentStudents;

    // 생성자
    public Lecture(String lectureName, int maxStudents) {
        // 강의명과 최대 수강 인원을 초기화합니다.
        // currentStudents는 0으로 초기화합니다.
    }

    public boolean addStudent() {
        // 1. 현재 수강 인원이 최대 인원보다 적은지 확인합니다.
        // 2. 여유가 있다면 currentStudents를 1 증가시키고 true를 반환합니다.
        // 3. 강의가 이미 가득 찼다면 false를 반환합니다.
    }

    public boolean removeStudent() {
        // 1. 현재 수강 인원이 0보다 큰지 확인합니다.
        // 2. 수강 중인 학생이 있다면 currentStudents를 1 감소시키고 true를 반환합니다.
        // 3. 수강 중인 학생이 없다면 false를 반환합니다.
    }

    public void printInfo() {
        // 강의명, 현재 수강 인원, 최대 수강 인원을 출력합니다.
        // 예: "강의: Java 프로그래밍, 수강 인원: 15/20"
    }
}

✅ 실습 조건

필수 요구사항

  1. 클래스 간 협력

    • Student가 Lecture를 등록/취소할 때 Lecture의 학생 수가 자동으로 변경되어야 함
  2. 수강 인원 제한

    • 최대 수강 인원을 20명으로 설정
    • 초과하면 등록할 수 없도록 처리
  3. 검증 로직

    • 이미 수강 중인 강의가 있으면 새로운 강의 등록 불가
    • 수강 중인 강의가 없으면 취소 불가

📝 테스트 시나리오

Main 클래스에서 다음 시나리오를 테스트하세요:

Java
public class Main {
    public static void main(String[] args) {
        // 1. Lecture 객체 생성 (최대 20명)
        // 2. Student 객체 여러 개 생성
        // 3. 정상 수강 신청 테스트
        // 4. 중복 수강 신청 시도 (실패해야 함)
        // 5. 수강 취소 테스트
        // 6. 정원 초과 테스트 (20명 이상 등록 시도)
    }
}

💡 학습 포인트

  • 비즈니스 로직 구현: 실제 수강신청 시스템처럼 제약 조건 처리
  • 객체 간 협력: Student와 Lecture가 서로의 메서드를 호출
  • 상태 관리: 수강 인원을 정확하게 추적
  • 유효성 검증: 중복 등록, 정원 초과 등을 사전에 체크