2022. 10. 6. 08:22ㆍDev.Program/Java & Spring
451p
======== JAVA0406 → Ex.java
< java.util.Date 클래스 >
- 생성자가 되게 많음
빈 생성자
- 출력창 : 날짜 및 시각정보 나타남
- toString 오버라이딩 되어있기 때문에 출력이 가능함(toString 생략)
- 기본생성자를 호출하면 시스템의 현재 날짜 및 시각 정보를 사용하여 객체 생성
- 출력창
- 생성자에 long 타입 값을 전달하면 해당 값에 맞는 객체 생성
- 0을 줬을 때의 기본 값
- 우리가 long 타입으로 설정 할 일은 없다:)
- 뭔가 이상하게 출력됨! (deprecated)
- 기준인 1900년과 2020년의 차이인 120년만 리턴해줌(year)
- 우리가 전달 받을때는 +1, 세팅할때는 -1 해줘야함
- 그래서 3월이라고 뜨는 거!
- 이렇게 바꿔야함
- 아무튼 이건 잘 안씀! (deprecate 처리)
- 밀리초
- getTime() 메서드는 long 타입 날짜 정보를 리턴하므로 두 getTime() 결과를 연산하면 두 날짜 간의 차이를 계산 가능
- 일 단위로 변경하려면 밀리초 → 초 → 분 → 시 → 일 순서로 변환해야함
- 이걸로 휴대폰 d-day 어플 같은거 만드는거
- 잘 안씀!
454 calendar
======== Ex2.java
< java.util.Calendar 클래스 >
- 주로 날짜 또는 시각을 조정하는 용도의 클래스(표현도 가능)
- 추상클래스이므로 인스턴스 생성없이 싱글톤 패턴으로 제공되는 인스턴스를
getInstance() 메서드로 가져다 사용
- get() 메서드로 날짜 및 시각 정보를 가져오고, set() 메서드로 설정
⇒ 파라미터로 날짜 및 시각 모드 설정을 위한 상수 적용
- 주소가 나오지 않는거보면 toString 이 오버라이딩 된 것을 알수있다
- 근데 우리가 읽기는 어려워서 잘 안씀
> 우리가 가져올 게 정수인지 아닌지(파라미터값을 뭘 줘야할지 모르겠다면)
클래스명. 한 번 찍어보기
- 인트형이구나! 나옴~~
- day는 day가 없음 day of month
456p
< Calendar 와 Date 사이의 형변환 >
1. Calendar → Date 로 변환
- Calendar 객체의 getTime() 메서드 호출하여 Date 타입으로 리턴
Date date = cal.getTime(); |
2. Date → Calendar 로 변환
- Calendar 객체가 있는 상태에서 setTime() 메서드 파라미터로 Date 객체 전달
cal.setTime(date); |
459 util.Date()
======== Ex3.java
< java.util.Date 패키지 >
- 날짜 및 시각 정보를 관리하는 패키지로 JDK 8 부터 사용됨
- LocalDate : 날짜 관련 기능
- LocalTime : 시각 관련 기능
- LocalDateTime : 날짜와 시각 관련 기능
- toString() 오버라이딩 되어 있음
- 각 클래스의 now() 메서드 호출 시 현재 시스템의 정보 가져옴
- 각 클래스의 of() 메서드를 호출하면, 날짜 및 시각 정보 설정 가능
- getXXX() 메서드를 호출하여 정보 가져오기
⇒ XXX 은 가져올 정보의 종류
- toString() 오버라이딩 되어있음
- month 는 잘 안씀 위에거 쓰면 됨
- 이렇게 직관적으로 원하는 거 바로바로 뽑아낼 수 있다!
- 시(time)도 마찬가지
- dateTime 은 date와 time 합친거라 생각
- month 는 오류남! 이게 위에 봤던 month 타입객체
- month는 monthValue 로 해야함
- date.getMonthValue() 오류 사라짐!
- 출력창
- time은 시간에서 getHour() 밖에 없고 24시간제
- 제일 간편해서 자주 쓰임! 직관적이고 간단하다!
< Month 활용법 >
- Enum은 값을 나열만 하면 됨(안에 저장 되어 있으니까 Enum 타입 객체로 리턴됨)
- 출력
- 월 이름(영문) 바로 출력됨
- 그냥 이렇게는 저장 안됨
- String 타입 변환 시 name() 메서드 호출
> Month 객체를 한국 기준 표현법으로 변환할 경우
- 모르는건 클래스명. 찍어보기
- April → 4월로 변환되어서 나옴
- Full 은 Short 로 바꿔도 상관없다(영어권에서는 APRIL 과 APR이 있기 때문에 구분)
- 오늘날짜 나옴
- 리턴타입 LocalDateTime
- 두달 뒤면 6월 6일 이렇게 계산해줌!
- 일수도 계산
- 1개월 15일 후 출력
- 이런식으로 계산 가능
- 빌더 패턴을 활용하여 리턴타입이 자기 자신인 객체의 다음 메서드 연결 가능
> 이전 날짜로 하고 싶다면 plus 만 minus 로 바꿔주면 된다!
- 해당 객체의 plusXXX() 메서드 또는 minusXXX() 메서드를 호출하여 연산 가능
461
465
- 출력창
- 그냥 단순한 문자열이었던 데이터를 LocalDateTime 객체로 만들어줌
- 년 / 월 / 일 / 시 / 분 / 초 다 따로 관리할 수 있게 됨!
- ( 날짜 plus minus 도 가능해짐 )
- 이렇게 하고 싶으면
- 패턴도 똑같이 일치시키면 됨!
476
479
======== Ex4.java
< SimpleDateFormat >
1. SimpleDateFormat 클래스 사용
- SimpleDateFormat
1-1. SimpleDateFormat 클래스 객체 생성
⇒ 파라미터로 패턴 문자열 전달
1-2. SimpleDateFormat 객체의 format() 메서드를 호출하여 Date 객체 전달
- 출력창(형태가 바뀌어져서 나옴)
- 위에 처럼 바로 출력하거나
- 이렇게 String 타입으로 저장해서 출력하는 것도 가능
> 이걸 Ex3.java에도 적용가능
<Ex3.java>
패턴을 적용하여 LocalDateTime 객체를 원하는 형식의 문자열로 리턴
- 똑같이 적용 가능! (우리가 만들어 둔 패턴 모양대로 출력됨)
<Ex4.java>
2. DateTimeFormatter 클래스 사용
1-1. DateTimeFormatter 객체를 가져오기 위해 ofPattern() 메서드 호출
⇒ 파라미터로 패턴 문자열 전달
1-2. LocalDate 등의 날짜 및 시각 클래스 객체의 format() 메서드 호출
⇒ DateTimeFormatter 객체(패턴)를 전달
- 출력창
- 이 버전이 더 최근에 만들어진거! 예전엔 위에꺼 많이 썼는데 지금은 이것도 많이 씀
⇒ 패턴을 적용하는 객체가 다를 뿐, 둘은 사용법이 같다
480
< Message Format >
482 - 486
★ < 정규 표현식 처리 > ★
^x : x 로 시작하는 문자열
⇒ "x", "xa", "xxx", "xab" ...
x$ : x 로 끝나는 문자열
⇒ "x", "ax", "xxx", "abx" ...
.x : x 앞에 1개의 문자가 포함되는 문자열
⇒ "ax", "bx" ...
x+ : x가 1번 이상 반복되는 문자열
⇒ "x", "xx", "xxx" ...
x? : x가 나올 수도 있고, 나오지 않을 수도 있는 문자열
⇒ "x", "", "a" ...
x* : x가 0번 이상 반복되는 문자열
⇒ "a", "x", "xx", ...
x | y : x 또는 y 가 포함되는 문자열
⇒ "x", "y"
xa?y$
⇒ 시작 문자는 관계없으나 조건 중 맨 앞은 x 이고
두번째 문자에 a 는 있을 수도 있고, 없을 수도 있으며
마지막은 y 로 끝나야한다.
ex) xy(O), xay(O), xaay(X), hixy(O), hixay(O)
x|a?y$
⇒ x 이거나 a?y$ 인 문자열
[ 괄호 ]
(xy) ⇒ 괄호 안의 내용(xy) 가 그대로 포함된 것
x{n} ⇒ x가 n번 반복되는 문자열(정확히 n번)
ex) x{5} : "xxxxx"
x{n,} ⇒ x가 n번 이상 반복되는 문자열
ex) x{5,} : "xxxxx", "xxxxxx", "xxxxxxxxx", ...
x{n, m} ⇒ x가 n번 이상 m번 이하 반복되는 문자열
ex) x{2,5} : "xx", "xxx", "xxxx", "xxxxx"
ex) (a1){2}b{2,4}c{2,} ⇒ a1 이 2번, b 가 2 ~ 4번, c 가 2번 이상 반복
⇒ "a1a1bbcc", "a1a1bbbbccccccccccccccccccccccccccc"
대괄호[] 표기법은 문자의 구성요소를 확인
[a-z] : a ~ z 사이의 문자 1개(소문자)
[A-Z] : A ~ Z 사이의 문자 1개(대문자)
[0-9] : 0 ~ 9 사이의 숫자 1자리
[가-힣] : 한글 1글자
=============================
487
< 유용한 정규표현식 예 >
1. 한글 이름 : ^[가-힣]{2,5}$
- 한글로 시작해서 한글로 끝나며 반복횟수 최소 2회, 최대 5회
⇒ 한글 2글자 ~ 5글자까지
2. 휴대전화번호 : ^(010|011)[-\s]?\d{3,4}[-\s]?\d{4}$
-(010|011) : 010 또는 011
-[-\s]? : - 기호 또는 공백이 올 수도 있고 안 올 수도 있음
-\d{3,4} : 숫자 3자리 ~ 4자리
-\d{4} : 숫자 4자리
⇒ 010 또는 011로 시작하고, 다음에 - 또는 공백이 있거나 없거나,
다음에 숫자 3자리 ~ 4자리, 다음에 - 또는 공백이 있거나 없거나,
다음에 숫자 4자리로 끝
ex) 010-000-1234 (적합)
01112345678 (적합)
010)12345678 (부적합 ⇒ ')' 기호는 사용 불가)
010 1234 5678 (적합)
010-1234-567a (부적합 ⇒ 마지막에 숫자 4자리로 끝나야함)
3. 이메일 : ^[\w\.-]{1,64}@[\w\.-]{1,252}\.\w{2,4}$
-[\w\.-]{1,64} : 영어 단어 또는 .기호 또는 -기호 1글자 ~ 64글자(아이디)
-[\w\.-]{1,252} : 영어 단어 또는 .기호 또는 -기호 1글자 ~ 252글자
488p
======== Ex5.java
< Pattern 클래스 >
- 정규표현식 문자열을 객체로 관리하는 클래스
- compile() 메서드를 사용하여 정규표현식에 대한 객체 생성
- matches() 메서드를 사용하여 특정 문자열에 대한 정규표현식 패턴 검사 실시
- 복사 붙여넣기 했더니 \\ 두번으로 자동 변경됨
- 정규표현식으로 사용할 패턴 문자열 작성
⇒ 주의! \ 기호 사용 시 이스케이프 문자로 인식되므로 \\ 형태로 사용
또한, 마침표(.) 기호도 \\. 형태로 지정
1. 전화번호 형식 검증
- (010|011) : 010 또는 011
- [-\s]? : - 기호 또는 공백이 올 수도 있고 안 올 수도 있음
- \d{3,4} : 숫자 3자리 ~ 4자리
- \d{4} : 숫자 4자리
⇒ 010 또는 011로 시작하고, 다음에 - 또는 공백이 있거나 없거나,
다음에 숫자 3자리 ~ 4자리, 다음에 - 또는 공백이 있거나 없거나,
다음에 숫자 4자리로 끝
- 리턴타입 boolean
- 9만 추가해도 false 나옴!
> regex 빼고 전부 주석처리하고 배열로 알아보자
전화번호 배열 사용
- 배열로 여러가지 전화번호 형태 넣기
> 반복문 사용하여 유효성 검사 결과 출력
- 출력창
- Pattern.matches() 문자열에 대해서 regex 에 만들어놓은 규칙이 맞는지 안맞는지만 판별해줌!
490 Matcher
======== Ex6.java
< Matcher 클래스 >
> 정규표현식 문자열을 Pattern 객체로 변환 : Pattern.compile()
> 정규표현식이 포함된 Pattern 객체의 matcher() 메서드에 원본 문자열을 전달하여 Matcher 객체 리턴받음
⇒ 정규표현식에 있는 문자열 "JAVA" 와 원본 문자열은 100% 일치하지 않음
⇒ 첫 단어가 “JAVA” 로 시작되기 때문에 true
> 이게 제일 중요!!
- 맞는 말인데 왜 false가 나올까?
- 바로 위에 실행했던 lookingAt()을 주석처리하고 다시 실행해보기
- true 가 나온다
만약, lookingAt() 메서드 등을 사용하여 부분 검색 후에는 시작 인덱스가 변경되므로 리셋 필요
- Matcher 객체의 정보 리셋하여 인덱스를 0으로 다시 설정
> 리셋한 후에는 lookingAt() 주석 해제 해도 잘 나옴!
출력창
======== Ex7.java
정규표현식을 활용한 패스워드 유효성 검사(연습)
문제)
1. 패스워드 길이 : 8자 이상 16자 이하
2. 영문자, 숫자, 특수문자 조합
3. 영문자는 대문자 또는 소문자 사용 가능
4. 특수문자는 !@#$% 기호만 사용 가능
5. 영문자, 숫자, 특수문자 중 2가지 이상 조합해야함(이건 아직 안함)
- 답
- 이런식으로 유효성검사 가능
- 적합하게 바꾸면
- 결과가 바뀜!
- ⇒
Ex7.java
492p
- 근데 이러면 코드가 길다!
- if 문 안의 코드를 한 줄로 요약가능
⇒ 2점이상이기 때문에 적합!
⇒ 영문자로 다 바꿔버리면 규칙 부적합하다고 나옴!
- 영문자를 소문자와 대문자로 나눠보기!
- 그럼 이제 3가지 이상이 되어야 적합한 패스워드가 됨!
- 좀 더 복잡한 패스워드를 설정할 수 있도록 제어가능!
'Dev.Program > Java & Spring' 카테고리의 다른 글
JDBC(Java DataBase Connectivity) (0) | 2022.10.06 |
---|---|
예외(Exception) / 쓰레드(Thread) (1) | 2022.10.06 |
List 계열 / Map 계열 / Stack(스택) / Queue(큐) / 제네릭 / Random 클래스 (0) | 2022.10.06 |
Wrapper 클래스 / Collection Framework(컬렉션 프레임워크) (0) | 2022.10.06 |
[Math.random()] 로또 번호 생성 프로그램 (0) | 2022.10.06 |