Software Lab

null 인자는 함수 외부에서 처리 본문

코드 리펙토링

null 인자는 함수 외부에서 처리

아임코더 2022. 6. 24. 11:05
drawLine(Point start, Point end){    // define func

    if(start == null || end == null)
        return;
    
    ....
    ....
}


drawLine(start, end)                // call func

<함수 내부 null 처리>

 

drawLine(Point start, Point end){    // define func

    ....
    ....
}


if(start != null && end != null)
    drawLine(start, end)                // call func

<함수 외부 null 처리>

 

 

<함수 내부 null 처리>는 오동작이 발생할 수 있다.

 

<함수 내부 null 처리>는 함수 외부에서 매번 null 처리 코드를 작성할 필요가 없다. 그리고 만약 인자가 null인 경우 죽지 않으므로 안전하게 동작한다고 착각할 수 있다. 그런데 죽지 않는다고 문제가 없는 것인가?

null 인자로 drawLine 함수를 호출해보자. 프로그램은 죽지 않겠지만 Line은 그려지지 않을 것이다. 함수가 호출은 되었는데 그 동작이 되지 않았다? 그것은 오동작이라고 볼 수 있다.

반면 <함수 외부 null 처리>에서 실수로 외부에서 null 처리하지 않아(만약 8번 줄이 없으면), null 인자로 함수가 호출된다면 프로그램은 죽을 것이다. null 인자로 함수가 호출되면 죽는 게 오히려 정상 동작이라고 볼 수 있다.

 

null 인자로 인해 프로그램이 오동작하는 것보다 죽는 편이 문제의 원인을 더 빨리 찾는다. 다시 말하면 죽었을 때보다 오 동작이 발생했을 때, 그 문제의 원인을 찾는 비용이 더 많이 든다.

그 외에도 중복 코드 발생 여부와 함수 호출 오버헤드에서도 차이가 있다. 두 방식을 요약하면 아래와 같다.

 

<함수 내부 null 처리>

  • 함수 호출마다, null 처리 코드 신경 쓸 필요 없음
  • 함수 호출 오버헤드가 있기 때문에 속도가 느림
  • 인자가 null이라면 프로그램 오 동작함

 

<함수 외부 null 처리>

  • 함수 호출마다, null 처리 코드 작성 번거로움
  • 함수 호출 오버헤드가 없기 때문에 속도가 빠름
  • 인자가 null이라면 프로그램 죽음

 

많은 framework나 lib(가령 stdio의 strstr)의 함수들도 null 인자로 호출되면 프로그램이 죽게 되어있다. 특수한 경우가 아니라면 <함수 외부 null 처리> 방식으로 개발해야 하는 것이 맞다. 반대로 특수한 경우, 즉 오동작 하더라도 죽지 않는 것이 더 중요하다고 판단 된다면 <함수 내부 null 처리> 방식을 사용하면 되겠다.

Comments