'return'에 해당되는 글 2건

Programming/Microsoft SQL Server
1. Begin/End

연관된 여러 Query를 그룹화 합니다. 이는 비슷하거나 같은 목적별로 작동하는 Query를 묶어 관리를 용이하게 합니다.

Begin
     Select * From HumanResources.Department;
     Select * From HumanResources.Employee;
End

2. While

조건에 따라 Query를 반복 실행합니다.

Declare @i Int;
Set @i = 1

While(@i <= 5)
Begin
 Select *
 From HumanResources.Department
 Where DepartmentID = @i;
 
 Set @i = @i + 1;
End


정수형 변수  @i를 선언하고 초기값을 1로 해준 후 @i값이 5와 같거나 미만인 경우에만 Begin/End 사이의 Query를 수행하도록 합니다.


3. Continue

Continue를 While문에 포함시키면 해당 구문이 들어간 위치이하의 Query실행을 건너뛸 수 있습니다.

Declare @i Int;
Set @i = 1

While(@i <= 5)
Begin
 If (@i = 4)
 Begin
  Set @i = @i + 1;
  Continue;
 End
 
 Select *
 From HumanResources.Department
 Where DepartmentID = @i;
 
 Set @i = @i + 1;
End


정수형 변수 @i를 선언하고 초기값을 1로 하였습니다. 이때 @i값이 5와 같거나 미만인 경우에만 Begin/End 사이의 Query를 수행하도록 합니다.

단, If문을 통하여 @i가 4인 경우에는 Continue문으로 실행을 건너 뛰도록 합니다.


4. Break

Break를 While에 포함시키면 해당 구문이 들어간 위치이하의 Query실행을 취소할 수 있습니다.

Declare @i Int;
Set @i = 1

While(@i <= 5)
Begin
 If (@i = 4)
 Begin
  Set @i = @i + 1;
  Break;
 End
 
 Select *
 From HumanResources.Department
 Where DepartmentID = @i;
 
 Set @i = @i + 1;
End


If문에서 Continue대신 Break문을 삽입하였습니다. Break는 재실행 없이 While문 전체를 취소합니다.


5. Waitfor

지정한 특정시간에 또는 해당 시간만큼 대기한 후 Query를 실행합니다.

Waitfor Delay '00:00:05'
Begin
 Select * From HumanResources.Department;
End

약 5초간 대기한 후 Query를 실행합니다.


실행 결과를 보면 Query실행 시간이 00:00:05 라고 표시되어 있음을 확인할 수 있습니다.

Waitfor Time '19:15:00';
Begin
 Select * From HumanResources.Department;
End

오후 07시 15분이 되면 Query를 실행합니다.


6. Return

Query의 실행을 종료합니다. 숫자나 문자열을 인수로 지정하면 해당 값을 반환값으로 얻을 수 있습니다.

Select * From HumanResources.Department;
Return;
Select * From HumanResources.Employee;

Return이하 Query문은 실행하지 않고 종료합니다. (또 다른 종료 구문인 Break는 While등의 반복문 안에서만 유효합니다.)


7. IF

Query수행에 따른 조건을 지정할 수 있습니다.

Declare @i Int;
Set @i = 2;

If (@i = 1)
Begin
 Select * From HumanResources.Department;
End
Else If (@i = 2)
Begin
 Select * From HumanResources.Employee;
End
Else
Begin
 Select * From HumanResources.EmployeeDepartmentHistory;
End


변수 @i값에 따라 1이면 Select * From HumanResources.Department문을 2면 Select * From HumanResources.Employee문을 그외 다른 값이면 Select * From HumanResources.EmployeeDepartmentHistory문을 실행합니다.

▶ Set을 통해 2의 값을 넣었으므로 If문의 조건에 따라 Select * From HumanResources.Employee문이 수행되었습니다.

조건지정에서는 처음 If문과 그 다음 Else If문을 통하여 각기 다른 값에 따라 처리를 달리할 수 있습니다. 또한 If와 그 외 모든 Else If의 조건에 부합하지 않을 경우에는 Else문을 통하여 별도의 처리를 지정할 수도 있습니다.

8. Goto

Query수행에 대한 분기 명령으로 원하는 지점부터 Query수행을 지시할 수 있습니다.

Declare @i Int;
Set @i = 3;

If (@i = 1)
Begin
 Goto Squery_rtn1;
End
Else If (@i = 2)
Begin
 Goto Squery_rtn2;
End
Else
Begin
 Goto Squery_rtn3;
End

Squery_rtn1:
Begin
 Select * From HumanResources.Department;
