자바의 기초문법

레퍼런스 타입: instanceof, enum 열거타입, values/valueOf 메소드

netyhobby 2015. 12. 18. 02:30
레퍼런스 타입

primitive type 기초 타입
reference type 참조 타입

프리미티브 타입은 변수에 직접 데이터가 저장되나 레퍼런스 타입의 변수는 데이터의 참조값만 저장한다.
레퍼런스는 생성해놓은 것을 가리킨다는 개념

Account obj = null;
int arr[] = null;

obj = new Account("111-111","홍길동");
obj = new Account("222-222","이순신");

여기서 obj는 객체가 할당된 레퍼런스(타입의 변수)로, 인스턴스 객체가 됨.


1. 캐스트 연산자
객체를 그 타입의 변수에 대입할 수 있다는 사실을 보증하는 연산자. 
객체의 타입을 바꾸는 프리미티브 타입의 캐스트 연산자와 전혀 다르다.

예제) 슈퍼클래스 변수값을 캐스트 연산해서 서브클래스 변수에 대입하는 프로그램

class RefTypeExample8 {
    public static void main(String args[]) {
        Account obj1 = new CheckingAccount("111-22-33333333", "홍길동", 100000, "5555-6666-7777-8888");
        CheckingAccount obj2 = (CheckingAccount) obj1;  //  레퍼런스 타입의 캐스트 연산자
        try {
            int amount = obj2.pay("5555-6666-7777-8888", 47000);     
            System.out.println("인출액: " + amount);
            System.out.println("카드번호: " + obj2.cardNo);
        }
        catch (Exception e) {   
            System.out.println(e.getMessage());
        }
    }
}

프리미티브 타입의 캐스트 연산자 : 객체의 타입을 바꾼다. ex) int a = (int) 12.9;
레퍼런스 타입의 캐스트 연산자 : 객체를 그 타입의 변수에 대입할 수 있다는 사실을 보증함.
ex) CheckingAccount obj2 = (CheckingAccount) obj1; 
obj1은 CheckingAccount 객체를 참조하고 있는 Account 타입 변수,
obj2가 CheckingAccount 타입 변수이면 obj2에 Account 타입의 obj1을 대입할 수 있다는 보증.



2. instanceof 연산자
캐스트 가능성을 검사. 캐스트 연산이 가능할 때 true, 불가능시 false (p335 참조)

타입 검사할 객체 instanceof 타입 이름 

a obj = new A();
obj = new B();
if(obj instanceof A) {
}

예제) 객체를 캐스트하기 전에 instanceof 연산자로 검사하는 예제

class RefTypeExample10 {
    public static void main(String args[]) {
        Account obj = new Account("111-22-33333333", "홍길동", 100000);
        if (obj instanceof CheckingAccount) 
            pay((CheckingAccount) obj);
        else
            System.out.println("캐스트할 수 없는 타입입니다.");
            // obj를 CheckingAccount로 캐스트할 수 있을 때에만 pay 메소드 호출
    }
    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());
        }
    }
}


3. 열거타입  (p336 참조)
한정된 수의 값만을 갖는 데이터를 선언 가능. 구분을 0,1,2,3이 아니라 문자형으로 만들 수 있다. (JDK 5.0부터 도입)

열거타입 : 변수명;   // ex) Season season;
변수 이름 = 열거타입 이름/열거상수 이름  // ex) season = Season.SPRING;

enum Season { SPRING, SUMMER, FALL, WINTER } 열거타입

1) 사계열 열거타입

enum Season {
    SPRING, SUMMER, FALL, WINTER
}

-------------------------------------------------
2) 의류 정보 클래스

class ClothingInfo {
    String code;       
    String name;       
    String material;   
    Season season;     // 열거 타입의 필드   
    ClothingInfo(String code, String name, 
                 String material, Season season) {    // 열거 타입의 파라미터 변수 season   
        this.code = code;
        this.name = name;
        this.material = material;
        this.season = season;
    }
}
-------------------------------------------------
3) 의류 정보 클래스를 사용하는 프로그램

class NewExample {
    public static void main(String args[]) {
        ClothingInfo obj = new ClothingInfo("32919", 
                     "반팔 티셔츠", "면100%", Season.SUMMER);
        System.out.println("상품코드: " + obj.code);
        System.out.println("상품명: " + obj.name);
        System.out.println("소재: " + obj.material);
        System.out.println("계절구분: " + obj.season);
    }
}


4. values 메소드와 valueOf 메소드
열거타입은 컴파일을 하고 나면 내부적으로 클래스가 만들어지고 values와 valueOf라는 정적메소드(static)가 만들어짐.

values 메소드 : 모든 열거 상수를 배열에 담아 리턴
valueOf 메소드 : 열거상수 이름을 문자열로 넘기면 해당 열거 상수를 리턴

1) 요일을 표현하는 열거 타입


enum Day { 
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

--------------------------------------------
2) 열거타입에 대해 value 메소드를 호출하는 예제

class EnumExample1 {
    public static void main(String args[]) {
        Day days[] = Day.values();  // 모든 열거 상수를 배열에 담아 리턴
        for (Day day : days)
            System.out.println(day);
    }
}

---------------------
3) 결과
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

--------------------------------------------
4) 열거타입에 대해 valueOf 메소드를 호출하는 예제

class EnumExample2 {
    public static void main(String args[]) {
        printDay("MONDAY");
        printDay("WEDNESDAY");
        printDay("FRIDAY");
    }
    static void printDay(String name) {
        Day day = Day.valueOf(name);  // 열거상수 이름를 문자열로 넘겨주면 해당 열거상수를 리턴
        System.out.println(day);
    }
}
---------------------
5) 결과
MONDAY
WEDNESDAY
FRIDAY


5. 열거 상수를 다른 값과 연관짓기
열거타입은 클래스로 취급되므로 생성자, 필드, 메소드를 포함할 수 있다.
이런 구성요소를 이용하여 열거 상수를 다른 값과 연고나지을 수 있다.

1) 요일 열거타입
package 레퍼런스타입;
enum Season {
    SPRING("봄"), SUMMER("여름"), FALL("가을"), WINTER("겨울") ;
    final private String name;
    Season(String name) {
        this.name = name;
    }
    String value() {
        return name;
    }
}
----------------------------------------------

2) 요일 열거타입을 사용하는 프로그램
package 레퍼런스타입;
class EnumExample3 {
    public static void main(String args[]) {
        printSeason(Season.SPRING);
        printSeason(Season.SUMMER);
        printSeason(Season.FALL);
        printSeason(Season.WINTER);
    }
    static void printSeason(Season season) {
        System.out.println(season.value()); // 메소드 호출
    }
}

----------------------------------------------
3) 결과
여름
가을
겨울


---------------------------------------------------------------------------------