🕊️ [Medium] 자바 개발자가 피해야 하는 11가지 실수 (2)

7. 검색 전 데이터 존재 여부를 확인하지 않기

Bad Practice: 객체를 가져오기 전 map에 id가 있는지 미리 확인합니다. 존재하지 않는다면 null 값을 반환하기 때문에 미리 체크하는 것은 불필요합니다.

public static String findNameById(Map<Integer, String> idNameMap, int id) {
	if(idNameMap.containsKey(id)) {
    	return idNameMap.get(id);
    } else {
    	return "Unknown";
    }
}

Good Practice: 즉시 map에서 가져온 후 null인지 아닌지 체크하여 존재 여부를 확인합니다.

public static String findNameById(Map<Integer, String> idNameMap, int id) {
	String name = idNameMap.get(id);
	if(name != null) {
    	return idNameMap.get(id);
    } else {
    	return "Unknown";
    }
}

 

8. 배열의 효율적인 변환

Bad Practice: 

- 리스트의 사이즈가 먼저 계산된 후 새로운 배열이 생성됩니다.

- 큰 컬렉션일 수록 성능에 영향을 미칠 수 있습니다.

List<String> stringList = new ArrayList<>();
stringList.add("apple");
stringList.add("banana");
stringList.add("orange");

String[] array = stringList.toArray(new String[stringList.size()]);

Good Practice:

- 빈 배열과 함께 toArray 메서드가 호출됩니다.

- 리스트의 크기를 계산할 필요가 없으며 toArray 메서드가 내부적으로 배열 크기를 조정할 수 있으므로 성능이 향상되고 코드가 깨끗해집니다.

List<String> stringList = new ArrayList<>();
stringList.add("apple");
stringList.add("banana");
stringList.add("orange");

String[] array = stringList.toArray(new String[0]);

 

9. 기본 메서드 사용

Bad Practice: logError와 같은 새로운 메서드를 인터페이스에 추가해야 하는 경우 모든 구현 클래스를 수정해야 하므로 코드 관리 문제가 발생할 수 있습니다. 

interface Logger {
	void log(String message);
}

class FileLogger implements Logger {
	@Override
    public void log(String message) {
    	System.out.println("Logging to file: " + message);
    }
}

class ConsoleLogger implements Logger {
	@Override
    public void log(String message) {
    	System.out.println("Logging to file: " + message);
	}
}

Good Practice: Logger 인터페이스가 기본 메서드를 정의하여 이 메서드는 로그 오류에 대한 기본 구현을 제공합니다. 구현 클래스는 수정할 필요 없이 이 기본 구현을 자동으로 상속합니다.

interface Logger {
	default void log(String message) {
    	System.out.println("Logging to file: " + message);
    }
}

class FileLogger implements Logger {
	@Override
    public void log(String message);
}

class ConsoleLogger implements Logger {
	@Override
    public void log(String message);
}

 

10. Date/Time API 사용

Bad Practice: 레거시 Date 클래스를 사용합니다.

- 이 클래스는 변형 가능성, 메서드 명확성 부족 등 다양한 문제가 있습니다.

- getYear(), getMonth()와 같은 이 클래스의 대부분의 메서드는 사용되지 않습니다.

import java.util.Date;

public class DateUtil {
	public static void main(String[] args) {
    	Date currentDate = new Date();
        System.out.println("Current date: " + currentDate);
	}
}

Good Practice: Date/Time API를 사용합니다.

import java.time.LocalDate;

public class DateUtil {
	public static void main(String[] args) {
    	LocalDate currentDate = LocalDate.now();
        System.out.println("Current date: " + currentDate);
	}
}

 

11. 제네릭 사용

Bad Pracice: 다른 타입의 데이터가 리스트에 혼합되어 저장됩니다. 런타임 에러를 유발할 수 있습니다.

ArrayList list = new ArrayList();
list.add(10);
list.add("Hello");

Good Practice: 타입 안정성을 보장하는 제네릭을 사용합니다.

ArrayList list = new ArrayList<>();
list.add(10);
// list.add("Hello"); // Compile-time error: incompatible types


번역: [https://ducktopia.tistory.com/125]

출처

15 + 11 Mistakes Every Java Developer MUST avoid TODAY

Medium

15 + 11 Mistakes Every Java Developer MUST avoid TODAY

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 5월 22일 오후 12:37

 • 

저장 234조회 12,098

댓글 3

  • 7번 항목에서 Map의 getOrDefault 메서드를 활용한다면 간략하게 구현할 수 있을 것 같네요.

  • 7. 객체 지향 패러다음에서 null을 되도록 피해라고하고 복잡도가 좋아지는것도 아니고 코딩량도 늘어나고 코드 이해도 containsKey 사용하는것이 좋은데 왜 Bad Practice인지 이해가 안갑니다.

  • 혹시 7번 good practice에서 String name에 idNameMap.get(id) 값을 받아왔는데 name값이 null이 아닐 때 name변수를 return하지 않고 idNameMap.get(id)로 리턴하는 이유가 따로 있을까요 ?