함수의 원형,정의.. 확실히 이해 가게하는 방법 없을까여?

min2to의 이미지

원형과.. 정의가 너무 이해가 않가네여...

선배님들은.. 뭘 보고 이해 하셧나여..(답답한.. 질문)

ㅎ;;;

사랑천사의 이미지

글세요? 음...

음... 선언.. 정의... (근대 말씀 하시는 원형 이란게 뭔가요? 선언 하는걸 말씀 하시는 건가요?)

제가 배울 때는 그랬습니다. (글세요 제대로 배웠다고 해야 될지 모르지만, 분명 스승님들 께선 제대로 가르치 셨다고 생각 합니다.)

선언이란, 함수의 존재 여부를 미리 정의 해서 그 형태를 컴파일러가 인지 하도록 해 주는 것이고...

정의는 그 내용을 정의 하는 거라고 음... 이게 맞는지 흐흠.. 잘못 말 하면.. 아니 말 한마디 잘못으로 설명이 틀려 지면, 스승님들 욕 먹이는 길인데.. 괸히 글을 쓰고 있나요? 음..

뭐.. 저에겐 어디 가지나 추상적입니다. 음...

그럼 모두 행복하세요...
이여송 사도요한 드림.
PS:함수 선언하고 정의 해서 써 본게... 흐흠.. 1년 전인가요? 음..

사람천사

min2to의 이미지

함수의 원형에서... 막히나여? 궁금하네여...
몇칠째.. 이부분이.. 이해가 않가서..
아니면.. 제가.. 머리가.. 않돌아 가서 그런가.... (제가 역시 돌머리라..)

흐흐..

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

seoleda의 이미지

원형 = declaration
정의 = implementation

추가하자면, 함수뒤에 중괄호가 따라오면, 정의, 따라오지 않으면 원형이라고 생각하시면...
질문을 좀 더 구체적으로 해주시면 더 좋은 답변을 얻으실 수 있을 것 같습니다.

min2to의 이미지

막.. 2중으러 겹쳐서 나오는건.. 해석이 불가능해서..

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

사랑천사의 이미지

int add (int x, int y);

int multimulti (int x, int y)
{
  int r, c = 0; /* 카운터 */

  r = x;
  while (c < y) {
    r = r * x;
    c++;
  }
  return (r);
}

이런걸 말씀 하시는 건지.. 음...

 { 와 } 사이를 블록 이라고 하는건 아시죠? 

int main (void)
{
  printf ("Hello! World.\n");
}

// 위의 중괄호 속이 한 불록입니다.
// 중괄호 안에 또 중괄호가 있으면 2 중 불록이 됩니다.
// 3중 4중 ... 계속 가능하죠 ...

음... 근대 저거 하곤 관련이 없어 보이는 데요? 음...

Override를 말씀 하시는 것인지... (함수에 대해서.)
아니면 Class하고 관련이 잇나요? 음.. 잘 모르겠네요...

뭐가 이해가 안 가시는지..

사람천사

min2to의 이미지

#include <stdio.h>

int abso (int a, int b); //원형... //절대값이 큰 정수반환
int abso_l (int val); //원형.. // 전달 인자의 절대값을 반환..

int main(void)
{
int a,b;
pritf(" 두개의 정수 입력:");
scanf("%d %d" ,&a,&b);

printf ("%d %d중 큰 절대값: %d " ,a ,b, abso(a,b)); abso(a,b) <-이부분..

return 0;
}

int abso (int a , int b) //정의
{
if (abso_l(a) > abso_l(b))
return a;
else
return b;
}

int abso_l(int val) //정의
{
if(val<0)

return val*-1; <-이 부분이여.. val*-1...

else
return val;

}

[[ <- 이렇게 된것만 이해가 않가네여.. 책을.. 봐도..ㅜ.ㅜ.. ]]

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

hyperhidrosis의 이미지

absolute 는 절대값이고,

