본문 바로가기
교육/Java&Spring

kosta 클라우드 네이티브 애플리케이션 개발 과정 day 16

by Renechoi 2023. 1. 10.

kosta 클라우드 네이티브 애플리케이션 개발 과정 day 16


calendar api를 사용해서 날짜를 계산해보는 간단한 예시 

 

package kosta.basic.day015.api.calender;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class PracticeCalender2 {
    public static void main(String[] args) {
        // 입사일 입력 => 몇년 몇개월

        String pattern = "yyyy/MM/dd";
        DateFormat dateFormat = new SimpleDateFormat(pattern);

        Scanner scanner = new Scanner(System.in);
        System.out.printf("날짜를 " + pattern + "형태로 입력하세요. (e.g. 2023/01/01): ");
        Date dateInput = null;

        while (scanner.hasNext()){
            try {
                dateInput = dateFormat.parse(scanner.nextLine());

            }catch (Exception e){
                System.out.println("다시 입력하세요 ");
            }


        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dateInput);

        Calendar today = Calendar.getInstance();

        long workDates = (today.getTimeInMillis() - calendar.getTimeInMillis()) / (24*60*60*1000);
        int date = (int) workDates/30;
        int year = date / 12;
        int month = date % 12;
        System.out.println(workDates);
    }
}

 

 


 

정규 표현식 regex에 대해서 공부해보자 ! 

 

 

정규 표현식은 문자열에 대해 효율적인 분석과 통계 산출을 가능하게 해준다 ! 

 

 

'.' 

- 임의의 한 문자를 의미

- '.'이 위치한 곳에는 반드시 임의의 한 글자가 위치하여야 함 

 

'*' 

- 바로 앞의 문자가 없거나 하나 이상 반복 

- *d 같은 표현은 불가능 (별표는 앞에 있으면 안됨) 

 

'+'

- *과 흡사하지만 +는 반드시 하나 이상의 문자가 반복 

- hello+ => hello, helloo, hellooo 등 

- ab+c => abc, abbc, abbbc 등 

- +d 는 표현 불가 

 

'?' 

- 바로 앞의 문자가 없거나 하나임을 의미 

- A?c => c, Ac 중 하나 

 

'^' 

- 문자의 처음을 나타냄 -> 단어로 문장이 시작됨을 의미 

- ^Hello => Hello World, Hello Java 등

- ^The => The pen, Them, book 

 

'$' 

- 문장의 끝을 나타냄 

- world$ => hello java world 

 

 

[] 

- 괄호 안의 문자 중 일치하는 것을 검색 

- [abc] => abc 중 하나 

- [a-z] => 알파벳 소문자 

- [A-Z] => 알파벳 대문자 

- [a-zA-Z0-9] => 영문 대소문자+숫자 

 

c.f. 한글 regex 

- (\S*[\u3131-\u314e|\u314f-\u3163|\uac00-\ud7a3]+\S*)

- /[ㄱ-|-|-힣]/;

 

[] 안에서의 ^ 

- not 기능을 함 

- [] 특수 문자 안에 있는 문자를 포함하고 있지 않는 모든 문자열을 찾고자 할 경우 

-[^abc]de => dde, fde, zde 등 

- a[^0-9]c => abc, acc, adc 등 

 

 

{}

- 특수문자 앞의 문자가 반복되는 횟수를 의미 

- Gu{5}ggle => Guuuuuuggle 

 

 

() 

- ()안의 문자열을 하나로 취급 

- (Hello){3} => HelloHelloHello 

 

- or 연산을 수행 

 

 

기타 표현 

 

\w   : 알파벳이나 숫자를 의미 

\W  : 알파벳이나 숫자를 제외한 문자 

\d   : 숫자 [0-9] 

\D   : 숫자를 제외한 모든 문자 

^[0-9]*$ :숫자만 

^[a-zA-Z]*$ : 영문자만 

^[가-힣]*$ 

^[a-zA-Z0-9]*$ : 영어/숫자만

[[:space:]] : 공백 

 

 

 

 

표현 예시 

이메일 ^[a-zA-Z0-9]+@[a-zA-Z0-9]+(.[\w]+)

이메일 ^[_0-9a_zA-Z-]+@[0-9a-zA-Z]+(.[_0-9a-zA-Z]+)*$

휴대폰 ^01(?:0|1|[6-9])-(\d{3,4})-\d{4}$

일반전화 ^\d{2,3}-\d{3,4}-\d{4}$

주민번호 \d{6}-[1-4]\d{6}

