Home > Backend Development > ๐Ÿ“š[Backend Development] Java ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค ์™„์ „ ์ •๋ณต!!

๐Ÿ“š[Backend Development] Java ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค ์™„์ „ ์ •๋ณต!!
Backend Development Class

๐Ÿ—๏ธ Java ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค ์™„์ „ ์ •๋ณต !!

๐Ÿค” ํด๋ž˜์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

ํด๋ž˜์Šค(Class)๋Š” ๊ฐ์ฒด(Object)๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ธฐ ์œ„ํ•œ โ€˜์„ค๊ณ„๋„โ€™ ๋˜๋Š” โ€˜ํ‹€โ€™์ž…๋‹ˆ๋‹ค.

๐Ÿฅฎ ๋ถ•์–ด๋นต์œผ๋กœ ์ดํ•ดํ•˜๋Š” ํด๋ž˜์Šค

  • ๋ถ•์–ด๋นต ํ‹€ = ํด๋ž˜์Šค (์„ค๊ณ„๋„)
  • ์‹ค์ œ ๋ถ•์–ด๋นต = ๊ฐ์ฒด (์ธ์Šคํ„ด์Šค)
  • ํŒฅ, ์Šˆํฌ๋ฆผ ๋“ฑ = ํ•„๋“œ (์†์„ฑ)
  • ๊ตฝ๊ธฐ, ํฌ์žฅํ•˜๊ธฐ ๋“ฑ = ๋ฉ”์„œ๋“œ (ํ–‰์œ„)
// ๐Ÿช Product ํด๋ž˜์Šค (์ƒํ’ˆ ์„ค๊ณ„๋„)
public class Product {
    // ๋ถ•์–ด๋นต์˜ '๋ง›'์ฒ˜๋Ÿผ ๊ฐ ์ƒํ’ˆ์ด ๊ฐ€์ง€๋Š” ๊ณ ์œ ํ•œ ์†์„ฑ๋“ค
    private String name;      // ์ƒํ’ˆ๋ช…
    private int price;        // ๊ฐ€๊ฒฉ  
    private int stockQuantity; // ์žฌ๊ณ ์ˆ˜๋Ÿ‰
}

// ์‹ค์ œ ์ƒํ’ˆ ๊ฐ์ฒด๋“ค ์ƒ์„ฑ
Product apple = new Product();     // ๐ŸŽ ์‚ฌ๊ณผ ๊ฐ์ฒด
Product banana = new Product();    // ๐ŸŒ ๋ฐ”๋‚˜๋‚˜ ๊ฐ์ฒด

๐Ÿงฉ ํด๋ž˜์Šค์˜ ๊ตฌ์„ฑ์š”์†Œ

ํด๋ž˜์Šค๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ๐Ÿ“ฆ ํ•„๋“œ (Fields) - ์†์„ฑ๊ณผ ์ƒํƒœ

๊ฐ์ฒด๊ฐ€ ๊ฐ€์งˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

public class Product {
    // โœ… ํ•„๋“œ๋“ค - "์ด ๊ฐ์ฒด๋Š” ์–ด๋–ค ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€?"
    private String name;           // ์ƒํ’ˆ๋ช…
    private int price;            // ๊ฐ€๊ฒฉ
    private int stockQuantity;    // ์žฌ๊ณ ์ˆ˜๋Ÿ‰
    private String category;      // ์นดํ…Œ๊ณ ๋ฆฌ
    private boolean isActive;     // ํŒ๋งค์ค‘ ์—ฌ๋ถ€
}

ํŠน์ง•:

  • ๊ฐ์ฒด์˜ ์ƒํƒœ(State)๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค
  • ๊ฐ ๊ฐ์ฒด๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค
  • ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

2. โš™๏ธ ๋ฉ”์„œ๋“œ (Methods) - ํ–‰์œ„์™€ ๊ธฐ๋Šฅ

๊ฐ์ฒด๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

public class Product {
    private String name;
    private int price;
    private int stockQuantity;
    
    // โœ… ๋ฉ”์„œ๋“œ๋“ค - "์ด ๊ฐ์ฒด๋Š” ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?"
    