-3*-1 = 3

이면 이해가 가실테고,

min2to의 이미지

abso(a,b)); abso(a,b) <-이부분..

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

creativeidler의 이미지

원형이란 말은 prototype의 번역인 듯 한데 C언어 문법상의 정확한 용어는 아닙니다. declaration, 선언이 좀더 정확한 표현이죠. 본체까지 붙은 것은 definition, 정의라고 합니다. 위에 어떤 분이 implementation이라고 쓰셨는데 틀린 말은 아니지만 보통 implementation은 interface와 대응해서 쓰는 말이고 declaration, definition이 세트로 어울려 다니는 말이죠. 코드로 설명을 해보자면..

#include <stdio.h>

int abso (int a, int b); // function declaration #1
int abso_l (int val); // function declaration

int main(void)
{
int a,b;
pritf(" 두개의 정수 입력:");
scanf("%d %d" ,&a,&b);

printf ("%d %d중 큰 절대값: %d " ,a ,b, abso(a,b)); abso(a,b); // abso 함수는 declare되었지만 define되지는 않은 상태. #2

return 0;
}

int abso (int a , int b) // function definition #3
{
if (abso_l(a) > abso_l(b))
return a;
else
return b;
}

int abso_l(int val) // function definition
{
if(val<0)

return val*-1; <-이 부분이여.. val*-1...

else
return val;

} 

#1, #2, #3 붙여논 태그를 따라가면서 보시면, 먼저 #2는 abso란 함수를 사용하는 부분입니다. 그런데 C 언어에서는 뭐든지 사용하기 전에 선언이 되어 있어야 합니다. 그런데 함수의 정의는 #3에 있어서 #2보다 뒤에 있죠. 그래서 컴파일할 때 #1이 없으면 abso가 없는 줄 알고 에러를 내게 됩니다. 그래서 #1을 통해서 abso란 함수가 나중에 정의될 꺼라는 걸 컴파일러에게 알려주는 것이죠.

물론 이 문제는 #3의 정의를 main 정의보다 앞에 써서 해결할 수 있습니다. 하지만 이러면 함수를 코드에 쓰는 순서를 항상 염두에 두면서 코딩해야하고 때때로 두 함수가 서로 호출한다든지 하는 경우가 해결이 안되죠. 그리고 다른 파일에서 include할 때도 문제가 되구요. 그래서 declaration이 따로 있는 것입니다.

참고로, 함수 definition은 그 자체로 declaration이기도 합니다.

하다보니 설명이 좀 어렵게 되었는데 감은 잡을 수 있을 것입니다. 그래도 이해가 안가면 좀더 질문을 구체적으로 해주시면 더 좋은 답을 드릴 수 있을 것입니다.

사랑천사의 이미지

제가 위에 선언하고 정의 한 함수에도 있는 부분이군요? 인자가 두 개 들어 갑니다.

저 자리에서 하는 혁활이 뭐냐는 말씀 이시라면...

우선 int multimulti (int x, int y);

이걸 보죠.. 음..
처음에 저렇게 했을 때 괄호 안 부분이 들어갈 인자에 대한 정보를 넘겨 주는 부분입니다. 그 인자의 수는 많아 질 수 있겠죠...

----

그러나 만약 그게 아니라...

#incldue <stdio.h>

int add (int x, int y); 

int multimulti (int x, int y) 
{ 
  int r, c = 0; /* 카운터 */ 

  r = x; 
  while (c < y) { 
    r = r * x; 
    c++; 
  } 
  return (r); 
}

int main (void)
{
  int a, b, r;

  printf ("어떤 수를 몇 제곱 합니까? 차례로 입력 하세요.:");
  scanf ("%d %d", &a, &b);
  fflush (stdin);
  fflush (stdout);
  r = multimulti (a, b); // 이 곳을 말씀 하시는 건가요?
  printf ("%d의 %d제곱은 %d입니다.\n", a, b, r);
}