ip주소 ([0-9]{1,3})\.{([0-9]{1,3})\.{([0-9]{1,3})\.{[0-9]{1,3})

인터넷 주소 ([\\p

 

 

 

?= 

 

?= is a positive lookahead, a type of zero-width assertion. What it's saying is that the captured match must be followed by whatever is within the parentheses but that part isn't captured.

Your example means the match needs to be followed by zero or more characters and then a digit (but again that part isn't captured).

 

 

 

X?=Y 

-> X if followed by Y 

 

 

 

\s 

공백문자 

 


 

정규표현식을 객체화 하기 

 

Pattern pattern = Pattern.compile("regex"); 

 

 

 

정규표현식 예제 

 

package kosta.basic.day016.regex;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexExam2 {
    public static void main(String[] args) {
//    서울특별시 마포구에 사는 사람은 1명
//    부산광역시 동구에 사는 사람은 2명
//    서울특별시 중랑구에 사는 사람은 2명
//    서울특별시 노원구에 사는 사람은 1명
//    인천광역시 남동구에 사는 사람은 1명
//    경기도 구리시에 사는 사람은 1명
//    서울 중랑구에 사는 사람은 1명
//    서울특별시 구로구에 사는 사람은 1명
//    충청남도 예산군에 사는 사람은 1명
//    충청남도 천안시에 사는 사람은 1명
//    충청남도 당진시에 사는 사람은 1명

//        String regex = "((\\w)*도)?((\\w)*시)?((\\w)*군)?";   // ㅇㅇ시   ㅇㅇ구    ㅇㅇ로    숫자  (옵션)
        String regex = "(((([가-힣])+(시|도))|서울|부산|대구)\\s[가-힣]+(시|구|군))";   // ㅇㅇ시   ㅇㅇ구    ㅇㅇ로    숫자  (옵션)
        //~시에 살거나 서울, 인천, 대구, 광주, 부산, 울산 의 주소를 가지고 뒤쪽에 시, 군,구 로 끝나는 부분을
        Map<String, Integer> map = new HashMap<String, Integer>();
        //키워드와 갯수를 가지는 리스트에
        String[] addresses = { "서울특별시 중랑구 공릉로 13길 27", "서울특별시 중랑구 겸재로 68 (면목동)",
                "서울특별시 노원구 공릉로 95 (공릉동)",
                "서울특별시 구로구 가마산로 77 (구로동)", "서울특별시 마포구 가양대로 1 (상암동)",
                "충청남도 천안시 동남구 성남면 5산단1로 22",
                "부산광역시 동구 고관로 5 (초량동)", "인천광역시 남동구 간석로 2 (간석동)",
                "충청남도 예산군 신암면 오신로 852-2", "충청남도 당진시 우강면 박원로 138",
                "부산광역시 동구 중앙대로 243-13 (초량동)", "경기도 구리시 동구릉로136번길 47 (인창동)",
                "서울 중랑구 공릉로 13길 27" };

        Pattern pattern = Pattern.compile(regex);
        for (String address : addresses) {
            Matcher matcher = pattern.matcher(address);
            if (matcher.find())
                map.put(matcher.group(), map.getOrDefault(matcher.group(), 0) + 1);
        }

        for (Map.Entry<String, Integer> s : map.entrySet())
            System.out.println(s.getKey() + "에 사는 사람은 " + s.getValue() + "명");

    }
}

 

 

 


래퍼 클래스에 대해 알아보자 ! 

 

Integer, Boolean, Byte, Short, Character, Double, Float 

 

=> 기본형 데이터 타입에 대한 클래스가 존재한다 

 

object와 호환될 때 (collection에서 사용될 때) 기본형 타입은 사용할 수 없다. 

 

이것을 극복하기 위해 만들어진 클래스 = 각각의 기본형 데이터 타입에 대한 전용 클래스 => 래퍼 클래스 

 

 

 

박싱과 언박싱 

 

기본형 => 객체 타입 (박싱) 

객체 => 기본형 (언박싱) 

 

Integer obj = new Integer(12000); // boxing 

int num = obj.intValue(); // unboxing

 

 

 


자료 구조를 배워보자 ! 

 

자료 구조란 : 데이터를 효율적으로 사용할 수 있도록 구조를 만들어 저장해둔 것 

- 리스트

- 스택

- 큐

- 해시 테이블

- 집합 

 

 

자바의 자료구조 

List : 순서가 있다. 중복을 허용한다.  (배열보다 편하다 : 제한을 미리 하지 않음, 실제 데이터의 개수를 알아낼 수 있다, 등등 여러 구현된 기능들)  

Set : 중복을 허용하지 않는다(e.g. 로또) 

Map : key와 value를 쌍으로 저장한다. 

 

 

stack : 처음 들어온 것이 맨 마지막에 나감 (브라우저의 뒤로가기) 

queue : 처음 들어간 것이 처음 나오도록 하는 것 (키오스크의 주문) 

 

 

JDK 라이브러리의 자료구조 클래스들 

 

리스트 : ArrayList LinkedList (Vetor)

스택 : LinkedList (Stack)

큐 : LinkedList

해쉬 테이블 : HashMap (HashTable)

집합 : HashSet 

 

*Vector, Stack, Hashtable은 구버전 

 

 

 

List<String> list = new ArrayList<String>();

 

// List 자료구조를 활용하여 키보드로부터 입력받은 문자열을 처리하자
// 1. 데이터추가 2. 데이터 삭제 3. 전체출력

String inputString = getInput();
Validator numericValidator = new Validator(new NumberFormatValidator());
numericValidator.validate(inputString);

List<String> stringList = new ArrayList<>();

switch (inputString){
    case "1" -> addFunction();
    case "2" -> removeFunction();
    case "3" -> printFunction();
}

 

 

 


데이터 값의 수정 삭제에 있어서 ArrayList는 연산이 많다 

=> 성능의 저하 

 

한편, LinkedList는 서로를 참조할 수 있도록 한다. 

 

list.add(2, "키위); 

=> 중간에 키위를 삽입하려고 할 때

딸기와 복숭아 사이에 새로운 링크를 맺는다. => 메모리 주소를 수정만 하면 됨 

 

삭제할 때도 마찬가지 

오렌지 - 딸기 - 키위 

 

딸기를 삭제하고 싶다면 ? 

오렌지와 딸기, 딸기와 키위의 참조 연결을 제거함 

 

ArrayList Vs. LinkedList 

- 일상적인 수정 삭제가 많은 경우 : LinkedList  

- 전체를 순회해야 하는 경우 : ArrayList 

 

 

 

반응형