End
Return;

Squery_rtn2:
Begin
 Select * From HumanResources.Employee;
End
Return;

Squery_rtn3:
Begin
 Select * From HumanResources.EmployeeDepartmentHistory;
End
Return;


변수 @i값에 따라 Query를 수행할 분기점이 달라지도록 하였습니다.(만일 @i값이 2이면 Squery_rtn2지점으로 jump하여 Return까지 모든 Query를 수행합니다.)

분기할 지점은 'Goto [분기할 이름]'의 형식으로, 실제 분기 지점은 '[분기할 이름]:'형식(반드시 이름 끝에 : 문자가 붙어야 합니다.!)으로 지정합니다.

주의: Goto문으로 실행 분기점을 지정한다는 것은 해당 지점부터 이하 모든 Query수행을 의미합니다.
즉, '해당 지점만'실행한다는 의미가 아니므로 원하는 분기지점만 수행을 원할경우 분기점마지막에 반드시 Return을 넣어 주도록 합니다.

Squery_rtn2:
Begin
 Select * From HumanResources.Employee;
End
Return;

Return문이 존재하지 않으면 실행분기점이 Squery_rtn2지점일때 Squery_rtn2뿐만 아니라 Squery_rtn3지점까지도 모두 실행하게 됩니다.

▶ @i변수에 3이 지정되어 Squery_rtn3: 으로 실행지점이 분기되었습니다.

'Programming > Microsoft SQL Server' 카테고리의 다른 글

[SQL] Table 조회시 합계 표시하기  (0) 2010.04.26
[SQL] 하위 Query(Sub Query)  (0) 2010.04.21
[SQL] 흐름제어 구문  (0) 2010.04.08
[SQL] 데이터(Data) 형식  (2) 2010.04.01
[SQL] Table Join  (3) 2010.03.31
Microsoft SQL Server 설치  (0) 2010.03.25
0 0
Programming/C C++
1. 기본작성법

#include <stdio.h>

main()
{
  printf("main 함수\n");
 
  prnt();
}
prnt()
{
  printf("prnt 함수\n");
}


prnt함수를 작성하고 main에서 prnt함수를 호출합니다.


2. 함수의 Data전달 인수설정

(1) 단일인수

#include <stdio.h>

main()
{
  int a;
  int b;
 
  a = 100;
  b = 200;
 
  prnt(a, b);
}
prnt(int a, int b)
{
  printf("결과 %d\n", a + b);
}


'함수명(데이터형 변수, 데이터형 변수...)' 형식으로 함수를 작성하면 값을 받을 수 있는 함수가 됩니다. 예제에서는 prnt(int a, int b)라고 하였으므로 integer형 값 2개를 인수로 받을 수 있으며 함수내부에서는 인수값 2개를 합하여 그 결과를 표시하도록 하였습니다.(main함수에도 a와 b라는 변수가 있으며 prnt함수에도 a와 b라는 변수가 있는데 각각의 함수안에서 쓰인 변수명은 서로 같다 하더라도 충돌하지 않습니다.)

참고:
호출되는 함수의 입장에서는 어떤 값이 인수로 전달될지 모르기 때문에 이 인수를 가르켜 가인수라고 하며 함수를 호출하는 입장에서는 어떤 값을 줄지 명확하므로 실인수라고 합니다.


(2)배열인수

#include <stdio.h>

main()
{
  char s[6] = "hello";
 
  prnt(s);
}
prnt(char ss[])
{
  printf("%s 라고 인사하다.\n", ss);
}


prnt에 단일값이 아닌 배열(문자배열)로 인수값을 건네주고 있습니다. 배열의 경우에는 함수를 호출하는 쪽도, 호출되는 실제 함수쪽도 배열 길이가 100이나 1000, 2000정도 되었을때 a[1], a[2], a[3].... 처럼 일일이 건네주려고 하면 매무 어려울 것입니다.
따라서 배열의 경우에는 배열값 자체가 아니라 배열의 첫 주소값만 전달하는 방법을 사용하고 있습니다.

main에서 prnt함수를 호출할때 배열이름인 s만 인수로 건네주고 있습니다. s[6]처럼 배열의 요소를 지정하지 않았는데 왜냐하면 s라고 하는 녀석이 배열이 시작되는 첫 주소를 가지고 있기 때문입니다. 즉, 함수끼리 배열을 인수로 건네줄때는 배열의 시작주소만으로 전달하면 되는 것입니다.

