Search
Duplicate
🛡️

외부 비노출 함수는 static 함수로 선언하는 것이 ‘권장’됨

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
태그
Scrap
8 more properties
Norm 공식 문서
C에서 함수를 static으로 선언하는것은 그 함수를 해당 소스파일에서만 사용가능하게 한다. 외부에서도 호출할 함수 외에는 기본적으로 staic 함수로 선언함이 유리하다.
Norm 공식 문서에 외부 비노출 함수의 경우 static 사용을 ‘권장’한다고 되어있음 (good habit)
static을 사용하는 이유? ⇒ 소스 파일 내부에서만 사용하는 함수의 경우, 굳이 외부로 노출 시킬 필요가 없기 때문에

static function(정적 함수)의 장점

코드 안정화
다른 파일에서 의도치 않게 어떤 함수를 호출하는 경우를 막는다.
하나의 프로그램을 함께 개발하는 다수의 개발자가 각각 소스 파일을 작성하였는데 우연히 동일한 이름의 함수가 존재하여 충돌을 일으킬 수도 있다. static 키워드를 붙이면 이런 문제가 해결된다.
위 두 소스파일을 함께 컴파일시 링크 에러가 발생하지 않고 정상적으로 빌드된다. 둘 중 하나에만 static을 붙여도 되는 것 같다.
가독성 증가
static 키워드가 붙어있는 것을 보면 그 함수는 다른 파일에서 사용하지 않는다는 것을 곧바로 알 수 있다. 코드 분석 시 이 함수가 어디에서 사용되었는지 헤맬 필요가 없으니 읽는데 들일 시간이 줄어든다!!
중복 함수명 허용
static 함수는 해당 파일 내부에서만 사용할 수 있기 때문에 같은 이름의 함수를 여러개의 파일에 생성할 수 있게 된다.
특정 파일과 유사한 파일을 하나 더 만들고 싶을 때, 변수명의 중복을 피하기 위해 새로 만든 파일의 모든 함수에 static을 붙이는 경우를 본 적이 있다. 이것이 일반적으로 권장되는 것인지는 모르겠지만 무튼 이런식으로 활용할 수 있다.

‘Libft’ 과제에서 서브 함수들은 무조건 전부 static을 처리해야하나요?

⇒ 다른 파일에서 참조할 일이 없는 함수들에 대해 static으로 함수를 정의하는 것은 분명 좋은 습관이지만, libft는 함수들간 충돌이 일어날 만큼 프로젝트의 규모가 크지 않고, 컨벤션*이 명확하므로 꼭 해야 할 필요는 없다. 만약 static 처리를 하기로 결정했다면, 혼란을 방지하기 위해 이 코딩 컨벤션을 확실히 지켜야한다. (어떤 것은 static 처리를 하고 어떤 것은 하지 않는다면 안하느니만 못하다.)
정적함수를 사용했을 때 얻는 장점은 코딩도장의 홈페이지에서 충분히 설명이 되었으리라 생각하고, 정적함수로 사용하면 동일한 함수명을 사용했을 때 참조할 시 오는 혼란과 의도하지 않는 동작을 막을 수는 있습니다.
그런데 저는 아래의 이유로 이를 반드시 평가사항에 집어넣지는 않습니다. libft는 컨벤션이 명확합니다. libft는 함수 이름에 접두어로 오는 식별자가 ft_ 인 라이브러리를 구성하고 내부 함수들을 만드는 서브젝트입니다.
당연 여기서 사용하는 모든 함수명의 처음에는 ft_ 가 붙고, 함수 이름을 정합니다. 컨벤션을 잘 지키고 함수 이름에서 충돌이 나지 않는다면 위에서 언급한 혼란이 생기지 않습니다.
그리고 그런 충돌들이 일어날 만큼 libft의 프로젝트의 규모는 크지 않습니다.
특히나 지금처럼 '전부 스테틱 처리해주는 게 '맞나요?''라고 묻는다면 더더욱이요. 오히려 저는 이걸 가지고 fail을 주겠다면 평가자에게 위의 사항을 되물어볼 것 같습니다. 혼란을 방지하기 위해 특정 코드 컨벤션을 정했다면, 추가적인 기능을 필연적으로 더 써야만 하는 상황이 아니라면 혼란을 피하기 위해 컨벤션을 우선적으로 지키는 것이 맞다고 생각합니다. 다른 것은 선택사항이라고 생각해요.
하나의 파일 안에서 여러가지 함수를 쓸 때 다른 파일에서 참조할 일이 없는 함수들에 대해 정적함수로 정의하는 것은 혼란을 방지하는 아주 좋은 습관이지, 그게 필수로 해야하고 안하면 fail주고 그래야하는 것은 아니라고 생각합니다.
코딩 컨벤션(convention) (관습, 조약, 협약) 읽고, 관리하기 쉬운 코드를 작성하기 위한 일종의 코딩 스타일 규약(하나의 작성 표준)으로, 간단히 말해 코딩 규칙을 통일하는 것. (예를 들어 Libft 과제에서는 함수 이름에 접두어로 오는 식별자가 ft_ 로 통일되어있음)