    // ์žฌ๊ณ  ๊ฐ์†Œ
    public void decreaseStock(int quantity) {
        if (quantity <= 0) {
            throw new IllegalArgumentException("์ˆ˜๋Ÿ‰์€ ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค");
        }
        if (this.stockQuantity < quantity) {
            throw new IllegalStateException("์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค");
        }
        this.stockQuantity -= quantity;
    }
    
    // ๊ฐ€๊ฒฉ ๋ณ€๊ฒฝ
    public void changePrice(int newPrice) {
        if (newPrice <= 0) {
            throw new IllegalArgumentException("๊ฐ€๊ฒฉ์€ 0๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค");
        }
        this.price = newPrice;
    }
    
    // ์žฌ๊ณ  ํ™•์ธ
    public boolean hasStock() {
        return this.stockQuantity > 0;
    }
    
    // ์ƒํ’ˆ ์ •๋ณด ์กฐํšŒ
    public String getProductInfo() {
        return String.format("์ƒํ’ˆ๋ช…: %s, ๊ฐ€๊ฒฉ: %d์›, ์žฌ๊ณ : %d๊ฐœ", 
                           name, price, stockQuantity);
    }
}

ํŠน์ง•:

  • ๊ฐ์ฒด์˜ ํ–‰๋™(Behavior)์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค
  • ํ•„๋“œ ๊ฐ’์„ ์ด์šฉํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค
  • ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๐ŸŽฏ ์–ธ์ œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

โœ… ์ ํ•ฉํ•œ ์ƒํ™ฉ

  1. ๋™์ผํ•œ ๊ตฌ์กฐ์˜ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    // ๐Ÿ›’ ์‡ผํ•‘๋ชฐ์—์„œ ์ˆ˜๋งŽ์€ ์ƒํ’ˆ๋“ค์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ
    Product laptop = new Product("๋…ธํŠธ๋ถ", 1500000, 10);
    Product mouse = new Product("๋งˆ์šฐ์Šค", 25000, 50);
    Product keyboard = new Product("ํ‚ค๋ณด๋“œ", 80000, 30);
    
  2. ํ˜„์‹ค ์„ธ๊ณ„์˜ ๊ฐœ๋…์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    // ๐Ÿช ์ „์ž์ƒ๊ฑฐ๋ž˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง
    public class Customer { /* ๊ณ ๊ฐ */ }
    public class Order { /* ์ฃผ๋ฌธ */ }
    public class Payment { /* ๊ฒฐ์ œ */ }
    public class Delivery { /* ๋ฐฐ์†ก */ }
    
  3. ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    // ๐Ÿ“Š ๊ณ„์‚ฐ๊ธฐ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ๋ฌถ๊ธฐ
    public class Calculator {
     private double result;  // ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ์ €์žฅ
        
     public void add(double value) { /* ๋”ํ•˜๊ธฐ */ }
     public void subtract(double value) { /* ๋นผ๊ธฐ */ }
     public double getResult() { /* ๊ฒฐ๊ณผ ์กฐํšŒ */ }
    }
    

๐Ÿš€ ์™œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

1. ๐Ÿ”„ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ (Reusability)

// โŒ ํด๋ž˜์Šค ์—†์ด ๊ฐœ๋ฐœํ•˜๋ฉด...
String product1Name = "๋…ธํŠธ๋ถ";
int product1Price = 1500000;
int product1Stock = 10;

String product2Name = "๋งˆ์šฐ์Šค";
int product2Price = 25000;  
int product2Stock = 50;
// ๋งค๋ฒˆ ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์„ ์–ธํ•ด์•ผ ํ•จ ๐Ÿ˜ต

// โœ… ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด!
Product product1 = new Product("๋…ธํŠธ๋ถ", 1500000, 10);
Product product2 = new Product("๋งˆ์šฐ์Šค", 25000, 50);
// ๊น”๋”ํ•˜๊ณ  ์ผ๊ด€๋œ ๊ตฌ์กฐ! ๐Ÿ˜Š

2. ๐Ÿ“‚ ์ฒด๊ณ„์ ์ธ ์ฝ”๋“œ ๊ด€๋ฆฌ (Organization)

// โœ… Product ๊ด€๋ จ ๋ชจ๋“  ๊ฒƒ์ด ํ•œ ๊ณณ์—!
public class Product {
    // ์ƒํ’ˆ ๋ฐ์ดํ„ฐ
    private String name;
    private int price;
    
