객체 지향 프로그래밍(OOP)에서는 기본 데이터 유형(예: int
, char
또는 boolean
) 대신 객체를 사용하도록 권장합니다. 👍
왜일까요?
그 이유에 대해서 은행 계좌에 대한 예시와 함께 알아보겠습니다. 😀
public class BankAccount {
private double balance;
public BankAccount(double initialBalance) {
this.balance = initialBalance;
}
public void deposit(double amount) {
balance += amount;
}
public void withdraw(double amount) {
잔액 -= 금액
}
public double getBalance() {
잔액을 반환합니다;
}
}
객체를 사용하면 기본 유형과 별도의 함수를 사용하여 잔액을 관리하는 것보다 훨씬 명확합니다. 클래스 및 메서드 이름은 코드의 목적과 기능을 명시적으로 전달하여 가독성과 유지보수성을 향상시킵니다.
객체를 사용하면 나중에 기능을 확장하거나 변경 사항을 도입하기가 더 쉬워집니다. 새로운 요구 사항이나 기능은 객체 메서드를 수정하거나 서브클래스를 생성하여 기존 코드에 영향을 주지 않고 기능을 확장함으로써 해결할 수 있습니다.
예를 들어, BankAccount
클래스에 이자 계산을 추가할 수 있습니다.
public class SavingsAccount extends BankAccount {
private double interestRate;
public SavingsAccount(double initialBalance, double interestRate) {
super(initialBalance);
this.interestRate = interestRate;
}
public void addInterest() {
double interest = getBalance() * interestRate;
deposit(interest);
}
}
원래의 BankAccount
클래스를 변경하지 않고 새로운 기능을 통합합니다.
객체를 사용하면 코드베이스 전체에서 유사한 기능을 재사용할 수 있으므로 중복을 줄이고 유지보수성을 향상시킬 수 있습니다. 재사용 가능한 클래스를 설계하면 애플리케이션의 여러 부분에서 동일한 코드를 활용할 수 있습니다.
예를 들어, Person
클래스는 다양한 컨텍스트에서 사용할 수 있습니다.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person
클래스는 직원 관리, 고객 기록 또는 사용자 프로필에 사용하여 코드 재사용을 촉진할 수 있습니다.
객체를 사용하면 동작을 독립적으로 테스트하기가 더 쉬워집니다. 객체 내에서 기능을 캡슐화하면 단위 테스트를 작성하여 개별 클래스의 동작을 검증할 수 있습니다. 이러한 모듈성은 테스트 케이스 생성을 간소화하고 코드베이스의 안정성을 향상시킵니다.
BankAccount
클래스를 테스트하는 것이 간단해집니다.
@Test
public void testDeposit() {
BankAccount account = new BankAccount(100);
account.deposit(50);
assertEquals(150, account.getBalance(), 0.001);
}
@Test
public void testWithdraw() {
BankAccount account = new BankAccount(100);
account.withdraw(30);
assertEquals(70, account.getBalance(), 0.001);
}
이 테스트는 입금
및 출금
메서드의 기능을 독립적으로 검증합니다.
특정 객체를 생성하면 복잡한 동작과 제약 조건을 캡슐화하여 코드를 더욱 견고하고 관리하기 쉽게 만들 수 있습니다. 최소 및 최대 구매 가격과 같은 비즈니스 규칙을 적용하는LottoPurchasePrice
클래스를 예로 들어보겠습니다.
public class LottoPurchasePrice {
private final double price;
private static final double MIN_PRICE = 1.0;
private static final double MAX_PRICE = 100.0;
public LottoPurchasePrice(double price) {
if (price < MIN_PRICE || price > MAX_PRICE) {
throw new IllegalArgumentException("가격은 " + MIN_PRICE + " 과 " + MAX_PRICE 사이여야 합니다");
}
this.price = price;
}
public double getPrice() {
가격을 반환합니다;
}
}
이 클래스를 사용하면 모든 LottoPurchasePrice
인스턴스가 지정된 제약 조건을 준수하여 애플리케이션 전체에서 데이터 무결성을 개선하고 유효성 검사 로직을 간소화할 수 있습니다.
Java에서 기본 데이터 유형 대신 객체를 사용하면 향상된 가독성 및 유지 관리성, 유연성 및 확장성, 재사용성, 향상된 테스트 가능성 등 다양한 이점을 얻을 수 있습니다. 객체 내의 데이터와 동작을 캡슐화함으로써 변화하는 요구 사항에 쉽게 적응하고 애플리케이션 전체에서 효과적으로 테스트하고 재사용할 수 있는 이해하기 쉽고 강력한 모듈식 코드를 생성할 수 있습니다.
특정 코드가 실행되거나 함수가 호출(사용)되는 상태 및 환경을 의미합니다.