Q&A

  • procedure 와 function의 차이점?
꾸벅..^^;



먼저 저의 설명부터.^^;



-- procedure 와 function 의 차이점? --



1/ procedure 은 return value 가 없다.( 정말 없나? --?)

2/ function 은 리턴값이 있다..(있더군요.^^;)



지금까지 전 이렇게 알고있었습니다.근데.오늘 하나의 코드를 보고 의문점



procedure TForm1.미쳐버려(Sender Tobject);

var

str : String;

begin

str := '1';

돌아버려(str);



if str : ='2' then

begin

Application.massagebox('str은 '2' 이다.','돌아버려',mb_ok+mb_iconinformation);

end;



Application.messagebox('str은 '1'이다.','미쳐버려',mb_ok+mb_iconinformation);

end;



procedure TForm1.돌아버려(var str:string);

begin

str := '2'

end;



이런 코드가 있다면 procedure 미쳐버려의 변수str 은 '2'가 됩니다.

즉 변수 리턴이 된다(?) 는것인데..그럼...함수는 왜 만들었죠?

제 짧은 생각으론 함수와 프로시쳐의 차이점을 모르겠슴다.

함수는 자신은 변하지 않고도 리턴값을 줄수있다.? 뭐 이런건가요?

호기심이 강한놈이길래 ... 다른 차이점이 분명히 있다고 확신하고 질문 던집니다.



잘 알거나..대뜸 짚히는 것이 있으신분들은 게시 바랍니다.

