본문 바로가기

Programming

실무에 바로 적용 가능한 자바 꿀팁: 코드 예제와 함께 깊이 있게 파헤치기

728x90
반응형

실무에 바로 적용 가능한 자바 꿀팁: 코드 예제와 함께 깊이 있게 파헤치기

자바(Java)는 여전히 전 세계에서 가장 널리 쓰이는 객체지향 프로그래밍 언어 중 하나다. 하지만 자바가 아무리 안정적이고 강력하더라도, 매일 반복되는 업무 속에서 코드를 효율적이고 깔끔하게 작성하는 방법을 고민하지 않으면 유지보수 지옥에 빠지기 십상이다. 오늘은 자바를 더 생산적이고 우아하게 다루기 위한 실전 꿀팁들을 소개한다.

 


 

1. Optional 클래스를 적극적으로 활용하자

NullPointerException은 자바 개발자들의 영원한 숙제다. 이를 피하기 위해 Java 8부터 등장한 Optional 클래스를 적극적으로 활용하자.

예제:

public class User {
    private String email;
    public Optional<String> getEmail() {
        return Optional.ofNullable(email);
    }
}​

 

사용 예:

User user = getUser();
String email = user.getEmail().orElse("이메일 없음");

포인트:

  • Optional은 메서드 체이닝에도 매우 유용하다.
  • 다만 무조건 Optional을 필드에 쓰는 것은 오히려 퍼포먼스를 해칠 수 있음. 리턴값에만 사용하는 것이 일반적.

 

2. try-with-resources로 자원 자동 관리

자바 7 이상에서는 try-with-resources 문법을 사용하여 자원을 자동으로 해제할 수 있다.

예제:

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

장점:

  • finally 블록 없이도 자원이 자동으로 해제됨.
  • 코드를 훨씬 깔끔하게 유지할 수 있다.

3. record를 활용한 간결한 데이터 구조 표현 (Java 14 이상)

Java 14부터는 record를 사용해 DTO 같은 클래스 구조를 간결하게 정의할 수 있다.

예제:

public record Person(String name, int age) {}

 

사용 예:

Person p = new Person("홍길동", 30);
System.out.println(p.name()); // 홍길동

장점:

  • equals, hashCode, toString 자동 생성.
  • DTO, VO, 이벤트 모델 등에 매우 유용함.

 


4. 스트림(Stream)을 사용한 데이터 처리

자바의 Stream API는 대량 데이터 처리에 탁월한 가독성과 성능을 제공한다.

예제:

List<String> names = List.of("Kim", "Lee", "Park", "Choi");

List<String> filtered = names.stream()
    .filter(name -> name.startsWith("K"))
    .map(String::toUpperCase)
    .collect(Collectors.toList());

System.out.println(filtered); // [KIM]

팁:

  • peek()를 활용하면 디버깅에도 매우 유용하다.
  • 성능을 위해 parallelStream()도 고려할 수 있지만 상황에 따라 주의해야 함.

5. Lombok으로 코드 줄이기

Lombok은 자바 코드에서 반복되는 getter, setter, toString, equals, hashCode 등을 자동으로 생성해준다.

예제:

import lombok.Data;

@Data
public class Book {
    private String title;
    private String author;
}

주의사항:

  • 빌드 툴이나 IDE에서 lombok 플러그인이 설치되어 있어야 함.
  • 디버깅 시 가시성이 떨어질 수 있으므로 팀 합의가 중요함.

6. 커스텀 어노테이션을 활용한 코드 정리

자바에서는 어노테이션을 직접 정의할 수 있으며, 반복되는 패턴을 간결하게 만들 수 있다.

예제:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecutionTime {}

AOP와 함께 사용하면 다음과 같이 활용 가능:

@LogExecutionTime
public void process() {
    // 실행 시간 측정이 필요한 로직
}

 


7. LocalDate와 DateTimeFormatter 사용

java.time 패키지를 활용하면 날짜 관련 연산이 훨씬 안전하고 명확하다.

예제:

LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusWeeks(1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

System.out.println("다음 주 날짜: " + nextWeek.format(formatter));

8. 예외 처리의 정석: 커스텀 예외 만들기

기본 예외만 쓰지 말고, 도메인 맞춤형 커스텀 예외를 만들어라.

public class InsufficientBalanceException extends RuntimeException {
    public InsufficientBalanceException(String message) {
        super(message);
    }
}

사용 예:

if (balance < amount) {
    throw new InsufficientBalanceException("잔액 부족");
}

장점:

  • 에러 코드 관리가 명확해지고 로깅/트래킹도 쉬워진다.
728x90
반응형