자바의 기초문법
레퍼런스 타입: 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) 결과
봄
여름
가을
겨울
---------------------------------------------------------------------------------