4  COMMENTS
  • Profile
    양병규 2000.06.14 06:56
    말씀하신대로

    procedure는 리턴이 없고 function은 리턴이 있는거가 맞습니다.

    델파이 뿐 아니라 C에서도 마찬가지로 리턴이 있는것과 없는것이 따로 있지요...



    두 가지의 용도가 다릅니다.

    procedure는 일반적인 실행구문이고

    function은 주로 유틸리티로 사용됩니다.



    예를들어..



    IntToStr같은경우

    procedure보더는 function아 낫지요... 이해하기가 쉽다는 말입니다.



    쩝~



    그럼

    평안하시길~

  • Profile
    문홍철 2000.06.14 06:51
    돌아버려 wrote:

    > 꾸벅..^^;

    >

    > 먼저 저의 설명부터.^^;

    >

    > -- procedure 와 function 의 차이점? --

    >

    > 1/ procedure 은 return value 가 없다.( 정말 없나? --?)

    > 2/ function 은 리턴값이 있다..(있더군요.^^;)

    >

    > 지금까지 전 이렇게 알고있었습니다.근데.오늘 하나의 코드를 보고 의문점

    >

    > procedure TForm1.미쳐버려(Sender Tobject);

    > var

    > str : String;

    > begin

    > str := '1';

    > 돌아버려(str);

    >

    > if str : ='2' then

    > begin

    > Application.massagebox('str은 '2' 이다.','돌아버려',mb_ok+mb_iconinformation);

    > end;

    >

    > Application.messagebox('str은 '1'이다.','미쳐버려',mb_ok+mb_iconinformation);

    > end;

    >

    > procedure TForm1.돌아버려(var str:string);

    > begin

    > str := '2'

    > end;

    >

    > 이런 코드가 있다면 procedure 미쳐버려의 변수str 은 '2'가 됩니다.

    > 즉 변수 리턴이 된다(?) 는것인데..그럼...함수는 왜 만들었죠?

    > 제 짧은 생각으론 함수와 프로시쳐의 차이점을 모르겠슴다.

    > 함수는 자신은 변하지 않고도 리턴값을 줄수있다.? 뭐 이런건가요?

    > 호기심이 강한놈이길래 ... 다른 차이점이 분명히 있다고 확신하고 질문 던집니다.

    >

    > 잘 알거나..대뜸 짚히는 것이 있으신분들은 게시 바랍니다.1



    위의 경우는 function을 수식내부에 쓸수 있다는 장점이(?) 있지요.

    또하나 내부적으로는 큰 차이가 있습니다.

    function는 참조횟수에 관계없이 메모리의 한 부분에만 있고

    procedure는 참조횟수에 따라 메모리의 여러부분을 차지합니다.

    다시말해서 컴파일을 하게되면 function을 호출하는 곳은 function이

    위치한 포인터을 가지고 있어 작업이 끝나면 되돌아 오지만

    procedure는 호출하는 부분에 procedure루틴이 들어 간다고 생가하시면

    됩니다. ..?

    써놓고 보니 말의 앞뒤가 이상하네

    하옇든

    결과적으로 보면

    상대적으로 보면 function은 메모리 효율이좋지만 속도가 떨어지죠

    반면에 procedure는 메모리 효율이 떨어지지만 속도느 우세하지요..

    실질적으로 크게 구분을 안하고 쓰지만

    이런 특징이 있지요,

    정확한 표현이 이었는지 모르겠네요..!



  • Profile
    최용일 2000.06.14 08:26
    안녕하세요. 최용일입니다.



    약간 잘못된 점이 있는데요... procedure나 function이나 둘 다 같은 서브루틴입니다.



    메모리 효율이나 속도에는 차이가 없습니다. 둘다 호출할 때 번지를 참조하죠.



    호출하는 부분에 procedure 전체가 들어가지는 않습니다. function과 똑같습니다.



    procedure나 function이나 둘다 var 파라매터는 참조에 의한 호출로서 변수의 번지를



    참조합니다. 그래서 procedure나 function 내부에서 변수를 바꾸면 직접적으로 값이 바꾸어



    지게 됩니다. var 파라매터가 아닌 일반파라매터는 값에의한 호출로서 변수의 값이



    호출될때 스택에 들어값니다. 그러니 그 값을 바꾼다해도 원본 파라매터 변수는 변하지



    않는 것입니다.



    procedure나 function둘의 차이는 단지 리턴값이 있느냐 없느냐 일 뿐입니다. 그러므로



    function은 수식에서 오른쪽에 쓸 수 있지만 procedure는 그렇지 못하죠..



    ^^ 항상 즐코하세요.



    문홍철 wrote:

    >

    > 위의 경우는 function을 수식내부에 쓸수 있다는 장점이(?) 있지요.

    > 또하나 내부적으로는 큰 차이가 있습니다.

    > function는 참조횟수에 관계없이 메모리의 한 부분에만 있고

    > procedure는 참조횟수에 따라 메모리의 여러부분을 차지합니다.

    > 다시말해서 컴파일을 하게되면 function을 호출하는 곳은 function이

    > 위치한 포인터을 가지고 있어 작업이 끝나면 되돌아 오지만

    > procedure는 호출하는 부분에 procedure루틴이 들어 간다고 생가하시면

    > 됩니다. ..?

    > 써놓고 보니 말의 앞뒤가 이상하네

    > 하옇든

    > 결과적으로 보면

    > 상대적으로 보면 function은 메모리 효율이좋지만 속도가 떨어지죠

    > 반면에 procedure는 메모리 효율이 떨어지지만 속도느 우세하지요..

    > 실질적으로 크게 구분을 안하고 쓰지만

    > 이런 특징이 있지요,

    > 정확한 표현이 이었는지 모르겠네요..!

    >

  • Profile
    술친구 2000.06.14 06:35
    돌아버려 wrote:

    > 꾸벅..^^;

    >

    > 먼저 저의 설명부터.^^;

    >

    > -- procedure 와 function 의 차이점? --

    >

    > 1/ procedure 은 return value 가 없다.( 정말 없나? --?)

    > 2/ function 은 리턴값이 있다..(있더군요.^^;)

    >

    > 지금까지 전 이렇게 알고있었습니다.근데.오늘 하나의 코드를 보고 의문점

    >

    > procedure TForm1.미쳐버려(Sender Tobject);

    > var

    > str : String;

    > begin

    > str := '1';

    > 돌아버려(str);

    >

    > if str : ='2' then

    > begin

    > Application.massagebox('str은 '2' 이다.','돌아버려',mb_ok+mb_iconinformation);

    > end;

    >

    > Application.messagebox('str은 '1'이다.','미쳐버려',mb_ok+mb_iconinformation);

    > end;

    >

    > procedure TForm1.돌아버려(var str:string);

    > begin

    > str := '2'

    > end;

    >

    > 이런 코드가 있다면 procedure 미쳐버려의 변수str 은 '2'가 됩니다.

    > 즉 변수 리턴이 된다(?) 는것인데..그럼...함수는 왜 만들었죠?

    > 제 짧은 생각으론 함수와 프로시쳐의 차이점을 모르겠슴다.

    > 함수는 자신은 변하지 않고도 리턴값을 줄수있다.? 뭐 이런건가요?

    > 호기심이 강한놈이길래 ... 다른 차이점이 분명히 있다고 확신하고 질문 던집니다.

    >

    > 잘 알거나..대뜸 짚히는 것이 있으신분들은 게시 바랍니다.



    안냐세요.. 술친굽니다.

    제 생각에는 돌아버려 프로시져가 값을 리턴하는 것이 아니고

    다만 미쳐버려 프로지져에 선언된 str 변수에 돌아버려 프로시져에서

    값을 대입하는 것이라 생각되는군요..

    즉 미쳐버려 프로시저에서 선언된 변수는 내부에 있는 돌아버려 프로시저에서도

    사용이 가능하다는 얘기지요..

    제 답변이 이해가 되셨는지요.. 저도 사실은 하수라..

    고수들의 조언을 기다립니다.

    술친구였습니다.

    • 하얀까마귀
      2000.06.14 08:56
      안녕하세요 하얀까마귀 입니다.. 제가 알기론 그룹 풋터를 하나이상 사용하실 수 없습니다.. 그런데....
    • 아리엘
      2000.06.14 18:28
      답변 무지무지 감사해요. 헤헤.. 저는 언제 까마귀님처럼 남에게 답변해줄 실력이 될까여 ^^ 음~~ 근데...
    • 머리나쁜얀
      2000.06.14 21:18
      그룹푸터 2개두 사용가능합니다 근데 3개는 안써봤어여 저두 초보라 도움이 되실런지 모르겠습니다만 ...
    • 최용일
      2000.06.14 04:38
      안녕하세요. 최용일입니다. Notification Object를 사용하세요. 윈도우즈에서는 이 객체를 다루는 함수...
    • 타락천사
      2000.06.14 18:16
      안녕하세여.. 타락임다..^^ ReadDirectoryChangesW() 는 몰랐어여.. 우러러~~~ 왕초보 타락천사..^__...
    • 최석기
      2000.06.14 04:31
      박대규 wrote: > 안녕하세요. 델파이를 사랑하는 여러분... > > 다름이 아니라 탐색기에서 새로운 폴더...
    • 최용일
      2000.06.14 04:09
      안녕하세요. 최용일입니다. 아마도 델파이 3이상의 버전을 사용하시나 보네요. OleAuto유닛은 ActiveX, ...
    • 하얀까마귀
      2000.06.14 09:01
      안녕하세요 하얀까마귀 입니다. Form2.cp1Rxchar(sender, count); 라고 하시면 됩니다. 메뉴가 안나...
    • shock
    • 2000.06.14 03:06
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.06.14 06:26
      안녕하세요. 최용일입니다. MultiByteToWideChar란 API함수를 사용하세요. ^^ 항상 즐코하세요. s...
    • shock
      2000.06.14 20:09
      안녕하세요~ 좀더 구체적인 코드를 알려 주실순 없습니까? 저도 그 API 씨리즈를 보긴 했는데 써먹는 ...
    • 최용일
      2000.06.14 20:22
      안녕하세요. 최용일입니다. OLE를 사용하지 않는다면 WideString데이타형에 대입하시면 간단히 바꾸어집...
    • 왕초보
    • 2000.06.14 03:06
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김병식
      2000.06.14 03:18
      왕초보 wrote: > 델파이5.0, SQLserver7.0을 C/S로 개발했습니다. > 문제는 인스톨 파일을 만드는것인데 ...
    • 왕초보
      2000.06.14 04:04
      파일이래봐야 실행파일 하나와 BDE 포함 하는것일진데 파일이 많아서 그런건가요? 김병식님 처럼 저와 같...
    • 한창희
      2000.06.14 10:15
      초보에서벗어나자 wrote: > 두개의 TEdit로 조회를 하려 합니다. > 일반적으로 '전체'하면 모든 목록이 ...
    • 최용일
      2000.06.14 04:44
      안녕하세요. 최용일입니다. 어셈블리처럼 그러한 연산자는 없습니다. 계산에 의해서 MSB(LSB)를 LSB(MSB...
    • 양병규
      2000.06.14 06:56
      말씀하신대로 procedure는 리턴이 없고 function은 리턴이 있는거가 맞습니다. 델파이 뿐 아니라 C에서도...
    • 문홍철
      2000.06.14 06:51
      돌아버려 wrote: > 꾸벅..^^; > > 먼저 저의 설명부터.^^; > > -- procedure 와 function 의 차이점...
    • 최용일
      2000.06.14 08:26
      안녕하세요. 최용일입니다. 약간 잘못된 점이 있는데요... procedure나 function이나 둘 다 같은 서브루...
    • 술친구
      2000.06.14 06:35
      돌아버려 wrote: > 꾸벅..^^; > > 먼저 저의 설명부터.^^; > > -- procedure 와 function 의 차이점...
    • paulyoon
    • 2000.06.14 01:55
    • 0 COMMENTS
    • /
    • 0 LIKES
    • heimdal
    • 2000.06.14 01:39
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 선해석
    • 2000.06.14 00:57
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 술친구
      2000.06.14 07:00
      선해석 wrote: > 초보적인 질문을 드립니다. > > stringgrid에 query값을 집어 넣으려고 하는데 워낙 ...
    • 유레카
      2000.06.14 01:53
      stringgrid.cells[1,1] := IntToStr(Query.FieldByName('count').AsInteger); 선해석 wrote: > 초...
    • 까마귀
      2000.06.14 01:45
      안녕하세요. 까마귀입니다. stringgrid.cells[1,1] := Query.FieldByName('count').AsString; 라...
    • 한선희
    • 2000.06.14 00:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정우석
      2000.06.14 02:05
      자세한 정황은 잘 모르겠지만, 수상한 점은 오라클 7.3.4 에 접속하시는데 ORA803.DLL을 쓰시네요... 보...
    • 델초보
    • 2000.06.14 00:43
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 모승열
      2000.06.14 01:23
      델초보 wrote: 말 그대로입니다. 타입이 틀렸네요. 필드명을 생략할때는 필드순서랑 데이타값 순서가 ...
    • 델초보
      2000.06.14 02:34
      필드순서하고 데이타값 순서하고 똑 같은데요.. 왜 에라가 나죠(type mismitch) 모승열 wrote: > 델초...
    • 유레카
      2000.06.14 01:21
      insert into MONTHINCOMETBL (Mo_COMPANY, MO_MONTH, MO_AMTINCOME, MO_PMTINCOME, MO_AMRINCOME, MO_P...
    • 델초보
      2000.06.14 02:40
      일부러 필드를 생략했거든요... 근데 파라미터랑 필드순서랑 똑같아요... 근데 왜 에러가 날까요? 유...
    • 유레카
      2000.06.14 03:04
      close를 빼먹었든지, sql.clear를 빼먹었든지, 아니면 sql문에서 띄어쓰기가 맞는지 확인해 보세요.. ...