java.util 클래스 / 정규표현식 / Pattern 클래스 / Matcher 클래스

2022. 10. 6. 08:22Dev.Program/Java & Spring

728x90

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가지 이상이 되어야 적합한 패스워드가 됨!
  • 좀 더 복잡한 패스워드를 설정할 수 있도록 제어가능!




728x90