# C 함수들을 재구현해서 새로운 라이브러리 만들기

42 서울의 첫 과제인 Libft에서는 C 함수들을 재구현하고 새로운 라이브러리를 생성했다. Standard C library에 있는 함수들을 단순히 기억하고 가져다가 사용하는 것이 아니라 그 함수의 기능을 직접 테스트하고 그 입력값과 반환값이 일치하는 함수를 작성하니 각 함수를 더욱 정확하게 기억하게 되어 더 복잡한 과제를 할 때 필요한 함수를 더 쉽게 떠올리고 또한 필요하다면 함수를 작성하여 소스를 관리하는 방법을 익힐 수 있었다.

## 1.입력, 출력 테스트와 구현방법

이 과제 단계에서 해야하는 함수들은 복잡한 것이 아닌 기본적인 함수들이지만 이를 단순히 구글해서 함수의 입출력을 찾아서 구현하는 것은 과제 의도가 아니라고 판단했다. 우리가 모르는 어떤 입력값과 출력값을 가진 함수를 직접 테스트하여 그 규칙을 찾아내고 이를 구현하는 방법을 익히는 것이 주요 목표로 생각했고 다음과 같이 테스트코드, 그리고 작성, standard 라이브러리 함수와 비교 대조하며 작성했다.

```c
	char *str1_atoi = "  	 -2147483649";
	char *str2_atoi = "  	 -9223372036854775840";
	int	result_atoi;

	result_atoi = atoi(str1_atoi);
	printf("std atoi(%s) is %d\n", str1_atoi, result_atoi);
	result_atoi = ft_atoi(str1_atoi);
	printf(" ft atoi(%s) is %d\n", str1_atoi, result_atoi);
	result_atoi = atoi(str2_atoi);
	printf("std atoi(%s) is %d\n", str2_atoi, result_atoi);
	result_atoi = ft_atoi(str2_atoi);
	printf(" ft atoi(%s) is %d\n", str2_atoi, result_atoi);
```

위와 같은 테스트를 문제가 될만한 입력값들에서 체크하며 출력하면 아래와 같이 출력되어 정확히 어떤 입력값에서 원함수와 다른 출력값이 발생하는 지를 확인하며 바로바로 코드를 수정할 수 있었다.

```c
std atoi(        -2147483649) is 2147483647
 ft atoi(        -2147483649) is 2147483647
std atoi(        -9223372036854775840) is 0
 ft atoi(        -9223372036854775840) is 0
```

자세한 함수들이나 과제는 42서울 정책으로 생략하지만 피신 때의 함수를 거의 그대로 활용할 수 있는 경우가 많았고 memmory 1byte단위, str처리, 연결리스트의 기본 조작과 관련한 개념들을 복습할 수 있었다.

또한 다른 카뎃분들이 작성해놓은 테스트 프로그램인 paco를 한개의 파트가 끝날 때마다 적용하여 내가 생각하지 못 했던 예외케이스도 함께 처리할 수 있었다.

## 2.Makefile relink

피신 때의 c09와 달리 이번 libft에서는 두 개의 명령어가 같은 파일을 생성하게 되어 relink가 문제가 되었다. 조금 더 자세하게 Makefile과 relink를 설명하고 그 해결방안을 같이 이야기하겠다.

```makefile
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

$(TARGET) : $(OBJECTS)
			$(AR) rcs $(TARGET) $^
```

위와 같은 Makefile을 사용하는 것과 유사한 shell script를 사용하는 것 모두 동일한 명령어를 사용하여 결과물, TARGET이라는 파일이 생성된다. Shell script는 다시 한번 실행하는 경우 언제나 위의 gcc로 다시 object file을 생성하고 target을 생성한다. 하지만 Makefile을 다시 실행하는 경우 :로 구분된 target과 dependency 파일의 수정시간을 확인하여 object file의 수정시간이 src파일의 수정시간보다 최신인 경우 존재하는 object file이 src 파일로 생성되었다고 가정하고 다시 컴파일하지 않는다. 반대로 source file의 수정시간이 object file의 수정시간보다 최신인 경우는 object file이 생성된 이후 수정되었다고 판단하여 object file을 다시 생성한다. 규모가 작은 소스파일의 경우 큰 차이가 없지만 규모가 큰 프로젝트의 경우 새로 업데이트된 파일들만 다시 컴파일하는 makefile이 유용하게 사용할 수 있다.

하지만 여러가지 명령어를 직접 정의하는 경우, 특히 타겟파일을 :로 의존관계를 명시하지 않고 명령어:의존관계 파일 형태로 작성하여 명령어로 타겟파일이 생성되도록 하는 경우, 의존관계가 있는 파일이 수정되지 않아 타겟파일이 최신임에도 다시 명령어가 실행되는 경우가 있는데 이를 relink라고 한다. 이를 방지하기 위해 가능한한 직접 타겟파일의 의존관계를 문법에 맞게 명시하거나, 생성되는 시간을 기록할 수 있는 더미파일:의존파일들, 명령어:더미파일 방식으로 설정하여 리링크를 방지할 수 있다.
