날짜와 시간 클래스
LocalDate.now() : 현재 날짜(년, 월, 일)를 반환한다.
LocalTime.now() : 현재 시각(시, 분, 초)을 반환한다.
LocalDatetime.now() : 현재 날짜와 시각을 반환한다.
LocalDate.of(년, 월, 일) : 입력한 날짜(년, 월, 일)로 객체를 생성한다.
LocalTime.of(시, 분) : 입력한 시각(시, 분)으로 객체를 생성한다.
plusDays(a) : 특정 날짜로부터 a일 후를 계산한다.
minusDays(a) : 특정 날짜로부터 a일 전을 계산한다.
Period.between(start, end).getYears() :두 날짜의 년 사이의 간격이 몇 년인지 계산한다.
Period.between(start, end).getMonths() :두 날짜의 달 사이의 간격이 몇 개월인지 계산한다.
Period.between(start, end).getDays() :두 날짜의 일 사이의 간격이 며칠인지 계산한다.
ChronoUnit.DAYS.between(start, end) : 두 날짜 사이의 간격이 며칠인지 계산한다.
ChronoUnit.YEARS.between(start, end) : 두 날짜 사이의 간격이 몇 년인지 계산한다.
추상 클래스 예제: Credit Card
문제
[[CreditCard 추상클래스 설계]]
1. 필드
접근한정자는 protected 로 하세요.
String owner , int limit, int payTotal
(소유자, 이용한도, 결제금액)
2. 생성자
owner 필드값을 저장하는 커스텀 생성자만 정의합니다.
3. getter 메소드
각 필드값을 가져오는 메소드 정의합니다.
4. 추상메소드 선언
반환값 int , 이름 upLimit , 인자 int plus 1개 -> 이용한도 올리는 메소드입니다.
반환값 int , 이름 pay , 인자 int money 1개 -> 카드사용하는 메소드 입니다. money 금액을 결제합니다.
CreditCard 추상 클래스
[[KakaoMini 클래스 설계]]
1. CreditCard 클래스 상속
2. 생성자- 부모클래스의 설계에 따라 정의합니다.
3. 상수 필드 MAX_LIMIT = 100000 선언합니다.
4. toString 메소드 재정의 : 아래형식의 문자열 반환
홍길동 님. 이번달 결제예정금액 xxx,xxx 원 입니다.
[이용한도 yyy,yyy 원]
5. 추상메소드 구현
upLimit : plus 는 한도를 올리는 금액입니다. limit+plus 가 MAX_LIMIT을 초과하지 못하도록 한다.
초과하면 0을 리턴/ 초과하지 않으면 limit을 plus만큼 더하고, plus를 리턴합니다.
pay : money 가 사용 금액입니다. money를 사용했을때 limit 를 초과하지 못하도록 합니다.
money+payTotal 이 limit 보다 크면 0을 리턴
초과하지않으면 money 금액 결제를 처리하여 payTotal에 더하고, money를 리턴합니다.
KakaoMini 클래스
7라인 상수 MAX_LIMIT을 10만으로 선언한다.
9~10라인 커스텀 생성자를 선언하고 CreditCard의 생성자 메소드를 호출한다.
14라인~17라인 toString() 메소드를 재정의하고 DecimalFormat 객체를 생성하여 형식을 설정한다.
20~22라인 추상 메소드 upLimit을 재정의한다. limit+plus가 MAX_LIMIT을 초과하면 0을 반환한다.
23~25라인 limit+plus가 MAX_LIMIT 이하라면 limit에 plus를 더하고 plus값을 반환한다.
28~30라인 추상 메소드 pay()를 재정의한다. money+payTotal이 limit을 초과하면 0을 반환한다,
31~33라인 money+payTotal이 limit 이하라면 payTotal에 money를 더하고 money값을 반환한다.
KakaoVIP 클래스
7라인 상수 필드 MAX_LIMIT을 2000만으로 선언한다.
9라인 point 필드를 선언한다.
11~14라인 CreditCard 클래스의 커스텀 생성자를 호출한다.
19~22라인 toString() 메소드를 재정의한다.
26~30라인 추상 메소드 upLimit()를 재정의한다. KakaoMini의 upLimit() 메소드와 다르게 한도 제한이 없다.
33라인 추상 메소드 pay()를 재정의한다.
35,36라인 만약 payTotal+money가 limit을 초과하면 한도(limit)를 500만원 증가시킨다.
37라인 point에 money(사용 금액)의 1%를 적립한다.
CreditCardTest
8라인 사용자(owner)가 "모모"인 KakaoMini 객체를 생성한다.
9라인 한도(limit)를 5만원으로 설정한다.
10라인 mini를 출력한다(toString() 생략)
13라인 사용자(owner)가 "사나", 한도(limit)가 200만원인 KakaoVIP 객체를 생성한다.
14라인 vip를 출력한다.
18라인 mini.pay(5000)가 0 (money+payTotal>limit) 즉, 한도를 초과했다면 한도 초과 메시지를 출력한다.
19라인 mini.pay(5000)가 0이 아니라면 결제예정금액(payTotal)에 사용금액(money)을 더한다.
22라인 payTotal에 50만원을 더한다.
24라인 payTotal에 550만원을 더하고 payTotal+money가 limit보다 크므로 한도를 500만원 증가시킨다.
26라인 mini.pay(200000)가 0이라면 한도 초과 메시지를 출력한다.
27라인 mini.pay(200000)가 0이 아니라면 결제 완료 메시지를 출력한다.
인터페이스(Interface)
인터페이스 객체를 생성할 수 없다.
상수 필드를 갖는다. → public static final 키워드는 생략한다.
추상 메소드를 갖는다. → public abstract 키워드는 생략한다.
static 메소드와 인스턴스 메소드(반드시 default 키워드 사용)도 사용할 수 있다.
다형성 구현을 위한 대표적인 방법이다.
여러 객체들과 사용이 가능하기 때문에 어떤 객체를 사용하는지에 따라 실행 내용과 리턴 값이 다를 수 있다.
→ 코드의 변경 없이 실행 내용과 리턴 값을 다양하게 할 수 있다.
InterfaceA
13라인 상수 필드를 선언한다.
16,17라인 추상 메소드 methodA(), methodB()를 선언한다.
20라인 static 메소드를 선언한다.
23라인 default 키워드로 인스턴스 메소드를 선언한다.
InterfaceB
추상 메소드 methodBa()를 선언한다.
구현 클래스
클래스 선언 시 implements 키워드와 인터페이스 이름을 작성한다.
인터페이스에서 선언된 추상 메소드를 반드시 구현(재정의)해야 한다.
구현 클래스를 작성하면 객체를 생성하여 인터페이스 변수에 참조시킬 수 있다.
한 개의 구현 클래스에 여러 개의 인터페이스를 구현할 수 있다. → 인터페이스는 다중 구현이 가능하다.
ClassA
4라인 implements 키워드로 인터페이스의 이름을 작성하여 구현 클래스 MyClassA를 선언한다.
8~15라인 InterfaceA에 선언된 추상메소드 methodA, methodB를 구현한다.
ClassAB
4라인 InterfaceA, InterfaceB를 MyClassAB에 다중 구현한다.
8라인 InterfaceB에 선언된 추상 메소드 methodBa를 구현한다.
13~18라인 InterfaceA에 선언된 추상 메소드 methodA, methodB를 구현한다.
InterfaceTest
인터페이스로는 객체를 생성할 수 없고 인터페이스 타입으로 객체를 참조한다.
13라인 MyClassA는 InterfaceA를 구현하므로 InterfaceA 타입으로 MyClassA 객체를 참조할 수 있다.
14라인 MyClassAB는 InterfaceA를 구현하므로 InterfaceA 타입으로 MyClassAB 객체를 참조할 수 있다.
16라인 MyClassAB는 InterfaceB를 구현하므로 InterfaceB 타입으로 MyClassAB 객체를 참조할 수 있다.
17라인 MyClassA는 InterfaceB를 구현하지 않으므로 InterfaceB 타입으로 MyClassA 객체를 참조할 수 없다.
19라인 InterfaceA 타입으로 참조하는 객체를 참조할 수 있는 배열을 선언하고 길이를 3으로 한다.
CharSequence 인터페이스
java doc 8에서 CharSequence 인터페이스를 찾아 보았다.
CharSequence를 구현한 클래스는 CharBuffer, Segment, String, StringBuffer, StringBuilder가 있다.
contains() 메소드에 커서를 올려 놓으면 CharSequence 타입 변수를 인자로 받는 것을 확인할 수 있다.
인터페이스가 참조하는 변수에 구현 클래스의 객체를 대입할 수 있다.
즉, CharBuffer, Segment, String, StringBuffer, StringBuilder 타입 변수(객체)도 인자로 대입할 수 있다.
CharSequence 예제
14~17라인 String 객체를 참조하는 변수 result에 for문으로 문자열 추가를 반복한다.
18라인 hashcode() 메소드로 객체의 주소 값을 확인하면, 문자열을 추가할 때마다 주소가 달라진다.
21라인 StringBuilder 객체를 참조하는 변수 sb를 선언한다.
22,23라인 변수 sb에 for문과 append() 메소드로 문자열 추가를 반복한다.
26라인 hashcode() 메소드로 객체의 주소 값을 확인하면, 문자열을 추가해도 주소가 같다.
StringBuillder 클래스는 문자열을 연결할 때 append 메소드를 사용한다.
문자열의 내용이 바뀌어도 객체 자체는 그대로이다.
→ 반복되는 연결 연산에 효율적이다.
List 인터페이스의 구현 클래스로 ArrayList, Vector 등이 있다.
Map 인터페이스의 구현 클래스로 HashMap, TreeMap 등이 있다.
37라인 List 타입으로 names 변수를 선언하고 ArrayList 객체를 참조한다.
38라인 names로 Vector 객체를 참조할 수 있다. → 같은 변수명으로 다른 클래스 구현 객체를 참조할 수 있다.
40라인 Map 타입으로 map 변수를 선언하고 HashMap 객체를 참조한다.
41라인 map으로 TreeMap 객체를 참조할 수 있다.
'수업 일지 > JAVA' 카테고리의 다른 글
18일차 - [JAVA] StringTokenizer 클래스/split()/asList() (0) | 2022.01.24 |
---|---|
17일차 - [JAVA] 다형성/Comparator/Comparable 인터페이스 (0) | 2022.01.22 |
15일차 - [JAVA] Math 클래스/예외 처리/파일 입력/파일 출력 (0) | 2022.01.19 |
14일차 - [JAVA] 추상클래스 예제/ArrayList 예제/메소드 오버로딩 (0) | 2022.01.18 |
13일차 - [JAVA] Map/증감 연산자/추상 클래스 (0) | 2022.01.17 |
댓글