Download presentation
Presentation is loading. Please wait.
1
레퍼런스 타입에 대하여 열거 타입의 선언과 이용
2
레퍼런스 타입 01. 레퍼런스 타입 레퍼런스 타입이란? • 자바의 데이터 타입 분류 체계
3
레퍼런스 타입 01. 레퍼런스 타입 레퍼런스 값에 대하여 • 프리미티브 타입과 레퍼런스 타입의 대입문 처리
4
레퍼런스 타입 01. 레퍼런스 타입 참조 값과 데이터 • 레퍼런스 변수를 또 다른 레퍼런스 변수에 대입할 때 일어나는 일
5
01. 레퍼런스 타입 레퍼런스 타입 참조 값과 데이터 [예제 7-1] 평면 위의 점을 표현하는 클래스 1 2 3 4 5 6 7
class Point { int x, y; // 필드 Point(int x, int y) { // 생성자 this.x = x; this.y = y; }
6
01. 레퍼런스 타입 레퍼런스 타입 참조값과 데이터 [예제 7-2] 하나의 객체를 두 개의 변수에 대입하는 프로그램 1 2 3
4 5 6 7 8 9 10 11 class RefTypeExample1 { public static void main(String args[]) { Point obj1 = new Point(10, 20); Point obj2 = obj1; System.out.printf("obj1 = (%d, %d) %n", obj1.x, obj1.y); System.out.printf("obj2 = (%d, %d) %n", obj2.x, obj2.y); obj2.x = 30; } 하나의 객체를 생성해서 두 개의 변수에 대입 obj1, obj2의 x, y 필드 값 출력 obj2의 x 필드에 다른 값 대입
7
레퍼런스 타입 01. 레퍼런스 타입 레퍼런스 타입의 파라미터 • 레퍼런스 타입의 파라미터를 메소드에 넘겨줄 때 일어나는 일
8
01. 레퍼런스 타입 레퍼런스 타입 레퍼런스 타입의 파라미터
[예제 7-3] 레퍼런스 타입 파라미터를 메소드 안에서 수정하는 예 1 2 3 4 5 6 7 8 9 10 11 12 class RefTypeExample2 { public static void main(String args[]) { Point obj = new Point(10, 20); System.out.printf("(%d, %d) %n", obj.x, obj.y); rearrange(obj); } static void rearrange(Point point) { point.x = 30; point.y = 40; 호출 파라미터 변수의 필드에 다른 값을 대입
9
레퍼런스 타입 01. 레퍼런스 타입 null 참조값 • null 참조값 : 아무 데이터도 가리키지 않는 참조값
10
레퍼런스 타입 01. 레퍼런스 타입 null 참조값 [예제 7-4] 아무 값도 갖지 않는 레퍼런스 변수와 null 값을 갖는 레퍼런스 변수 class RefTypeExample3 { public static void main(String args[]) { Point obj; System.out.println(obj.x); System.out.println(obj.y); } class RefTypeExample4 { public static void main(String args[]) { Point obj = null; System.out.println(obj.x); System.out.println(obj.y); }
11
레퍼런스 타입 01. 레퍼런스 타입 null 참조값 [예제 7-5] 레퍼런스 변수를 null 참조값과 비교해서 처리하는 프로그램 1 2 3 4 5 6 7 8 9 10 11 class RefTypeExample5 { public static void main(String args[]) { Point obj = null; if (obj == null) { System.out.println("obj 변수가 가리키는 객체가 없습니다"); return; } System.out.println("x = " + obj.x); System.out.println("y = " + obj.y);
12
01. 레퍼런스 타입 레퍼런스 타입 변수의 타입과 객체의 타입 [예제 7-6] 상속 관계를 갖는 클래스들
class Account { … } 클래스 변수에는 서브클래스 객체도 대입 가능합니다. 상속 상속 class CheckingAccount extends Account { … } class CreditLineAccount extends Account { … } 상속 class CheckingTrafficCardAccount extends CheckingAccount { … }
13
01. 레퍼런스 타입 레퍼런스 타입 변수의 타입과 객체의 타입 [예제 7-7] 구현/상속 관계를 갖는 인터페이스와 클래스들
interface Colorable { … } 인터페이스 변수에는 그 인터페이스를 직접/간접 구현하는 클래스의 객체를 대입할 수 있습니다. 구현 상속 class PlainText implements Colorable { … } interface Changeable extends Colorable { … } 상속 구현 class CompoundText extends PlainText { … } class Circle implements Changeable { … }
14
01. 레퍼런스 타입 레퍼런스 타입 변수에 의해 제한되는 객체의 사용 방법
[예제 7-8] Accont 클래스와 CheckingAccount 클래스 은행 계좌 클래스 class Account { String accountNo; String ownerName; int balance; 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; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 직불 계좌 클래스 class CheckingAccount extends Account { String cardNo; CheckingAccount(String accountNo, String ownerName, int balance, String cardNo) { super(accountNo, ownerName, 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); 상속 1 2 3 4 5 6 7 8 9 10 11 12
15
레퍼런스 타입 01. 레퍼런스 타입 변수에 의해 제한되는 객체의 사용 방법 • 다른 타입의 객체를 가리키는 클래스 변수
16
01. 레퍼런스 타입 레퍼런스 타입 변수에 의해 제한되는 객체의 사용 방법
[예제 7-9] 변수 타입에 속하지 않는 필드와 메소드를 사용하는 잘못된 프로그램 1 2 3 4 5 6 7 8 9 10 11 12 13 class RefTypeExample6 { public static void main(String args[]) { Account obj = new CheckingAccount(" ", "홍길동", 10, " "); try { int amount = obj.pay(" ", 47000); System.out.println("인출액: " + amount); System.out.println("카드번호: " + obj.cardNo); } catch (Exception e) { System.out.println(e.getMessage()); Account 클래스에 없는 메소드와 필드를 사용하는 잘못된 명령문
17
01. 레퍼런스 타입 레퍼런스 타입 변수에 의해 제한되는 객체의 사용 방법
[예제 7-10] 슈퍼클래스 변수 값을 서브클래스 변수에 대입하는 잘못된 프로그램 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class RefTypeExample7 { public static void main(String args[]) { Account obj1 = new CheckingAccount(" ", "홍길동", , " "); CheckingAccount obj2 = obj1; // 잘못된 대입문 try { int amount = obj2.pay(" ", 47000); System.out.println("인출액: " + amount); System.out.println("카드번호: " + obj2.cardNo); } catch (Exception e) { System.out.println(e.getMessage());
18
01. 레퍼런스 타입 레퍼런스 타입 서브타입 • 서브타입(subtype)이란? • 클래스와 인터페이스의 서브타입
어떤 타입의 객체가 사용되어야 할 위치에 다른 타입의 객체를 대신 끼워넣을 수 있으면 후자를 전자의 서브타입이라고 함 • 클래스와 인터페이스의 서브타입
19
01. 레퍼런스 타입 레퍼런스 타입 서브타입과 대입 연산 • 서브타입은 대입 연산의 성립 여부 결정의 기준이 됨
이 연산이 성립하기 위해서는 다음 둘 중 한 조건이 만족해야 함 obj1의 타입 = obj2의 타입 obj1의 타입 = obj2의 서브타입 하지만 때로는 이 중 한 조건이 만족하더라도 캐스트 연산이 필요
20
01. 레퍼런스 타입 레퍼런스 타입 캐스트 연산자 • 레퍼런스 타입에 캐스트 연산자를 사용하는 방법
* 문법적으로는 프리미티브 타입의 캐스트 연산과 동일
21
레퍼런스 타입 01. 레퍼런스 타입 캐스트 연산자 [예제 7-11] 슈퍼클래스 변수 값을 캐스트해서 서브클래스 변수에 대입하는 프로그램 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class RefTypeExample8 { public static void main(String args[]) { Account obj1 = new CheckingAccount(" ", "홍길동", , " "); CheckingAccount obj2 = (CheckingAccount) obj1; try { int amount = obj2.pay(" ", 47000); System.out.println("인출액: " + amount); System.out.println("카드번호: " + obj2.cardNo); } catch (Exception e) { System.out.println(e.getMessage());
22
캐스트 연산자를 레퍼런스 타입에 대해 사용하면
01. 레퍼런스 타입 캐스트 연산자 • 프리미티브 타입과 레퍼런스 타입의 캐스트 연산 차이 (short) (CheckingAccount) CheckingAccount 타입 변수에 대입할 수 있는 객체임을 보증함 캐스트 연산자를 프리미티브 타입에 대해 사용하면 데이터 타입이 바뀝니다. 캐스트 연산자를 레퍼런스 타입에 대해 사용하면 객체의 타입을 보증하는 역할만 합니다.
23
01. 레퍼런스 타입 레퍼런스 타입 캐스트 연산자 [예제 7-12] 객체를 그와 맞지 않는 타입으로 캐스트하는 잘못된 예 1
3 4 5 6 7 8 9 10 11 12 13 14 class RefTypeExample9 { public static void main(String args[]) { Account obj1 = new Account(" ", "홍길동", ); CheckingAccount obj2 = (CheckingAccount) obj1; try { int amount = obj2.pay(" ", 47000); System.out.println("인출액: " + amount); System.out.println("카드번호: " + obj2.cardNo); } catch (Exception e) { System.out.println(e.getMessage()); 잘못된 캐스트 연산
24
01. 레퍼런스 타입 레퍼런스 타입 instanceof 연산자
25
01. 레퍼런스 타입 레퍼런스 타입 instanceof 연산자
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class RefTypeExample10 { public static void main(String args[]) { Account obj = new Account(" ", "홍길동", ); if (obj instanceof CheckingAccount) pay((CheckingAccount) obj); else System.out.println("캐스트할 수 없는 타입입니다."); } static void pay(CheckingAccount obj) { try { int amount = obj.pay(" ", 47000); System.out.println("인출액: " + amount); System.out.println("카드번호: " + obj.cardNo); catch (Exception e) { System.out.println(e.getMessage()); obj를 CheckingAccount로 캐스트할 수 있을 때만 pay 메소드 호출
26
02. 열거 타입 레퍼런스 타입 열거 타입의 필요성 • 한정된 수의 값을 표현하기 위해 필요
[예1] 월, 화, 수, 목, 금, 토, 일 [예2] 봄, 여름 가을, 겨울 • 자바에서 열거 타입이 있기 전에는; 코드화된 정수나 문자를 이용하여 해당 값을 표현했음
27
02. 열거 타입 레퍼런스 타입 열거 타입의 필요성 [예제 7-14] 사계절을 표현하는 코드 값을 상수로 선언해서 사용하는 예
의류 정보 클래스 class ClothingInfo { String code; String name; String material; int season; static final int SPRING = 1; static final int SUMMER = 2; static final int FALL = 3; static final int WINTER = 4; ClothingInfo(String code, String name, String material, int season) { this.code = code; this.name = name; this.material = material; this.season = season; } 사계절을 표현하는 상수 필드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 의류 정보 클래스를 사용하는 프로그램 class OldExample { public static void main(String args[]) { ClothingInfo obj = new ClothingInfo("32919", "반팔 티셔츠", "면100%", ClothingInfo.SUMMER); System.out.println("상품코드: " + obj.code); System.out.println("상품명: " + obj.name); System.out.println("소재: " + obj.material); System.out.println("계절구분: " + obj.season); } ClothingInfo 클래스에 선언된 상수 필드를 사용 1 2 3 4 5 6 7 8 9
28
레퍼런스 타입 02. 열거 타입 열거 타입의 선언과 이용 • 열거 타입의 정의 열거 타입에 속하는 값들을 파악하여 정의
29
02. 열거 타입 레퍼런스 타입 열거 타입의 선언과 이용 • 열거 타입의 선언
제일 먼저 해야할 일은 열거 타입 이름과 열거 값 이름 정하기
30
레퍼런스 타입 02. 열거 타입 열거 타입의 선언과 이용 • 열거 타입의 선언
31
레퍼런스 타입 02. 열거 타입 열거 타입의 선언과 이용 • 열거 타입의 변수 선언
32
02. 열거 타입 레퍼런스 타입 열거 타입의 선언과 이용 • 열거 타입의 변수의 사용
* 열거 타입 변수에는 그 열거 타입에 속하는 열거 값(열거 상수)만 대입가능
33
02. 열거 타입 레퍼런스 타입 열거 타입의 선언과 이용 [예제 7-15] 사계절을 열거 타입으로 선언해서 사용하는 예
사계절 열거 타입 enum Season { SPRING, SUMMER, FALL, WINTER } 1 2 3 의류 정보 클래스 class ClothingInfo { String code; String name; String material; Season season; ClothingInfo(String code, String name, String material, Season season) { this.code = code; this.name = name; this.material = material; this.season = season; } 열거 타입의 필드 1 2 3 4 5 6 7 8 9 10 11 12 열거 타입의 파라미터 변수 의류 정보 클래스를 사용하는 프로그램 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); } 열거 상수 1 2 3 4 5 6 7 8 9
34
02. 열거 타입 레퍼런스 타입 클래스에 종속된 열거 타입
• 클래스/인터페이스 안에 선언된 열거 타입은 그 클래스/인터페이스에 종속됨 • 클래스/인터페이스에 종속된 열거 타입의 사용 방법
35
02. 열거 타입 레퍼런스 타입 클래스에 종속된 열거 타입
[예제 7-16] 사계절 열거 타입을 클래스 안에 선언해서 사용하는 예 의류 정보 클래스 class ClothingInfo { enum Season { SPRING, SUMMER, FALL, WINTER } String code; String name; String material; Season season; ClothingInfo(String code, String name, String material, Season season) { this.code = code; this.name = name; this.material = material; this.season = season; 사계절 열거 타입 열거 타입 필드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 열거 타입 파라미터 변수 의류 정보 클래스를 사용하는 프로그램 class NewExample2 { public static void main(String args[]) { ClothingInfo obj = new ClothingInfo("32919", "반팔 티셔츠", "면100%", ClothingInfo.Season.SUMMER); System.out.println("상품코드: " + obj.code); System.out.println("상품명: " + obj.name); System.out.println("소재: " + obj.material); System.out.println("계절구분: " + obj.season); } 1 2 3 4 5 6 7 8 9 열거 상수
36
02. 열거 타입 레퍼런스 타입 values 메소드와 valueOf 메소드
• 열거 타입은 컴파일하고 나면 내부적으로 클래스가 됨 -> 그 클래스에는 values와 valueOf라는 정적 메소드가 자동으로 추가됨 • values 메소드 : 모든 열거 상수를 리턴하는 메소드 • valueOf 메소드 : 주어진 문자열에 해당하는 열거 상수를 리턴하는 메소드
37
02. 열거 타입 레퍼런스 타입 values 메소드와 valueOf 메소드 [예제 7-17] 요일을 표현하는 열거 타입 1 2
3 enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
38
02. 열거 타입 레퍼런스 타입 values 메소드와 valueOf 메소드
1 2 3 4 5 6 7 class EnumExample1 { public static void main(String args[]) { Day days[] = Day.values(); for (Day day : days) System.out.println(day); }
39
02. 열거 타입 레퍼런스 타입 values 메소드와 valueOf 메소드
1 2 3 4 5 6 7 8 9 10 11 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);
40
02. 열거 타입 레퍼런스 타입 열거 상수를 다른 값과 연관짓기
• 다음의 열거 상수들을 “봄”, “여름”, “가을”, “겨울”이라는 이름과 연관시킬 수 있음
41
레퍼런스 타입 02. 열거 타입 열거 상수를 다른 값과 연관짓기 • 1단계 : 각각의 열거 상수 뒤에 연관 값을 기술
42
레퍼런스 타입 02. 열거 타입 열거 상수를 다른 값과 연관짓기 • 2단계 : 연관 값을 저장할 필드 선언
43
레퍼런스 타입 02. 열거 타입 열거 상수를 다른 값과 연관짓기 • 3단계 : 생성자의 선언
44
레퍼런스 타입 02. 열거 타입 열거 상수를 다른 값과 연관짓기 • 4단계 : 메소드의 선언
45
02. 열거 타입 레퍼런스 타입 열거 상수를 다른 값과 연관짓기 [예제 7-20] 열거 상수에 연관된 값을 이용하는 프로그램
요일 열거 타입 enum Season { SPRING("봄"), SUMMER("여름"), FALL("가을"), WINTER("겨울") ; final private String name; Season(String name) { this.name = name; } String value() { return name; 1 2 3 4 5 6 7 8 9 10 요일 열거 타입을 사용하는 프로그램 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()); 1 2 3 4 5 6 7 8 9 10 11 메소드 호출
Similar presentations