    // ์ƒํ’ˆ ๊ธฐ๋Šฅ
    public void validatePrice() { /* ๊ฐ€๊ฒฉ ๊ฒ€์ฆ */ }
    public void applyDiscount() { /* ํ• ์ธ ์ ์šฉ */ }
    public void updateStock() { /* ์žฌ๊ณ  ์—…๋ฐ์ดํŠธ */ }
}

3. ๐ŸŒ ํ˜„์‹ค ์„ธ๊ณ„ ๋ชจ๋ธ๋ง (Domain Modeling)

// ๐Ÿฆ ์€ํ–‰ ์‹œ์Šคํ…œ ์˜ˆ์‹œ
public class Account {
    private String accountNumber;  // ๊ณ„์ขŒ๋ฒˆํ˜ธ
    private long balance;         // ์ž”์•ก
    
    public void deposit(long amount) {    // ์ž…๊ธˆ
        this.balance += amount;
    }
    
    public void withdraw(long amount) {   // ์ถœ๊ธˆ
        if (balance >= amount) {
            this.balance -= amount;
        }
    }
}

4. ๐Ÿ’Š ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ (์บก์Аํ™”, Encapsulation)

public class BankAccount {
    private long balance;  // โœ… private์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผ ์ฐจ๋‹จ
    
    // โœ… ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋งŒ ์ž”์•ก ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
    public void deposit(long amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException("์ž…๊ธˆ์•ก์€ ์–‘์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค");
        }
        this.balance += amount;
    }
    
    // โŒ ์™ธ๋ถ€์—์„œ balance์— ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€
    // account.balance = -1000000;  // ์ปดํŒŒ์ผ ์—๋Ÿฌ!
}

๐Ÿ› ๏ธ ์‹ค์ „ ํด๋ž˜์Šค ์ž‘์„ฑ ๊ฐ€์ด๋“œ

๐Ÿ“‹ ํด๋ž˜์Šค ์„ค๊ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

// โœ… ์ข‹์€ ํด๋ž˜์Šค ์˜ˆ์‹œ
public class Product {
    // 1. ํ•„๋“œ๋Š” private์œผ๋กœ ๋ณดํ˜ธ
    private ProductId id;
    private String name;
    private Money price;
    private Stock stock;
    
    // 2. ์ƒ์„ฑ์ž๋กœ ํ•„์ˆ˜ ๋ฐ์ดํ„ฐ ๋ณด์žฅ
    public Product(ProductId id, String name, Money price) {
        this.id = Objects.requireNonNull(id);
        this.name = validateName(name);
        this.price = Objects.requireNonNull(price);
        this.stock = Stock.zero();
    }
    
    // 3. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ฉ”์„œ๋“œ๋กœ ํ‘œํ˜„
    public void changePrice(Money newPrice) {
        if (newPrice.isLessThanOrEqual(Money.zero())) {
            throw new IllegalArgumentException("์ƒํ’ˆ ๊ฐ€๊ฒฉ์€ 0๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค");
        }
        this.price = newPrice;
    }
    
    // 4. ์˜๋ฏธ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ช… ์‚ฌ์šฉ
    public boolean isAvailable() {
        return stock.hasQuantity();
    }
    
    // 5. ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ getter ์ œ๊ณต
    public String getName() {
        return name;
    }
}

โš ๏ธ ํ”ผํ•ด์•ผ ํ•  ์•ˆํ‹ฐํŒจํ„ด

// โŒ ๋‚˜์œ ํด๋ž˜์Šค ์˜ˆ์‹œ
public class Product {
    // 1. ๋ชจ๋“  ํ•„๋“œ๊ฐ€ public (์บก์Аํ™” ์œ„๋ฐ˜)
    public String name;
    public int price;
    public int stock;
    
    // 2. ์˜๋ฏธ์—†๋Š” getter/setter๋งŒ ์กด์žฌ (๋นˆ์•ฝํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ)
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getPrice() { return price; }
    public void setPrice(int price) { this.price = price; }
    
    // 3. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์—†์Œ
    // ์‹ค์ œ ์ƒํ’ˆ์˜ ํ–‰๋™์ด๋‚˜ ๊ทœ์น™์ด ํ‘œํ˜„๋˜์ง€ ์•Š์Œ
}