prnt함수에서는 '데이터형 이름[]'의 형태로 인수를 지정하여 배열값(실제는 배열의 첫 주소값)을 받도록 합니다. 이처럼 함수를 작성할때 배열을 인수로 하는 경우에는 얼마만큼의 배열을 받을지 알 수 없기 때문에 char ss[10]처럼 하는 경우는 거의 없습니다. 오로지 배열이 시작되는 첫 주소값만을 인수로 가지기 때문입니다.

정리하자면 배열값을 함수끼리 인수로 건네주고 받을때는 '배열값 자체가 아니라 배열의 시작주소만을 전달한다.' 라는 것을 기억해 두시기 바랍니다.


(3) 주소값 인수

#include <stdio.h>

main()
{
  int a, b, c;
 
  a = 200;
  b = 200;
 
  c = prnt(&a, &b);
 
  printf("결과 %d\n", c);
}

int prnt(int *a, int *b)
{
  return (*a + *b);
}


함수로 인수를 전달할때는 값자체가 아닌 주소값을 전달 할 수도 있습니다. 주소라는 것은 현재 변수값이 아니라 Memory의 어떤 부분에 저장되어 있는가를 의미하는 Memory의 주소값을 전달하는 것입니다.

변수의 주소값은 '&변수명'형식으로 나타낼 수 있으며 함수가 주소값을 인수로 전달받을 경우에는 '*인수명'으로 지정해 인수를 받아오도록 처리합니다.


그럼 값을 전달하는 것과 주소값을 전달하는것은 무슨 차이가 있을까요? 함수의 인수로 값을 전달하는 경우는 해당 값이 복사되어 인수로 전달되는 것입니다.

#include <stdio.h>

main()
{
  int a, b, c;
 
  a = 200;
  b = 200;
 
  c = prnt(a, b);
 
  printf("결과 %d\n", c);
}

int prnt(int a, int b)
{
  return (a + b);
}


이와 같이 값을 전달하도록 하는 경우 main함수의 변수 a와 b에 있는 각각 200이라는 정수값을 prnt함수의 a와 b인수에 전달하게 되므로 main함수 a와 b에도 200, prnt함수 a와 b에도 200이라는 똑같은 값을 가지게 되는 것입니다.

따라서 만일 prnt함수에서 인수값 a와 b의 값을 바꾸게 되는 경우가 생겨도 main함수의 a와 b에는 영향을 주지 않습니다. 값이 복사되는 형태로 전달되기 때문에 완전히 별개의 변수로 Data를 가지고 있기 때문입니다.


하지만 값이 아닌 주소를 인수로 건네주는 경우에는 해당 주소가 건네진 변수값을 바꾸게 될때 이 주소를 참조로 하고 있는 다른 부분에 대해서도 영향을 받게 됩니다.

#include <stdio.h>

main()
{
  int a, b, c;
 
  a = 200;
  b = 200;
 
  printf("main함수의 a값은 %d\n", a);
  printf("main함수의 b값은 %d\n", b);
 
  prnt(&a, &b);
 
  printf("main함수의 a값은 %d\n", a);
  printf("main함수의 b값은 %d\n", b);
}

int prnt(int *a, int *b)
{
  *a = *a + 20;
  *b = *b + 20;
 
  return;
}


main에서 변수 a가 저장된 Memory번지를 1000번지 변수 b가 저장된 Memory번지를 2000번지라고 가정했을때 prnt함수를 호출하여 주소값을 전달하면 각 변수의 값인 200을 보내는 것이 아니라 a와 b의 주소인 1000번지와 2000번지를 인수로 보내게 됩니다.

prnt함수에서는 *a = *a + 20와 *b = *b + 20;을 통해 1000번지의 Memory주소에 있는 값과 2000번지의 Memory주소에 있는 값을 바꾸게 되면 결국 maint함수에서는 바뀌어진 값을 표시하게 되는 것입니다.


3. 값의 반환

#include <stdio.h>

main()
{
  int a, b, c;
 
  a = 100;
  b = 200;
 
  c = prnt(a, b);
 
  printf("결과 %d\n", c);
}

int prnt(int a, int b)
{
  int c;
 
  c = (a + b);
 
  return c;
}


prnt함수에서 두개의 정수형 Data를 인수로 받아 그 인수를 더한 후 결과값을 다시 호출한 main()으로 반환하고 있습니다. 값을 반환하는 함수의 경우는 함수명 앞에 값을 반환하는 Data형을 지정하고 함수내부에서 return을 통해 Data형에 맞는 값을 반환하도록 합니다.


이때 함수에서 주소값을 반환하려면 함수명 앞에 주소를 나타내는 *문자를 붙이고 값이 아닌 주소를 건네주기만 하면 됩니다.

