관리 메뉴

거니의 velog

230724 자바 강의 본문

대덕인재개발원/대덕인재개발원_Java

230724 자바 강의

Unlimited00 2023. 7. 24. 19:13

[열거 타입]

 

클래스와 비슷한 형태이다. 클래스로 간주해도 틀림이 없다.

순서화 되어 있는 값들을 저장하는 방법

상수를 하나의 데이터 타입으로 관리하는 방법

일반 클래스나 인터페이스처럼 ~.java로 저장됨.

 

public enum 열거타입이름 { ... }

enum 번호가 부여되어 있는 데이터 타입으로 선언.

 

: 0, 여름 : 1, 가을 : 2, 겨울 : 3.

일요일 ~ 토요일까지를 0~6번까지 부여하여 해당되는 값들을 처리.

메뉴. 각각의 메뉴에 고유한 번호를 부여할 수 있음.

 

상수값이 반환되도록 처리.

첫 글자 대문자로 열거 타입 이름 기술.

상수는 대문자로 쓰므로, 열거 상수도 대문자 타입으로 쓴다.

상수가 하나하나 객체화 되어 힙 메모리에 저장됨.

스위치에서 case MONDAY... 등으로 조건 부여 가능.

 


[Season.java]

package ddit.chap06.sec09;

public enum Season {

	// 열거 클래스
	SPRING, SUMMER, FALL, WINTER
	
}

[SeasonExample.java]

package ddit.chap06.sec09;

public class SeasonExample {

	public static void main(String[] args) {
		
		Season s = Season.SUMMER;
		
		System.out.println(s); // SUMMER. 열거형 변수 안에 들어 있는 값 호출
		System.out.println(s.WINTER); // WINTER. 열거형 변수 안에 상수를 호출
		
	}

}

[LimitedSpeed.java]

package ddit.chap06.sec09;

public enum LimitedSpeed {

	// 상수에 숫자를 부여할 수 있다. 
	// 인덱스(기존의 0, 1, 2...)를 내가 부여하고 싶은 값으로 변환 가능.
	SchoolZone(30),
	DownTown(50),
	ContrySide(70);
	
	// 인덱스를 보관할 수 있는 상수형 변수를 정의해 주어야 한다.
	private final int values; // 인덱스 30, 50, 70을 보관하는 상수
	
	LimitedSpeed(int values) { // enum 클래스 생성자 메소드(인덱스를 보유한 enum 클래스)
		this.values = values;
	}

	public int getValues() { // 해당 인덱스(values)를 enum 클래스를 호출한 위치에 반환
		return values;
	}
	
}

[LimitedSpeedExample.java]

package ddit.chap06.sec09;

import java.util.Scanner;

public class LimitedSpeedExample {

	public static void main(String[] args) {
		
		String str = "";
		Scanner sc = new Scanner(System.in);
		
		System.out.println("1. 스쿨존");
		System.out.println("2. 시내주행");
		System.out.println("3. 시외주행");
		System.out.println("-----------------");
		
		System.out.print("번호 입력 >> ");
		int num = sc.nextInt();
		
		switch(num) {
			case 1:
				str = "SchoolZone";
				break;
			case 2:
				str = "DownTown";
				break;
			case 3:
				str = "ContrySide";
				break;
			default:
				System.out.println("작업번호 오류");
				System.exit(0);
				
		}
		
		// 열거형에서 많이 사용되는 메서드 : valueOf(), ordinal(), values() 메서드가 가장 많이 사용됨.
		// valueOf(String arg) : String 값을 매개변수 arg로 받는데, arg를 enum객체에서 가져옴, 없으면 오류발생.
		// values() : 매개변수 없음. enum 요소들을 순서대로 enum 타입의 배열로 반환.
		// 열거타입변수명.ordinal() : 해당변수의 값이 enum에 저장된 순번(배열 index) 반환
		LimitedSpeed limitedSpeed = LimitedSpeed.valueOf(str);
		
		switch(limitedSpeed) {
			case SchoolZone:
				System.out.println(limitedSpeed.SchoolZone + " 에서는 " + 
								   limitedSpeed.getValues() + "km/h 미만의 속도를 유지해야 합니다.");
				break;
			case DownTown:
				System.out.println(limitedSpeed.DownTown + " 에서는 " + 
								   limitedSpeed.getValues() + "km/h 미만의 속도를 유지해야 합니다.");
				break;
			case ContrySide:
				System.out.println(limitedSpeed.ContrySide + " 에서는 " + 
								   limitedSpeed.getValues() + "km/h 미만의 속도를 유지해야 합니다.");
				break;
		}
		
		System.out.println();
		
		for(LimitedSpeed var : limitedSpeed.values()) {
			System.out.println(var + " -> " + var.ordinal());
		}
		
	}

}

