instanceof 연산자를 사용하여 캐스트 연산이 가능한지 검사
- 부모 : Account 클래스
- 필드 : accountNo, ownerName, balance
- 메소드 : deposit(), cardNo()
- 자식 : CheckingAccount 클래스
- 필드 : cardNo
- 메소드 : pay()
조건
객체를 캐스트하기 전에 캐스트 연산 가능성을 검사하는 instanceof 연산자를 사용한다.
예제 코드
Account.java
부모 클래스1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
public class Account { String accountNo; //계좌번호 String ownerName; //예금주 이름 int balance; //잔액 //Account() { //} Account(String accountNo, String ownerName, int balance) { this.accountNo = accountNo; this.ownerName = ownerName; this.balance = balance; } void deposit(int amount) { balance += amount; } int withdraw(int amount) throws Exception { if (balance < amount) throw new Exception("잔액이 부족합니다."); balance -= amount; return amount; } }
CheckingAccount.java
자식 클래스1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public class CheckingAccount extends Account { String cardNo; //직불카드 번호 필드 //CheckingAccount() { //super() : 부모 클래스 디폴트 생성자 자동 호출 // super(); //this(); //} CheckingAccount(String accountNo, String ownerName, int balance, String cardNo) { // 생성자 //super(); super(accountNo, ownerName, balance); //명시적으로 부모 클래스 생성자 호출 //this.accountNo = accountNo; //this.ownerName = ownerName; //this.balance = balance; this.cardNo = cardNo; } int pay(String cardNo, int amount) throws Exception { if (!cardNo.equals(this.cardNo) || (balance < amount)) throw new Exception("지불이 불가능합니다."); return withdraw(amount); } }
작성 코드
RefTypeExample10.java
객체를 캐스트하기 전에 instanceof 연산자로 검사1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
public class RefTypeExample10 { public static void main(String args[]) { Account obj = new Account("111-22-33333333", "홍길동", 100000); //obj를 CheckingAccount로 캐스트할 수 있을 때만 pay 메소드를 호출한다. if (obj instanceof CheckingAccount) pay((CheckingAccount) obj); else System.out.println("캐스트할 수 없는 타입입니다."); } static void pay(CheckingAccount obj) { try { int amount = obj.pay("5555-6666-7777-8888", 47000); System.out.println("인출액: " + amount); System.out.println("카드번호: " + obj.cardNo); } catch (Exception e) { System.out.println(e.getMessage()); } } }
출력 결과
캐스트할 수 없는 타입입니다.
RefTypeExample11.java
인출액이 나오게 캐스트 연산1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
public class RefTypeExample11 { public static void main(String args[]) { Account obj = new Account("111-22-33333333", "홍길동", 100000); Account obj2 = new CheckingAccount("5555-6666-7777-8888", "홍길동", 100000,"5555-6666-7777-8888"); if (obj2 instanceof CheckingAccount) pay((CheckingAccount) obj2); else System.out.println("캐스트할 수 없는 타입입니다."); } static void pay(CheckingAccount obj) { try { int amount = obj.pay("5555-6666-7777-8888", 47000); System.out.println("인출액: " + amount); System.out.println("카드번호: " + obj.cardNo); } catch (Exception e) { System.out.println(e.getMessage()); } } }
출력 결과
인출액: 47000
카드번호: 5555-6666-7777-8888
🌞 정보 : 공부 기록용 블로그입니다. 오타나 내용 오류가 있을 경우 알려주시면 감사하겠습니다.
댓글남기기