'Header'에 해당되는 글 2건

Programming/HTML CSS
HTML5 에서 헤더구조에 사용되는 태그는 다음과 같습니다.

1. header

헤더의 전체적인 구조를 나타냅니다. 헤더는 header로 시작해 header로 끝납니다.

2. hgroup

헤더에서 사이트의 제목이나 슬로건이 담겨지는 부분입니다.

3. nav

사이트의 메뉴를 이루는 부분입니다. 메뉴는 사이트의 전체메뉴이거나 특정한 상황에서만 보여지는 메뉴일 수 있으며 필요하다면 header안에서 2개 이상의 nav요소가 사용될 수 있습니다.

4. section

이 태그안에는 화면에 보여일 웹페이지의 주요 컨텐츠를 담아둡니다. 일종의 본문에 해당합니다.

5. article

section 안에서 주제별로 구분되는 본문을 배치합니다.

6. aside

화면의 좌, 우측에 보여지는 컨텐츠를 포함하는 영역입니다.
 
7. footer

사이트의 하단부분을 구성하는 영역입니다.
<body>
 <header>
  <hgroup>
   <h1>CLIEL</h1>
  </hgroup>
  <nav>
   <ul>
    <li>HOME</li>
    <li>MENU1</li>
    <li>MENU2</li>
   </ul>
  </nav>
 </header>
 <div>
  <section>
   <article>A couple of days ago I returned from my trip to the U.S.</article>
   <article>We had traveled on business to Phoenix, AZ.</article>
   <article>Although there were no arrangements to do any flying, I had decided to bring a flight suit with me. I figured, you never know… </article>
  </section>
  <aside>
   How I Flew a Huey in Arizona
  </aside>
 </div>
 <footer>
  HTML5
 </footer>
</body>
위에서 말씀드린 태그는 사이트의 구조에서 각각의 부분이 어떤 역활을 하고 있는지 명확하게 구분하기 위한 목적이 강합니다. 소스상에서 구분(정확히는 검색엔진등에서)되는 용도이므로 태그가 실제 웹 브라우저에서 표시될때 어떤 특별한 처리가 이루어 지지는 않습니다.

그냥 각 태그에 의미를 부여 해놓은 형태인데 이것은 '시멘틱 웹'이라 표현합니다.

실제로 header나 hgroup, nav 태그를 제거해도 브라우저에 표시되는 모양새는 태그를 사용한 경우와 별반 다르지 않습니다. 따라서 필요하다면 개발자나 디자이너가 직접 CSS를 정의하여 목적에 맞게 디자인을 입혀야 합니다.

'Programming > HTML CSS' 카테고리의 다른 글

[CSS3] 선택자 - 자손 선택  (0) 2013.06.17
[HTML / HTML5] label  (0) 2013.06.13
[HTML5] header, nav, aside, section, article, footer (구조태그)  (0) 2013.06.12
[CSS3] display  (0) 2013.06.11
[CSS3] 선택자 - 태그 선택  (0) 2013.06.10
[HTML] frameset, frame  (2) 2013.06.07
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
블로그 이미지

클리엘