Search
moon
sun
🛡️

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

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Scrap
태그
9 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_ 로 통일되어있음)