๐ŸŽฏ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ์˜ ํด๋ž˜์Šค ํ™œ์šฉ

๐Ÿช ์ „์ž์ƒ๊ฑฐ๋ž˜ ๋„๋ฉ”์ธ ์˜ˆ์‹œ

// ๐Ÿ“ฆ ์ฃผ๋ฌธ ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ
public class Order {
    private OrderId id;
    private CustomerId customerId;
    private List<OrderItem> items = new ArrayList<>();
    private OrderStatus status;
    private LocalDateTime orderedAt;
    
    public void addItem(Product product, int quantity) {
        validateCanAddItem();
        OrderItem item = new OrderItem(product, quantity);
        items.add(item);
    }
    
    public void confirm() {
        if (status != OrderStatus.PENDING) {
            throw new IllegalStateException("๋Œ€๊ธฐ ์ค‘์ธ ์ฃผ๋ฌธ๋งŒ ํ™•์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค");
        }
        this.status = OrderStatus.CONFIRMED;
    }
}

// ๐Ÿ’ฐ ๊ฒฐ์ œ ์„œ๋น„์Šค
@Service
public class PaymentService {
    
    public PaymentResult processPayment(Order order, PaymentMethod method) {
        validateOrder(order);
        
        Money totalAmount = order.calculateTotal();
        Payment payment = Payment.create(order.getId(), totalAmount, method);
        
        return paymentGateway.process(payment);
    }
}

๐Ÿ“š ํ•ต์‹ฌ ์šฉ์–ด ์ •๋ฆฌ

์šฉ์–ด ์˜์–ด ์„ค๋ช… ์˜ˆ์‹œ
ํด๋ž˜์Šค Class ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„ public class Product { }
๊ฐ์ฒด Object ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ์‹ค์ฒด Product apple = new Product();
์ธ์Šคํ„ด์Šค Instance ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ๊ฐ์ฒด apple์€ Product์˜ ์ธ์Šคํ„ด์Šค
ํ•„๋“œ Field ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜ private String name;
๋ฉ”์„œ๋“œ Method ๊ฐ์ฒด์˜ ํ–‰๋™์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•จ์ˆ˜ public void changePrice() { }
์ƒ์„ฑ์ž Constructor ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ public Product(String name) { }
์บก์Аํ™” Encapsulation ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๊ณ  ๋ณดํ˜ธ private ์ ‘๊ทผ ์ œ์–ด์ž ์‚ฌ์šฉ

๐ŸŽ‰ ๋งˆ๋ฌด๋ฆฌ

ํด๋ž˜์Šค๋Š” Java ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ ๊ธฐ์ดˆ์ž…๋‹ˆ๋‹ค!

๐Ÿšฆ ๋‹ค์Œ ๋‹จ๊ณ„ ํ•™์Šต ๋กœ๋“œ๋งต

  1. ์ƒ์† (Inheritance) - ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„ ์ดํ•ด
  2. ๋‹คํ˜•์„ฑ (Polymorphism) - ๊ฐ™์€ ๋ฉ”์„œ๋“œ, ๋‹ค๋ฅธ ๋™์ž‘
  3. ์ถ”์ƒํ™” (Abstraction) - ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค
  4. ์ปฌ๋ ‰์…˜ (Collections) - ๊ฐ์ฒด๋“ค์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ
  5. ๋””์ž์ธ ํŒจํ„ด - ๊ฒ€์ฆ๋œ ์„ค๊ณ„ ํ•ด๋ฒ•๋“ค

๐Ÿ’ก ์‹ค์Šต ์ถ”์ฒœ

  • ๊ฐ„๋‹จํ•œ ์‡ผํ•‘๋ชฐ ์ƒํ’ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๋งŒ๋“ค๊ธฐ
  • ์€ํ–‰ ๊ณ„์ขŒ ํด๋ž˜์Šค๋กœ ์ž…์ถœ๊ธˆ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ
  • ํ•™์ƒ ์„ฑ์  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์„ค๊ณ„ํ•ด๋ณด๊ธฐ

ํด๋ž˜์Šค๋ฅผ ์ •๋ณตํ•˜๋ฉด ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฌธ์ด ํ™œ์ง ์—ด๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿš€