혹시 함수를 만들면서 return null을 해본 사람이 있을까? 다시 정확히 질문을 바꾸어 보자, 어떤 함수를 실행 했을 때, null이 나오기를 바라면서 함수를 실행해본 사람이 있을까? 나는 타입언어를 배우는 동안 리턴타입의 지정을 Null이라는 클래스(?)로 해본적이 없다. Nullable은 있어도, Null이라는 클래스가 있는 언어가 있는지도 모르겠다.
언젠가, 널 포인터라는 개념을 만든 토니 호어는 "내 10억 달러 짜리 실수"라고 이야기 하였다. 그런 이야기가 나올 당시가, 함수형프로그래밍이 한참 인기가 있을 때, 나한테 까지도 이야기가 들어왔다. nullalbe객체가 있는데, 그걸 사용 하면 코드에서 null체크를 할 필요가 없어서 코드가 짧아지고, 우아한 코드를 만들 수 있어, null을 왜 만든거야? 뭐 상황에 따라 맞는 말이 될수도 있고, 상황에 따라 불편한 상황을 만들 수 있다.
오늘 내가 해볼 말은 조금 null을 사용해도 되지 않을까? return null을 해도 되는 상황이 있지 않을까? 라는 말을 하고 싶다.
만약, 당신이 앞으로 많은 사람들이 사용하게 될 언어의 readFile함수를 만든다고 생각을 해보자.
일단 첫째로, File 클래스를 리턴을 받아야 하고 path를 파라미터로 받게 되는 아래의 형태의 함수가 될 것이다.
function readFile(path: String): File {}
문자열 타입으로 파일경로를 받고, File타입을 리턴을 하게 될 것이다. 더, 고민을 해볼꺼리가 남아있겠지만, 가장 간단하게, 따져볼만한 것이, 해당 경로에 파일이 없는 경우는 어떻게 처리 할 것인가?
여기서, 생각해볼만한 것이다. 세가지가 있을 것이다.
1. throw new PathError(path); 그 상황을 에러로 처분하는 방법.
2. return new File(); 그 상황을 빈 파일의 객체를 리턴하는 방법.
3. return null;
각각의 상황이 어떤것이 우월하고, 어떤것이 뒤떨어지는 방법이라고 말하기에는 애매하다. 함수의 특징이나, 시대 트렌드에 따라, 각각의 장단점을 품고 있다.
자 첫번째 상황에서 개발자가 핸들링 하는 방식을 확인해보자.
1. throw new PathError('path');
try {
const testFile = readFile('test.txt');
} catch (e) {
if (e instanceof PathError) {
console.log('비어있는 파일');
} else {
throw e; // re-throw the error unchanged
}
}
해당 함수를 사용 하는 개발자는 위와 같이 파일을 읽는 상황 마다 매번 try catch를 사용하여야 하며, 비어있는 파일에 대한 에러처리는 따로 해주어야 할 필요성이 있으며, javascript처럼 인터프리터 언어라면, 정의되어있는 에러 타입을 제대로 파악을 하지 못하여, 정확한 예외처리가 안 될 가능성이 있다.
2. return new File();
const testFile = readFile('test.txt');
if(!testFile.fileName) {
console.log('비어있는 파일');
}
현재 널리 퍼져있는 OS들은 파일의 이름을 무조건 만들어줘야 하기 때문에, 위처럼 fileName을 체크하는 것으로 비어있는 파일인지 확인이 가능 할 것이다. 하지만, 위처럼 항상 비어있는지 확인을 해야하며, 만약 위처럼 비어있는 파일을 확인 하지않고,
const testFile = readFile('test.txt');
testFile.writeLine('test');
바로 위처럼 작성하는 경우, 실제로 메모리에는 작성이 되었을 테지만, file에 작성이 되지는 않아, 프로그램이 쓰기만 열심히 해서 느리기만 하고, 실제로 파일은 생성되지 않는 버그를 만들것이다.
3. return null;
const testFile = readFile('test.txt');
if(!testFile) {
console.log('비어있는 파일');
}
이건 사실 new File();과 거의 겹치는 수준이나,
const testFile = readFile('test.txt');
testFile.writeLine('test');
위의 코드가 실행 당시 에러가 발생할 것이다. 아마 핸들링이 전혀 되지 않았다면, 프로그램이 종료되던가 뭔가 할 것이다.
만약 FileSystem을 설계 할 때, 위의 세 가지 어떤 방식으로 개발을 하던, 누군가한테는 비난을 받고, 누군가한테는 옹호를 받고, 누군가는 그런가보다 라고 사용을 할 것이다. 어떻게 하던, 방법은 달라도 위의 세가지 방법다 비어있다라는 것을 알 수 있으니 말이다.
댓글
댓글 쓰기