꼬물꼬물

다우기술 문제풀이 회고 본문

스터디/JAVA

다우기술 문제풀이 회고

멩주 2022. 10. 26. 15:14

1. 변수/함수명

String addr = Arrays.toString(nextLine);
if (K++ == 0) continue;
addr  = addr.replaceAll("[\\[\\]]", "");
String[] split = addr.split(",");

K, split 등 너무 제멋대로 변수명을 지정해놓았다.

아무리 급해도 생각하고 코드를 짤 것

 

2. 예외처리 (try-with-resources)

throws는 왜썼니. 생각하고 코딩해라.

try-catch-finally -> try-with-resources

openCSV 라이브러리 사용

try (
    CSVReader csvReader = new CSVReader(new FileReader(path))
){
    String[] nextLine;
    while ((nextLine = csvReader.readNext()) != null) {
        userList.add(new User(nextLine[0].trim(), nextLine[1].trim(), nextLine[2].trim(), nextLine[3].trim(), nextLine[4].trim()));
    }
} catch (IOException e){
    e.printStackTrace();
}

try문이 예외없든 예외가 발생하든 ()안에 사용한 자원을 반환해준다. 여기서는 csvReader.close()가 실행된다.

  • try () 안에 반환될 자원을 명시해준다.
  • 여러줄이 들어갈 수 있으며 ';'를 사용해 문장을 구분한다.
  • AutoClosable을 상속받은 경우에만 try-with-resources(자원 자동 반환)를 사용할 수 있다.
public class CSVReader implements Closeable { ... }
public interface Closeable extends AutoCloseable { ... }

 

3. 역할 구분

하나의 클래스 내에 해야한다면 메소드로, 아니라면 역할을 구분하자.

  1. 자원을 읽기/쓰기
  2. 자원을 사용하기

 

SOLID 원칙 중 SRP

  • 단일 책임 원칙: 클래스는 하나의 책임만을 가져야한다.

csvUtil과 Service로 분리하자.

분리할 경우 Service에서 util을 사용하려면 의존관계 주입이 필요하다.

 

1. 생성자 주입 

  • 불변성. 생성자는 클래스가 생성될 때, 딱 한번만 실행된다.
private final CsvUtil csvUtil;

public ContactServiceImpl() {
    csvUtil = new CsvUtil();
}

2. 필드 주입

  • 간편하다. 그러나 Spring에서 사용할 때는 프레임워크에 의존적이다. 즉, 자바로 실행하기 힘들다
  • 잘 사용하지 말 것.
private final CsvUtil csvUtil  = new CsvUtil();

 

4. 메소드 추출

반복해서 나오는 코드는 메소드 추출을 사용해 중복코드를 줄이자.

private <K, V> String keyValueString(HashMap<K, V> map) {
    Object[] keySet = sortKey(map);
    StringBuilder sb = new StringBuilder();
    for (Object key: keySet){
        sb.append(key).append(": ").append(map.get(key)).append("\n");
    }
    return sb.append("\n").toString();
}

private <K, V> Object[] sortKey(Map<K, V> map) {
    Object[] keySet = map.keySet().toArray();
    Arrays.sort(keySet);
    return keySet;
}

제너릭 메서드를 사용해 타입 구분없이 사용할 수 있도록 메서드 분리

 

5. StringBuilder

StringBuilder sb = new StringBuilder();
sb.append(key).append(": ").append(map.get(key)).append("\n");

// sb.append(key+": "+map.get(key));

String은 변경할 수 없다. 덧셈 연산자를 사용하면 새로운 인스턴스를 생성한다.

StringBuffer를 사용하면 String을 수정할 수 있다.

그러나 StringBuffer은 멀티 스레드 환경에 맞춰져있다.

멀티 스레드 환경이 아니라면 이 내용이 빠져있는 StringBuilder를 사용하자.

더 빠르다.