🏗️ 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)을 나타냅니다
- 필드 값을 이용해 비즈니스 로직을 수행합니다
- 매개변수와 반환값을 가질 수 있습니다
🎯 언제 클래스를 사용할까?
✅ 적합한 상황
-
동일한 구조의 객체가 여러 개 필요한 경우
// 🛒 쇼핑몰에서 수많은 상품들을 관리해야 할 때 Product laptop = new Product("노트북", 1500000, 10); Product mouse = new Product("마우스", 25000, 50); Product keyboard = new Product("키보드", 80000, 30);
-
현실 세계의 개념을 코드로 표현해야 하는 경우
// 🏪 전자상거래 도메인 모델링 public class Customer { /* 고객 */ } public class Order { /* 주문 */ } public class Payment { /* 결제 */ } public class Delivery { /* 배송 */ }
-
관련된 데이터와 기능을 묶어서 관리해야 하는 경우
// 📊 계산기 기능을 하나의 클래스로 묶기 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 백엔드 개발의 핵심 기초입니다!
🚦 다음 단계 학습 로드맵
- 상속 (Inheritance) - 클래스 간의 관계 이해
- 다형성 (Polymorphism) - 같은 메서드, 다른 동작
- 추상화 (Abstraction) - 인터페이스와 추상 클래스
- 컬렉션 (Collections) - 객체들을 효율적으로 관리
- 디자인 패턴 - 검증된 설계 해법들
💡 실습 추천
- 간단한 쇼핑몰 상품 관리 시스템 만들기
- 은행 계좌 클래스로 입출금 기능 구현하기
- 학생 성적 관리 시스템 설계해보기
클래스를 정복하면 객체지향 프로그래밍의 문이 활짝 열립니다! 🚀