이런 식이라면... 선언 하고 정의 된 것을 함수로써 사용 한다는 것입니다.

multimulti 함수는... 어떤 수의 제곱을 구합니다 음. 그리고 인자 x와 y는 모두 정수여야 하고요... 그 자리에 해당하는 값을 제시 한 것 뿐입니다. multimulti (a, b) 하면 이것은 인자를 주고 함수를 부른 것이지 선언 한 것은 아닙니다 음... printf 같은 경우 stdio.h를 보면...

extern int printf (__const char *__restrict __format, ...); 라고 선언이 되여 있습니다.

그러나 우리가 사용 하는 것은...

printf (<형식화된 내용>, <형식화에 따른 표현될 변수 목록>);

식이죠... 사용 하는 것은 선언과 다르며 선언/정의 한 것과 같은 위치에 필요한 인자를 대입 하면 되는 것이고 위의 내용은 그런 개념입니다. 근대 궁금 하신 것이 그런 것인지 아닌지.. 잘 이해가 안 가네요 음...

추가:
위 multimulti 함수... 알고리즘상에 좀 문제가 있네요 음.

사람천사

min2to의 이미지

int abso_l(int val) // function definition
{
if(val<0)

return val*-1; <-이 부분이여.. val*-1...

else
return val;

이부분에서.. val 이 뜻하는게 뭔가여?...

위에 선언보면.. val 원형..해서.. 정의가 온게.. 알겟는데.. 이건... 뭐..

a b 도 아니구.. 아무것도 아닌거 같은데.. 왜.. 써준건지..

모르겟네여.. 감사합니다..

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

seoleda의 이미지

min2to wrote:
int abso_l(int val) // function definition
{
if(val<0)

return val*-1; <-이 부분이여.. val*-1...

else
return val;

이부분에서.. val 이 뜻하는게 뭔가여?...

위에 선언보면.. val 원형..해서.. 정의가 온게.. 알겟는데.. 이건... 뭐..

a b 도 아니구.. 아무것도 아닌거 같은데.. 왜.. 써준건지..

모르겟네여.. 감사합니다..

val은 함수의 매개변수로 선언되어 있는 정수형 변수입니다.
추상적으로 설명드리면, 매개 변수를 사용하는 이유는 함수 내부로 어떤 정보를 전달하기 위해서 사용합니다.
수학에서 y = f(x)라는 수식의 의미를 생각해 보면 x라는 정보가 f를 거쳐 y가 되듯이, 위의 코드에서도 val이 특정한 과정을 거쳐서 val*-1 혹은 val이 되잖아요.

잘 이해가 되지 않을때는 잠시 덮어 두거나, 실제로 프로그램을 작성해서 이것 저것 실행해 보면 금방 이해가 되기도 합니다.

제 경우는 hello world 찍는데 일주일 걸렸으며, for문 뒤에 ;이 붙어 있는걸 몰라서 한달동안 헤멘적도 있습니다. 너무 낙심하지 마세요.

사랑천사의 이미지

y = f (x)
f (x) = x+1

이렇게 보면...
y = f (3)
이렇게 했을 때 이 식의 y값은 4죠?

그러나 함수에 들어가는 인자가 될 변수의 이름이 뭐 꼬옥... a, b, x, y 여야 하는건 아니죠?

음...
위에 어떤 분이 써 주신 예제 함수로 한번 보죠.

int abso_l(int val) // function definition 
// 위의 줄에 abso_l 함수에 대해서 val이란 정수형 인자를 주게 되어 있죠? 이름이 val이고 자료형이 정수인 변수입니다.
// 이건 함수 내부에서 변수로 쓸 수 있죠...
{ 
if(val<0) // 여기... 이 함수가 절대값을 반환하는 함수라는데 그러면 val로 들어온 변수의 값을 알아야 겠죠. 그래서 그걸 if 문으로 감사 한 겁니다. val 값에 대해서 말이죠. 그러니 당연히 val이 필요 합니다.

return val*-1; // <-이 부분이여.. val*-1... 
// 이것은 val에 대해서 val이 0보다 작은 음수일 때 절대값을 그대로 반환 하게 만들기 위한 부분입니다. 수학적으로 val의 값에 약간의 변형만 주면 되는 거죠... 그리고 그 값을 int 형으로 반환합니다. return을 통해서 말이죠.
else 
return val; 
// 그러나 여길 보시면 아시겠지만, 만약 val이 양수라면 그냥 다시 반환 하면 되겠죠. 절대값은 보통 양수의 모양새를 띄고 있으니까요. 음수라면 좀 다르게(위 처럼) 처리 하겠지만요.. 음.
}

이제 이해가 되시죠? return을 통해 반환 하는데 다시 한번 val이 사용 된 것입니다.

제대로 설명 한 건가 모르겠네요.

사람천사

min2to의 이미지

쥐 잡듣이..찾아보고.. 해서.. 꼭 알아내고.. 말겟습니다..ㅠ.ㅠ
이걸.. 건너띄고.. 다음 페이지 가니까.. 다 정의 원형이 있네여..

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

익명 사용자의 이미지

선언과 정의, 원형... 그다지 어렵지 않은 개념인데 어느 부분에서 혼란을 겪고 계신 것인지 알수가 없군요. 질문하실 때 자신이 무엇에 대해 헷갈린 것인지 좀 더 정확하게 길게 적어주셨으면 좋았겠습니다만...

일단 함수의 개념에 대해선 이해하고 계시다고 가정하고 얘기를 진행하겠습니다. 0~n개의 매개변수를 받아서 하나의 리턴값을 내놓는 블랙박스... 뭐 그정도만 알고 계시면 됩니다.

선언(declaration)은 말 그대로 내가 무슨 객체나 함수를 쓰겠다고 말 그대로 선언하는 것입니다. 이 때 메모리상에 실제 객체를 생성하거나 혹은 함수의 내용물이 존재해야 될 필요는 없습니다. 그냥 이름표만 달아두는 것이지요.

정의(definition)는 실제 객체나 함수를 만드는 걸 뜻합니다. 이 단계에서 실제 함수가 구현되거나 혹은 객체가 메모리상에 만들어집니다. 보통 정의는 선언을 겸하기도 합니다.

원형은 prototype의 번역인데... 사실 C언어에는 원래 함수 선언이 없었고 정의만 있었으며, 함수는 모조리 int func()로 취급되었습니다. 리턴값은 int고 매개변수는 검사하지 않는거죠. 그러다가 C의 표준을 만들면서 함수 원형(function prototype)이라는 것이 생겼습니다.

     /* Prototype function declaration.  */
     int isroot P(uid_t);
     
     /* Old-style function definition.  */
     int
     isroot (x)   /* ??? lossage here ??? */
          uid_t x;
     {
       return x == 0;
     }

인터넷서 걍 긁어온 코드인데, 위의 것처럼 매개변수의 타입을 써주는 것을 보고 함수 원형 선언이라고 하고, 아래 것처럼 매개변수의 타입을 써주지 않은 정의를 보고 비원형 함수 정의 혹은 전통적인 함수 정의 혹은 옛날방식 함수 정의... 하여간 부르고 싶은 대로 부르시면 됩니다. 하여간에, C에서의 prototype이란 단어는 함수 선언 혹은 정의에서 매개변수의 타입 이름과 객체 이름을 같이 적어주는 스타일을 뜻합니다.

아직 오래된 C의 영향력이 많이 남아있는, 예전의 C 표준인 C90까지만 해도, 함수를 선언하지 않고 사용할 수 있었으며, 선언되지 않은 함수는 자동으로 int func() 타입으로 취급되었습니다. 이것이 #include <stdio.h> 를 해 주지 않고 printf() 함수를 사용해도 에러 메시지가 발생하지 않는 이유였습니다. printf는 리턴해주는 데이터형이 int형이므로 선언이 없이 사용해도 아무 문제가 없습니다. 물론 지금은, 모든 함수를 먼저 선언(혹은 정의)해 두고 사용해야 합니다. 최근의 C 표준인 C99에서 변경된 점이죠.

함수 원형이 도입됨으로써, 컴파일러는 함수의 리턴값이나 매개변수의 타입을 더 엄격하게 검사할 수 있게 되고, 또한 매개변수를 넘겨받을 때 좀 더 유연하게 받을 수 있게 되었습니다. 함수 원형이 없을 경우 매개변수가 전달될 때 골때리는 데이터형 변환과정(이름이 잘 생각 안나는데... function argument promotion였던가?)을 거치게 되며, 받을 수 있는 데이터형도 몇가지로 한정되게 됩니다.

현재는 비원형 선언 혹은 정의가 전혀 사용되지 않는만큼, 뭐 이런 긴 잡설까지는 사실 알 필요가 없는 것이고, 실제로 프로그래밍을 하는 데에는 다음의 사항들만 알고 있으면 됩니다.

#include <stdio.h>

int plus(int a, int b); // <- 함수 선언(declaration). 함수가 어떤 매개변수를 넘겨받고 어떤 데이터형을 반환하는지 컴파일러에게 미리 알려준다

// 함수 정의는 선언을 겸한다. 즉, 선언 없이 바로 정의가 와도 된다.
int minus(int a, int b)
{
    return a - b;
}

int main(void)
{
    // 모든 함수는 사용되기 전에 미리 선언 혹은 정의되어야 한다.
    printf("%d + %d = %d\n", 3, 5, plus(3, 5));
    printf("%d - %d = %d\n", 5, 3, minus(5, 3));
    return 0;
}

// 함수 정의(definition). 실제로 함수의 본체를 정의한다.
int plus(int a, int b)
{
    return a + b;
}

ps. 위에서 잠깐 implementation이란 단어가 나왔는데, 일반적인 의미론 '구현'으로 쓰이지만, C표준에서는 'C 코드를 번역하고 실행하는 프로그램 및 환경의 집합'이란 뜻의 특별한 의미를 담은 단어로 쓰입니다. 흔히 번역할때 '컴파일러'로 번역되곤 하죠. 혼동의 여지가 있기 때문에, 함부로 섞어 쓰시면 곤란합니다.

익명 사용자의 이미지

Quote:
ps. 위에서 잠깐 implementation이란 단어가 나왔는데, 일반적인 의미론 '구현'으로 쓰이지만, C표준에서는 'C 코드를 번역하고 실행하는 프로그램 및 환경의 집합'이란 뜻의 특별한 의미를 담은 단어로 쓰입니다. 흔히 번역할때 '컴파일러'로 번역되곤 하죠. 혼동의 여지가 있기 때문에, 함부로 섞어 쓰시면 곤란합니다.

creativeidler wrote:
위에 어떤 분이 implementation이라고 쓰셨는데 틀린 말은 아니지만 보통 implementation은 interface와 대응해서 쓰는 말이고

creativeidler님의 설명도 틀린 것은 아닙니다. 아마도 creativeidler님은 자바에 익숙하신 프로그래머이신 것 같군요. 자바에선 interface와 implements란 키워드가 사용합니다. 물론 제가 위에서 것과는 전혀 다른 뜻으로 사용됩니다만.

min2to의 이미지

감사~ 현재.. 다 원형 정의 나름대로 다 익히고..
흐흐.. 딴파트 하고 있어열.. ~

다들 정말 감사드려여.. 위에서 부터 읽어봐야지.. 흐흐..

다들 좋은하루 보내세여~ 후후.. 벌써 5시군..

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.