꼬물꼬물
다우기술 문제풀이 회고 본문
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. 역할 구분
하나의 클래스 내에 해야한다면 메소드로, 아니라면 역할을 구분하자.
- 자원을 읽기/쓰기
- 자원을 사용하기
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를 사용하자.
더 빠르다.
'스터디 > JAVA' 카테고리의 다른 글
[자바의 정석]11. 컬렉션 프레임웍-2 (1) | 2022.10.29 |
---|---|
[자바의 정석]11. 컬렉션 프레임웍-1 (0) | 2022.10.27 |
[자바의 정석] Generics(제너릭스) (0) | 2022.10.25 |
[자바의 정석] java.lang패키지와 유용한 클래스 (0) | 2022.10.14 |
[자바의 정석] 6. 객체지향 프로그래밍 I (0) | 2022.10.06 |