코딩테스트

자바 코딩테스트 메서드 기초: 구현 노하우

망고고래 2024. 4. 18. 19:02

1. 조기 반환(early return)

what?

코드 실행 과정이 함수 끝까지 도달하기 전에 반환

why?

코드 가독성↑

예외를 깔끔하고 빠르게 처리

how?

static int totalPrice(int quantity, int price){
    int total = quantity * price;
    if(total > 100)
        return (int)(total * 0.9);
    return total;
}

 

if문에서 total이 100보다 큰 경우 total에 0.9를 곱하고 반환해 조기에 종료하도록 함 -> 예외 처리 불필요

 

 

2. 보호 구문(guard clauses)

what?

본격적인 로직을 진행하기 전 예외 처리 코드를 추가

why?

보호 구문 이후 구현부에서 입력값에 대한 예외를 고려할 필요 x

처음부터 예외 고려 -> 더 안전한 코드 작성

how?

static double calculateAverage(List<Integer> numbers){
    //보호 구문 1
    if(numbers == null)
        return 0;
    
    //보호 구문 2
    if(numbers.isEmpty())
        return 0;
        
    //구현부
    int total = numbers.stream().mapToInt(i -> i).sum();
    return (double) total / numbers.size();
}

 

정수 리스트  numbers를 받아 평균을 계산해 반환하는 메서드

보호 구문 1: numbers가 null인지 확인

보호 구문 2: numbers가 비어있는지 확인

stream: 리스트를 스트림으로 변환(IntStream.sum()을 사용하기 위함)

mapToInt(i -> i): 스트림에서 각 요소를 int값으로 변환

  • mapToInt(): 스트림의 각 요소에 지정된 함수를 적용, 새로운 IntStream 형성
  • (i -> i): 각 요소를 인수로 받아 해당 요소를 그대로 반환

sum(): IntStream의 메서드. 합계를 구함

 

 

 

3. 제네릭(generic)

what?

빌드 레벨에서 타입을 체크하는 기능(타입 지정, 타입 강제)

why?

  1. 타입 안정성
  2. 타입 체크와 형변환 생략

how?

//제네릭 사용 x
List list = new ArrayList();
list.add(10);
list.add("abc");

int sum1 = (int)list.get(0) + (int)list.get(1); //런타임 오류 발생


//제네릭 사용
List<Integer> genericList = new ArrayList();
genericList.add(10);
genericList.add("abc"); //문법(빌드 레벨) 오류 발생

int sum2 = genericList.get(0) + genericList.get(1);

 

1) 제네릭을 사용하지 않는 경우 코드를 실행해야 오류가 발생한다는 것을 알 수 있지만, 제네릭을 사용하면 빌드 자체가 안 되기 때문에 런타임 오류를 방지할 수 있다.

2) 데이터에 접근할 때 형변환을 할 필요가 없다.

 

코딩 테스트에서는 여러 타입의 데이터를 하나의 컬렉션에 넣어야 할 경우가 거의 없기 때문에 제네릭을 사용하는 것이 좋다.