이전글
상속 관계의 클래스 객체 형변환

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

🌞 정보 : 공부 기록용 블로그입니다. 오타나 내용 오류가 있을 경우 알려주시면 감사하겠습니다.

태그:

카테고리:

업데이트:

댓글남기기