본문 바로가기

dev/자바

(27)
Java Pattern 정규표현식 자바에서 Pattern 클래스를 통해 정규표현식을 처리할 수 있습니다. 위의 테스트 코드를 보면 @CsvSource를 통해 전화번호 정규표현식을 테스트하고 있습니다. 첫번째 문자열은 테스트 문자열이고, 두번째 문자열은 기대치 문자열입니다. 전화번호 정규표현식을 생성합니다.(19라인) 메소드 체이닝을 통해 앞의 전화번호 정규표현식을 컴파일하여 Pattern 객체를 생성하고 주어진 문자열이 정규표현식에 맞는지 확인하는 Matcher 객체를 생성합니다. Matcher 객체를 통해 주어진 전화번호가 정규표현식에 맞는지 확인합니다.(22 ~ 31라인) 22라인의 전화번호 유효성 확인하는 코드를 "Pattern.matches(reg, testStr);"으로 간단하게 수정할 수 있습니다. 정규표현식에 맞으면 기대했던..
Java thread lock synchronized 자바 멀티 스레드 환경에서 동시에 접근하는 자원이 있는 경우 동기화 처리가 필요합니다. 예를 들어 은행 계좌 이체나 티켓 예매 로직 같은 경우 동기화가 적용되어야 합니다. 위의 Ticket.java의 reserveTicket 메소드는 Lock 객체를 통해 주어진 티켓 수만큼 예매하고 있습니다.(22 ~ 35라인) Lock 객체 lock 메소드와 unlock 메소드 사이에 있는 코드는 동기화 처리되어 있어서 남아있는 티켓 수가 0보다 큰 경우 예매가 가능하고 0보다 작으면 예매가 되지 않고 있습니다. lock.lock()은 잠금을 설정하고, lock.unlock()은 잠금을 해제하고 있습니다. finally 블럭에 lock.unlock() 한 이유는 예외 발생 여부와 상관없이 잠금을 해제하기 위해서입니다...
JDK 11 FileReader Encoding JDK 11 버전부터 FileReader 생성자에 인코딩을 설정할 수 있습니다. 11 이하 버전에서 인코딩을 통해서 파일을 읽으려면 예를 들어 FileInputStream fis = new FileInputStream(fileName); InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8")); BufferedReader br = new BufferedReader(isr); 이런 식으로 InputStreamReader를 사용해야 하는데 그럴 필요 없이 FileReader로 쉽게 해결할 수 있어서 유용합니다. 인코딩이 포함된 FileReader 생성자로 파일을 읽으면 정상적으로 출력되는 것을 확인할 수 있습니다. 인코딩이 포함..
Java List Stream Stream은 jdk8 버전부터 추가된 것으로 컬렉션의 저장요소를 1개씩 읽어서 람다로 처리하는 역할을 합니다. 예제 Stream 코드에 대해 설명하면 9~18라인: DataDto 객체 6개를 생성하여 List에 추가합니다. 21~24라인: List의 Stream을 통해 DataDto의 val1과 val2을 더한 값을 sum 속성에 추가하고 출력합니다. 25라인: sum 값이 10보다 큰 요소만 걸러냅니다. 20, 26라인: 중간처리 한 요소들을 수집하여 resList에 저장합니다. 31~33라인: resList 요소를 Stream으로 출력합니다. 예제 코드를 실행하면 위와 같이 정상적으로 출력된 것을 확인할 수 있습니다. Stream과 Lambda를 통해 불필요한 코드를 줄일 수 있고 병렬 처리가 가능..
Comparator&Comparable 인터페이스 자바에서 객체를 정렬할 때 Comparator 인터페이스와 Comparable 인터페이스를 자주 사용합니다. 두 인터페이스의 차이점에 대해 알아보겠습니다. 먼저 Comparator 인터페이스는 정렬하는 메소드가 객체에 있지 않습니다. Comparator 인터페이스를 구현한 TestObjComparator 클래스는 정렬 메소드 compare를 재정의하고 있습니다. Comparator 인터페이스 구현할 때 TestObj 클래스를 제너릭으로 받아서 TestObj의 속성 val1과 val2를 기준으로 오름차순으로 정렬하고 있습니다. 먼저 val1 기준으로 오름차순으로 정렬하고, val1이 같은 경우 val2 기준으로 오름차순으로 정렬합니다. TestObj 객체를 생성한 뒤 리스트에 추가하고 TestObjComp..
csv parsing lambda stream 자바에서 csv 파일 파싱하는 방법은 여러 가지가 있는데 그중에 람다와 스트림을 사용하는 방법이 있습니다. 파싱 할 csv 파일은 공공데이터 포털에서 받은 "서울시 지하철호선별 역별 승하차 인원.csv" 파일입니다. 사용일자, 호선명, 역명, 승차총승객수, 하차총승객수, 등록일자로 구성된 csv 파일입니다. 지하철 정보를 저장할 MetroInfo 클래스입니다. csv 파싱 예제 코드에 대해 설명하면 14~15라인: try-with-resources를 사용하여 FileReader, BufferedReader 객체의 close를 자동호출 처리 FileReader, BufferedReader 둘 다 AutoCloseable 인터페이스 구현 클래스 17~29라인: Cosumer 람다 표현식을 사용하여 csv 파..
Domain 객체 메모리 사용자 요청 정보를 받거나 DB 데이터 조회할 때 Domain 객체를 사용하지 않고 Map을 사용하는 것은 메모리 효율 측면에서 봤을 때 좋지 않습니다. Map을 사용하면 메모리 대략 5MB 사용하는 것을 확인할 수 있습니다. Domain 객체를 사용하면 대략 4MB 사용하는 것을 확인할 수 있습니다. 앞의 Map과 비교하면 1MB 정도 차이가 있습니다. 따라서 Map 대신에 Domain 객체를 사용하는 것이 메모리 효율 측면에서 좋고 유지보수 업무를 파악할 때도 유리하기 때문에 Domain 객체 사용하는 것을 권장합니다.
Java Builder 패턴 생성자를 통해 객체를 생성할 때 필드가 많으면 주로 점층적 생성자 패턴을 사용합니다. 이렇게 사용하면 필드 개수에 따라 생성자를 계속 만들어줘야 되는 불편함이 있습니다. 이러한 단점을 Builder 패턴을 통해 해결할 수 있습니다. 위의 예제를 보면 첫번째 p 객체는 모든 필드를 초기화했고 두번째 p2 객체는 name과 age만 초기화했습니다. Builder 패턴을 사용하면 원하는 필드들만 초기화해서 객체를 생성할 수 있습니다.