콘솔 결과


[상속]

- 부모 클래스가 먼저 생성되어야 자식 클래스가 상속 가능.

- 부모 자식 관계가 맺어져 있는 클래스에서 자식 클래스 생성자 메소드 맨 처음 문장은 부모 클래스의 생성자를 부르는 super() 메서드이다.

- 명시적으로 쓰지 않으면 컴파일러가 자동으로 넣어줌.

- 상속이 일어나면 두 클래스 관계는 Is-a 관계. 두 상속 관계를 이용해서 재정의(오버라이드) 사용 가능. 부모 클래스에서 정의한 메소드 시그니처가 자식 클래스 메소드 시그니처가 같다. 내용이 다른 방법으로 접근 가능.

- 대표적인 경우가 Object 클래스의 toString() 메서드. @Override로 재정의 가능.

- 재정의를 이용하는 것이 다형성.


[다형성]

- 클래스 간의 형변환을 알아야 한다.

- 자식 클래스 객체가 만들어지면 부모 클래스 이름의 변수에 집어 넣는다.

- [부모 클래스 타입 변수 = new 자식 클래스( );]. 실제로는 자식 클래스가 생성되지만, 타입은 부모 타입으로 들어감.

- 클래스의 업캐스팅.

- 두 관계는 상속 관계가 기반.

- 다형성이 지원되면 실행은 부모 클래스의 이름으로 자식 클래스 객체를 참조하면 부모 클래스에서 정의한 변수와 메서드만 접근 가능. 자식의 변수와 메소드는 참조 불가능. 자식 클래스에서 고유하게 선언한 것이기 때문.

- 왜 굳이 자식 클래스 객체를 생성? 부모에 생성한 메서드가 자식에 오버라이딩되면서 자식 것이 호출됨.

- 다형성은 오버라이딩, 업캐스팅, 상속을 알아야 한다.

- 모든 객체 지향 개념을 총 집합 한 것이 다형성.


[애매모호성]

- c++은 두 개 콜론을 연속 사용해서 상속방향을 정의. 단점은 계층이 깊어질수록 길어지고 복잡해짐.

- 자바에서는 아예 다중 상속을 없앴음. 우회해서 지원. 인터페이스. 클래스가 아니므로 다중 상속 가능. 클래스와 클래스 사이는 단일 상속만 있음.

 

- 부모 클래스 생성자 메소드 상속 불가능.

- 부모 클래스 private 상속 제외.

- 이유 : 부모 클래스의 고유한 속성이기 때문.

 

- 나머지는 자식 클래스가 정의하지 않아도 다 내 것처럼 사용.

- 적어도 protected 이상은 되어야 다른 패키지에서 상속 가능.


[People.java]

package ddit.chap07.sec01;

public class People {

	String name;
	private int age;
	String gender;
	
	public People() {}
	
	public People(String name, int age, String gender) {
		this.name = name;
		this.age = age;
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
}

[Student.java]

package ddit.chap07.sec01;

public class Student extends People {
	
	int grade;
	String name;
	
	Student() { super(); }
	
	Student(String name, int age, String gender, int grade) {
		super(name, age, gender);
		this.grade = grade;
	}
	
	public void printInfo() {
		System.out.println("학년 : " + grade);
		
//		System.out.println("이름 : " + name); // Student 클래스의 name 멤버변수
		System.out.println("이름 : " + super.name); // People 클래스의 name 멤버 변수
		
//		System.out.println("나이 : " + age); // People 클래스의 멤버변수 age가 private면 직접 참조 불가
		System.out.println("나이 : " + getAge());
		
		System.out.println("성별 : " + gender);
	}
	
}

[InheritanceExample.java]

package ddit.chap07.sec01;

public class InheritanceExample {

