Java 응용 | 클래스 다이어그램 기반으로 클래스 구조 구현연습

Dalyume·2026년 8월 4일

Java 응용

목록 보기
12/15
post-thumbnail

말은 뭔가 멋져보이지만 사실은 그냥 UML표를 보고 클래스 구조짜는 연습이다.

솔직히 내가한게 다이어그램 이라는 용어가 맞는지도 의문이다. GPT한태 물어봤기 때문..

자료는 총 3가지가 있다.

설명까지 적기엔 본인은 너무 게으르기에..일단 코드만 적어올렸다. (설명은 언젠간..)

첫 번째 다이어그램

다이어그램에서 읽어낼 것

  • Beverage는 추상 클래스이다. 따라서 "new Beverage()"는 불가능하다.
  • "name"과 "price"는 private이므로 자식이 직접 접근할 수 없고 getter로 읽어야 한다.
  • "prepare()"는 추상 메서드이므로 자식이 반드시 구현해야 한다.
  • "serve()"는 일반 메서드이므로 모든 자식이 그대로 물려받는다.
  • Americano와 Latte의 생성자에는 매개변수가 없다. 이름과 가격을 클래스 안에서 직접 정해서 "super()"로 넘긴다는 뜻이다.
package com.oop21.cafe;

public abstract class Beverage {
    private String name;
    private int price;

    public Beverage(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }

    abstract void prepare();
}
package com.oop21.cafe;

public class Americano extends Beverage{

    public Americano(String name, int price) {
        super(name, price);
    }

    @Override
    void prepare() {
        System.out.println("에스프레소에 물을 붓습니다.");
    }
}
package com.oop21.cafe;

public class Latte extends Beverage {

    public Latte(String name, int price) {
        super(name, price);
    }

    @Override
    void prepare() {
        System.out.println("에스프레소에 우유를 넣습니다.");
    }
}

Main 클래스

package com.oop21.cafe;

import java.util.Scanner;

public class Cafe {
    public static void main(String[] args) {
        Beverage americano = new Americano("아메리카노", 3000);
        Beverage latte = new Latte("라떼", 4500);

        americano.prepare();
        System.out.println(americano.getName() + "나왔습니다. 가격은 : " + americano.getPrice() + "원 입니다.");
        System.out.println("-----");

        latte.prepare();
        System.out.println(latte.getName() + "나왔습니다. 가격은 : " + latte.getPrice() + "원 입니다.");
        System.out.println("-----");

        System.out.println();
        System.out.println("주문 : " + americano.getName() + ", " + latte.getName());
        System.out.println("총 금액 : " + (americano.getPrice() + latte.getPrice()));
    }
}

2번째 + 3번째 다이어그램

요구사항

  • "printInfo()"는 사번과 이름을 출력합니다.
  • 정규직의 급여는 월급을 그대로 반환합니다.
  • 아르바이트의 급여는 시급 곱하기 근무 시간입니다.
  • PartTimeEmployee의 "printInfo()"는 부모의 출력에 근무 시간을 덧붙입니다.

요구사항

  • 보너스는 직책 수당을 제외한 월급만 기준으로 하며, 월급의 두 배입니다.
  • 팀장의 급여는 월급에 직책 수당을 더한 금액입니다. 이때 월급 부분은 부모의 계산을 재사용합니다.
  • 팀장의 "printInfo()"는 부모의 출력에 직책 수당을 한 줄 덧붙입니다.
  • Manager 에는 "calculateBonus()"가 없습니다. 이것이 무슨 뜻인지 판단해서 처리합니다.
  • PayrollMain에 팀장을 한 명 추가합니다. 이름은 박팀장, 사번은 1002, 월급은 4000000, 직책 수당은 500000 입니다. 정보와 급여와 보너스를 차례로 출력합니다.
  • 보너스까지 출력하려면 참조 변수의 타입을 무엇으로 잡아야 하는지 생각해 보고 정합니다.

보시다시피 3번째가 2번째에서 확장시킨 버전이기에 한 번에 진행했다.

package com.oop21.employeeSalary;

public interface Payable {
    int calculatePay();
}
package com.oop21.employeeSalary;

public abstract class Employee implements Payable{
    private String name;
    private int id;

    public Employee(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

    abstract void printInfo();
}
package com.oop21.employeeSalary;

public class FullTimeEmployee extends Employee implements Bonusable{

    private int monthlySalary;

    public int getMonthlySalary() {
        return monthlySalary;
    }

    public FullTimeEmployee(String name, int id, int monthlySalary) {
        super(name, id);
        this.monthlySalary = monthlySalary;
    }

    @Override
    public int calculatePay() {
        return monthlySalary;
    }

    @Override
    public int calculateBonus() {
        return monthlySalary * 2;
    }

    @Override
    void printInfo() {
        System.out.println("[" + getId() + "] " + getName());
        System.out.println("급여 : " + calculatePay() + "원");
    }

}
package com.oop21.employeeSalary;

public class PartTimeEmployee extends Employee {

    private int hourlyWage;
    private int workHours;

    public PartTimeEmployee(String name, int id, int hourlyWage, int workHours) {
        super(name, id);
        this.hourlyWage = hourlyWage;
        this.workHours = workHours;
    }

    @Override
    public int calculatePay() {
        return workHours * hourlyWage;
    }

    @Override
    void printInfo() {
        System.out.println("[" + getId() + "] " + getName());
        System.out.println("이번 달 알바시간 : " + workHours + "시간");
        System.out.println("급여 : " + calculatePay());
    }

}
package com.oop21.employeeSalary;

public interface Payable {
    int calculatePay();
}
package com.oop21.employeeSalary;

public class Manager extends FullTimeEmployee {
    private int allowance;

    public Manager(String name, int id, int monthlySalary, int allowance) {
        super(name, id, monthlySalary);
        this.allowance = allowance;
    }

    @Override
    public int calculatePay() {
        return getMonthlySalary() + allowance;
    }

    @Override
    void printInfo() {
        System.out.println("[" + getId() + "] " + getName());
        System.out.println("직책 수당 : " + allowance + "원");
        System.out.println("급여 : " + calculatePay() + "원");
        System.out.println("보너스 : " + calculateBonus() + "원");
    }

}
package com.oop21.employeeSalary;

public class payrollMain {
    public static void main(String[] args) {
        Employee fullTime = new FullTimeEmployee("김정규", 1001, 3_200_000);
        Employee partTime = new PartTimeEmployee("달유메", 2001, 80, 10_320);
        Employee manager = new Manager("박팀장", 1002, 4_000_000, 500_000);

        fullTime.printInfo();
        System.out.println("-----");
        partTime.printInfo();
        System.out.println("-----");
        manager.printInfo();

    }
}
profile
신생아 개발자

0개의 댓글