다음은 정수값을 갖는 변수의 주소와 문자열값을 갖는 pointer의 주소를 반환하고 그 주소값의 Data를 확인하는 예제입니다.

#include <stdio.h>

int *number(int i, int j);
char *namechar();

main()
{
  printf("%d\n", *number(10, 20));
  printf("%s\n", namechar());
}

int *number(int i, int j)
{
  int r;
 
  r = i + j;
 
  return &r;
}

char *namechar()
{
  char *name = "kosama\0";
 
  return name;
}



참고:
return문은 값을 반환하는 기능이외에 함수의 처리를 중단하는 기능으로도 사용되며 값을 반환하는 경우도 단일값 이외에 수식을 처리하는 방법으로도 활용할 수 있습니다. 또한 필요하다면 return문은 여러개를 하나의 함수에 쓸 수도 있습니다.

#include <stdio.h>

main()
{
  int a, b, c;
 
  a = 100;
  b = 200;
 
  c = prnt(a, b);
 
  printf("결과 %d\n", c);
}

int prnt(int a, int b)
{
  if (a != 100){
    printf("a가 100이 아닙니다.\n함수처리 중단...\n");
    return;
  }
  else
    return (a + b);
}


a가 100일 경우 return문을 통해 a와 b인수를 합한 결과값을 반환하도록 합니다.


#include <stdio.h>

main()
{
  int a, b, c;
 
  a = 200;
  b = 200;
 
  c = prnt(a, b);
 
  printf("결과 %d\n", c);
}

int prnt(int a, int b)
{
  if (a != 100){
    printf("a가 100이 아닙니다.\n함수처리 중단...\n");
    return;
  }
  else
    return (a + b);
}


a가 100이 아닌경우 Message를 출력하고 return하여 함수처리를 중단하도록 합니다.(함수가 중단되어도 main함수에서는 여전히 결과값을 표시하기 때문에 의미가 없는 값이 출력되고 있습니다.)


이때 return문으로는 2개 이상의 인수를 전달할 수 없습니다. 만일 2개의 결과를 동시에 받아야 한다면 return이 아닌 함수에 주소값을 전달하거나 전역변수를 사용하여 처리해야 합니다.

4. Prototype 선언으로 함수사용법 명확히 하기

C언어는 Compil시에 Program내부에서 함수의 호출이 올바른가에 대한 판단은 하지 않습니다. 예들들어

#include <stdio.h>

main()
{
  int a, b, c;
 
  a = 200;
  b = 200;
 
  c = prnt(a, "abc");
 
  printf("결과 %d\n", c);
}

int prnt(int a, int b)
{
  return (a + b);
}


prnt함수는 정수형 인수 2개만 받을 수 있지만 main에서는 prnt함수를 호출할때 "abc"라는 문자열값을 인수로 건네주고 있습니다.

이 Program을 Compil하면 어떠한 오류도 표시하지 않지만 실제 Program을 실행시켜 보면 정상적으로 동작하지 않음을 알 수 있습니다.


이 문제를 해결하기 위해서는 Program의 선두에 해당 함수의 형식을 지정해야 하는데 이 것을 흔히 Prototype 선언(함수원형선언)이라고 합니다.

#include <stdio.h>

int prnt(int a, int b);

main()
{
  int a, b, c;
 
  a = 200;
  b = 200;
 
  c = prnt(a, "abc");
 
  printf("결과 %d\n", c);
}

int prnt(int a, int b)
{
  return (a + b);
}


Program상단에 int prnt(int a, int b); 라는 Prototype을 선언하였습니다. Prototype을 선언하는 방법은 함수를 작성할때의 가장 처음부분을 똑같이 써주기만 하면 됩니다.


Program을 Compile하려고 하자 Prototype선언으로인해 함수사용이 잘못되었음을 표시해 주고 있습니다.

또한 Prototype선언시 인수부분에는 인수명을 생략하고 다음처럼 데이터형만 나타낼 수 있습니다.

int prnt(int, int); 또는 주소값 전달시 int prnt(int *, int *); 

실제 prnt에서 쓰인 a와 b라는 인수명을 생략하였는데. 이렇게 하는것도 정상적인 Prototype선언에 해당합니다.

물론 Prototype 선언을 하지않고도 함수사용에 대한 오류를 나타낼 수 있습니다. 이렇게 하려면 Program에서 개발자가 작성한 함수를 main함수위에 놓게 되면 Prototype을 선언한것과 같은 효과를 볼 수 있습니다.

#include <stdio.h>