	public static void main(String[] args) {
		
		People gildong = new People("홍길동", 31, "남성"); // 상속될 수 없음
//		System.out.println(gildong); // ddit.chap07.sec01.People@23ceabc1
		
		Student s1 = new Student("정몽주", 27, "여성", 4); 
//		System.out.println(s1); // ddit.chap07.sec01.Student@56f4468b
		s1.printInfo();
		
	}

}

콘솔 결과


[Product.java]

package ddit.chap07.ex01;

/*

//예제
1. 상품클래스(Product)
1) 속성 : 상품명(String prodName)
           가격(int price)
2) TV, Computer, Audio 클래스
   - 각각 상품클래스를 상속
   - 속성 : 할인률(double discountRate)
   - 메서드 : 생성자, toString()
     .toString() : 상품명을 문자열로 반환

*/

public class Product {
	
	// 멤버 변수
	String prodName;
	int price;
	
	// 기본 생성자
	public Product() {}
	
	// 매개변수 생성자
	public Product(String prodName, int price) {
		this.prodName = prodName; // this는 멤버변수 prodName를 참조
		this.price = price; // this는 멤버변수 price를 참조
	}

	@Override
	public String toString() {
		// return getClass().getName() + "@" + Integer.toHexString(hashCode());
		return "제품명 : " + prodName + "\n가격 : " + price;
	}
	
//	// 할인 금액 메서드
//	public int discountDifference(double discountRate) {
//		return (int) (price * discountRate);
//	}
	
//	// 할인된 상품 가격 메서드
//	public int discountPrice(double discountRate) {
//		return price - (int) (price * discountRate);
//	}
	
}

[TV.java]

package ddit.chap07.ex01;

public class TV extends Product {

	double discountRate;
	
	TV(String prodName, int price, double discountRate) {
//		super(prodName, price);
//		super(prodName, (int)(price - (price * discountRate)));
		super(prodName, (int)(price * (1 - discountRate)));
		this.discountRate = discountRate;
	}
	
}

[Computer.java]

package ddit.chap07.ex01;

public class Computer extends Product {

	double discountRate;
	
	Computer(String prodName, int price, double discountRate) {
//		super(prodName, price);
//		super(prodName, (int)(price - (price * discountRate)));
		super(prodName, (int)(price * (1 - discountRate)));
		this.discountRate = discountRate;
	}
	
}

[Audio.java]

package ddit.chap07.ex01;

public class Audio extends Product {

	double discountRate;
	
	Audio(String prodName, int price, double discountRate) {
//		super(prodName, price);
//		super(prodName, (int)(price - (price * discountRate)));
		super(prodName, (int)(price * (1 - discountRate)));
		this.discountRate = discountRate;
	}
	
}

[ProductExample.java]

package ddit.chap07.ex01;

public class ProductExample {

	public static void main(String[] args) {
		
		TV t1 = new TV("샘송 Smart TV", 3000000, 0.001);
		
		System.out.println(t1);
		System.out.println("할인률 : " + t1.discountRate*100 + "%\n");
//		System.out.println("할인 금액 : " + t1.discountDifference(t1.discountRate));
//		System.out.println("할인된 상품 가격 : " + t1.discountPrice(t1.discountRate) + "\n");
		
		Computer c1 = new Computer("LG 노트북", 5000000, 0.05);
		
		System.out.println(c1);
		System.out.println("할인률 : " + c1.discountRate*100 + "%\n");
//		System.out.println("할인 금액 : " + c1.discountDifference(c1.discountRate));
//		System.out.println("할인된 상품 가격 : " + c1.discountPrice(c1.discountRate) + "\n");
		
		Audio a1 = new Audio("워크맨", 160000, 0.005);
		
		System.out.println(a1);
		System.out.println("할인률 : " + a1.discountRate*100 + "%\n");
//		System.out.println("할인 금액 : " + a1.discountDifference(a1.discountRate));
//		System.out.println("할인된 상품 가격 : " + a1.discountPrice(a1.discountRate) + "\n");
		
	}

}

콘솔 결과

 

'대덕인재개발원 > 대덕인재개발원_Java' 카테고리의 다른 글

230726 자바 강의  (0) 2023.07.26
230725 자바 강의  (0) 2023.07.25
230721 자바 강의  (0) 2023.07.21
230720 자바 강의  (0) 2023.07.20
230719 자바 강의  (0) 2023.07.19