본문 바로가기

Java153

[Java] 정규식 / 커스텀 정규식 / find() 와 matches()의 차이에 대해서 정규식(정규표현식) 요구사항에 따른 개발을 진행하다보면 사용자로부터 입력한 값을 검증하거나, 입력한 값으로부터 특정 부분을 추출하는 상황이 빈번히 발생한다. 예를 들면, 요구사항은 다음과 같다. 좌표 정보는 괄호"(", ")"로 둘러쌓여 있으며 쉼표(,)로 x값과 y값을 구분한다. "(1, 10)" x: 1 y: 10 "(5, 20)" x: 5 y: 20 "(3, 5)" x: 3 y: 5 java.lang.String 클래스의 split(), replaceALl() 등과 같이 문자열을 다루는 메서드를 사용해서 처리할 수도 있지만… java.util.regex 패키지에서 제공하는 Pattern 클래스와 Matcher 클래스를 사용하면 이를 해결해 보자. Pattern 클래스와 Matcher 클래스 우선, .. 2023. 5. 5.
refactor: 상속과 인터페이스 활용 해당 글은 NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드를 통해서 새롭게 배우고 내용을 기록한 글입니다. 1. 상황 가정 우리는 렌터카를 운영하고 있다. 현재 보유한 차량의 목록과 대수는 아래와 같다. Sonata : 2대 Avante : 1대 K5: 2대 차량을 예약할 때는 여행할 목적지의 이동거리를 입력받는다. 이때, 이동거리를 활용해 차량 별로 필요한 연료를 주입한다. 차량별 연비는 아래와 같다. Sonata : 10km/리터 Avante : 15km/리터 K5 : 13km/리터 2. 공통 기능을 구현할 클래스의 메서드 목록을 나열해보자. 리터당 이동 거리. 즉, 연비 ==> abstract double getDistancePerLiter(); 여행하려는 거리 ==> abstrac.. 2023. 4. 27.
[Java] 상태 데이터를 get하지 말고 메시지를 보내라. 해당 글은 NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드를 통해서 새롭게 배우고 내용을 기록한 글입니다. 상태 데이터를 get하지 말고, 메시지를 보내라 상태 데이터를 get 하지말라는 말의 의미를 이해해보자. public class Winners { private final List cars; private List findWinners(int maxPositionValue) { List winners = new ArrayList(); for( Car car : cars ) { if( car.getPosition() == maxPositionValue) winners.add(car); } return winners; } } 위 코드를 이해해보자. 'finWinners' 메서드는 최대 .. 2023. 4. 25.
[Java] 단일 책임 원칙(SRP)을 지키는 방법 / 모든 원시 값과 문자열을 포장 해당 글은 NEXTSTEP 자바 플레이그라운드 with TDD, 클린 코드를 통해서 새롭게 배우고 내용을 기록한 글입니다. 왜 모든 원시 값과 문자열을 포장해야할까? 아래 코드를 살펴보자. 현재 멤버 변수에는 'name'과 'position'이 존재 하며, 대충 봤을 때는 Car 클래스는 복잡도가 그렇게 높진 않다. 만약, 요구사항이 추가되어서 멤버 변수가 더 늘어나서 100개 이상이 된다면 어떨까? public class Car { private static final int MIN_FORWARD_VALUE = 4; private static final int MAX_NAME_LENGTH_VALUE = 5; private String name; private int position; public Car.. 2023. 4. 25.
[Java] 요구사항이 자주 변경되는 코드에 대한 리팩토링 / 전략 패턴 ( Strategy Pattern ) / 의존관계 주입(DI) 초기의 요구사항 package racing; public class Car { private static final int FORWARD_NUM = 4; private static final int MAX_BOUND = 10; private String name; private int position; public void move(int number) { if( isMove(number) ) { this.position += 1; } } private boolean isMove(int number) { return number >= MIN_FORWARD_NUMBER; } //생략.. } Car 라는 클래스는 Car의 이름을 의미하는 멤버변수 'name'과 Car의 위치를 의미하는 멤버변수 'positi.. 2023. 4. 24.
[Java] Matcher 클래스를 사용한 커스텀 구분자 지정 기존의 요구사항 기존에는 콤마(,)와 콜론(:)을 구분자로 사용했다고 가정하자. 그렇다면, 아래와 같은 메서드를 구현할 수 있다. private static String[] split(String text) { return text.split(",|:"); } 요구사항 변경 하지만, 요구사항이 사용자가 아래와 같이 "//"와 "\n" 문자 사이에 커스텀 구분자를 지정할 수 있다고 변경되었다고 한다면? 그렇다면 split() 메서드를 수정해야한다. //;\n1;2;3 아래와 같이 수정할 수 있다. private static String[] split(String text) { Matcher m = Pattern.compile("//(.)\n(.*)").matcher(text); if( m.find() ) .. 2023. 4. 18.