int prnt(int a, int b)
{
  return (a + b);
}

main()
{
  int a, b, c;
 
  a = 200;
  b = 200;
 
  c = prnt(a, "abc");
 
  printf("결과 %d\n", c);
}


prnt함수를 main위에 작성하였습니다.


Prototype을 선언한것과 같은 오류를 나타내고 있습니다.

5. header File선언과 Prototype선언의 관계

Program에서 printf함수를 호출하여 사용한 경우 #include <stdio.h>를 통해 stdio.h header File선언이 필요하다고 하였습니다.

이것은 printf함수가 어떻게 동작할지에 대한 실체적 부분이 stdio.h안에 있기 때문인데 그것 말고도 printf함수가 어떻게 사용되야 하는지에 대한 Prototype선언이 stdio.h안에 정의 되어 있기 때문입니다.

따라서 printf함수처럼 사용자 함수가 아닌 표준 함수를 사용한 경우에는 각 함수마다 필요한 header File에 Prototype이 선언되어 있으므로 혹시 함수를 잘못 사용한 경우가 생긴다 하더라도 Compile시에 오류를 나타낼 수 있는 것입니다.

main()
{
  printf(100);
}

stdio.h의 include부분을 빼고 printf를 호출하였습니다. printf함수를 호출할때 정수값인 100을 곧장 인수로 건네주고 있는데 이것은 printf함수를 잘못 사용하고 있는 것입니다.


Compile시에 오류가 없으나 실제 Program을 작동시키면 오류가 발생하게 됩니다.

#include <stdio.h>

main()
{
  printf(100);
}


include를 통해 stdio.h File을 다시 포함하도록 하였습니다.


Compile을 시도하려 하자 함수사용이 잘못 되었음을 알리는 오류가 나타납니다.

6. 함수의 통용범위

일반적으로 함수를 선언하면 해당 함수는 다른 File에서 선언된 함수라 하더라도 사용이 가능합니다.

#include <stdio.h>

main()
{
  printf("main함수 입니다.\n");
 
  myfunc();
}
▶ 위 program을 test.c로 저장합니다.

#include <stdio.h>

myfunc()
{
  printf("myfunc함수 입니다.\n");
}


이 Program을 test2.c로 저장합니다.


main에서 myfunc함수를 정상적으로 호출하고 있습니다.

만일 작성된 함수를 다른 File에서 참조할 수 없도록 하려면 함수를 Static로 선언하면 됩니다. 위 Program에서 myfunc함수를 수정하여 Static으로 선언하고

#include <stdio.h>

static myfunc()
{
  printf("myfunc함수 입니다.\n");
}


test2.c로 저장하고 Compile을 시도하면 error를 발생하게 됩니다.


참고로 main에서는 별도로 떨어진 File에서 static으로 선언된 함수를 호출하는 것이 불가능합니다.

7. void형 함수

어떠한 인수도 받지 않는 함수는 괄호(())만을 통하여 인수설정을 생략할 수 있지만 이를 좀더 명시적으로 표현하기 위해서는 void를 사용합니다.

#include <stdio.h>

main()
{
  prnt();
}

prnt(void)
{
  printf("인수없음\n");
}


prnt()사용자 함수에 void를 사용하여 인수가 없음을 명시하고 있습니다.

더불어 prnt()함수에서는 어떠한 값도 반환하지 않는데 이때에도 void는 아무런 값을 반환하지 않는 함수라는 것을 명시하기도 합니다.

#include <stdio.h>

main()
{
  (void)prnt();
}

void prnt(void)
{
  printf("인수없음\n");
}


print()함수에 void를 사용하여 반환값과 인수값없음을 명시적으로 표현하고 있습니다. 또한 prnt()함수를 호출하는 쪽에서도 함수앞에 (void)라고 작성함으로써 함수를 호출하지만 어떠한 값도 받지 않는다는 것을 명시하고 있습니다.(값을 반환하는 함수를 호출한다 하더라도 되돌아 오는 값을 활용할 필요가 없는경우에도 쓰이곤 합니다.)

'Programming > C C++' 카테고리의 다른 글

[C, C++] Microsoft C, C++ Compiler  (0) 2010.01.22
[C, C++] Class 상속  (0) 2010.01.13
[C, C++] 함수작성및 Data전달  (0) 2010.01.07
C언어 함수사용 예제 Souce  (0) 2010.01.06
[C, C++] Pointer  (0) 2010.01.05
[C, C++] 변수통용범위(변수의 기억 Class)  (0) 2010.01.04
0 0
1
블로그 이미지

클리엘