일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 | 29 | 30 |
- EnhancedFor
- GRANT VIEW
- 정수형타입
- oracle
- 참조형변수
- cursor문
- 인터페이스
- 메소드오버로딩
- Java
- 자동차수리시스템
- 어윈 사용법
- 객체 비교
- 컬렉션 타입
- 사용자예외클래스생성
- 대덕인재개발원
- 다형성
- 환경설정
- 자바
- 예외처리
- 생성자오버로드
- 컬렉션프레임워크
- 집합_SET
- 한국건설관리시스템
- NestedFor
- 오라클
- 추상메서드
- exception
- 제네릭
- 예외미루기
- abstract
- Today
- Total
거니의 velog
230724 자바 강의 본문
[열거 타입]
클래스와 비슷한 형태이다. 클래스로 간주해도 틀림이 없다.
순서화 되어 있는 값들을 저장하는 방법
상수를 하나의 데이터 타입으로 관리하는 방법
일반 클래스나 인터페이스처럼 ~.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 |