본문 바로가기

Programming language/Java

Java - 12 [캐스팅]

DRY(Don't Repeat Yourself)

 

코드가 DRY 하다라는 말을 들어본적 있는가?

DRY(Don't Repeat Yourself) 중복배제 라는 뜻으로

 

같은 의미의 코드가 무의미하게 반복되지 않는 코드라는 뜻이다.

예를 들면 for문으로 할것을 같은 코드를 반복해서 수행한다면

DRY하지 않다.

 

이를 for문으로 해결하면 코드가 DRY하다라고 하는 것이다.

 

코딩은 항상 DRY 해야한다.

 

캐스팅

- 캐스팅은 이러한 DRY한 코드를 위해 사용된다.

public class BankAccount {
	boolean deposit(int amount) {
        // 입금액이 0보다 작거나 계좌주의 현금보다 입금액이 클 경우는 입금 실패
        // 입금이 실패할 경우는 입금되지 않는다.
        if (amount < 0 || owner.get_cash() < amount) {
            System.out.println("입금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.get_cash() + "원");
            return false;
            // 나머지 경우는 입금 성공
            // 입금이 성공할 경우에는 계좌잔액에 입금액을 더하고 소유주의 현금액은 입금액 만큼 줄어든다.
        } else {
            balance += amount;
            owner.set_cash(owner.get_cash() - amount);
            System.out.println(amount + "원 입금하였습니다. 잔고: " + balance + "원, 현금: " + owner.get_cash() + "원");

            return true;

        }
    }
}

public class MinimumBalanceAccount extends BankAccount{
	super();
}

public class SavingAccount extends BankAccount{
	super();
    public void addInterest(){
    }
}
BankAccount ba = new BankAccount();
MinimumBalanceAccount mba = new MinimumBalanceAccount();
SavingsAccount sa = new SavingsAccount();

ba.deposit(1000);
mba.deposit(1000);
sa.deposit(1000);

이렇게 BankAccount를 상속받는 클래스의 경우 3번 모두 객체를 생성해서 함수를 3번 써야한다는 단점이 있습니다.

계좌가 100개면 100번 deposit해야한다는 것입니다.

 

이렇때 TypeCasting을 하면됩니다.

 

TypeCasting

- 형변환 

- 자식클래스는 부모클래스의 아래이기 때문에 자식클래스는 부모 클래스로 형변환이 가능하다.

 

ArrayList<BankAccount> accounts = new ArrayList<>;

accounts.add(ba);
accounts.add(mba);
accounts.add(sa);

for (BankAccount account : accounts) {
    account.deposit(1000);
}

이렇게 각계좌의 객체를 생성하고 accounts라는 ArrayList<BankAccount>에 넣어 놓으면

for문으로 DRY하게 함수를 호출 할수 있다.

 

instanceof

- 부모클래스 리스트로 묶인 개체중에 자식클래스 인것을 구분해서 자식클래스의 동작을 시키고 싶을 떄 사용한다.

ArrayList<BankAccount> accounts = new ArrayList<>;

accounts.add(ba);
accounts.add(mba);
accounts.add(sa);

for (BankAccount account : accounts) {
    account.deposit(1000);

    if (account instanceof SavingsAccount) {
        ((SavingsAccount) account).addInterest();
    }
}

- 이과정은 BankAccount 리스트로 묶인 인스턴스 중에 SavingAccount만을 찾아내서

이자를 넣어주는 형태이다.