'float'에 해당되는 글 2건

Programming/HTML CSS
1. CSS z-index, top, left, zoom, float 사용
.css_img {
 position: relative;

 top:10px;
 left:10px;

 height:100px;
 width:100px;
}

.css_div {
 position: absolute;

 top:10px;
 left:50px;
}
▶CSS 정의 - img에서 지정한 이미지의 위치를 위쪽에서 10px, 왼쪽에서 10px 떨어진 지점에 배치합니다.
<img class="css_img" src="sample.jpg">
<div class="css_div">CLIEL</div>
▶CSS 적용 - div 위치를 위쪽에서 10px, 왼쪽에서 50px 떨어진 지점에 배치합니다.

2. CSS z-index, top, left, zoom, float 속성

(1) z-index

요소가 겹쳐서 배치될때 배치되는 순서를 지정합니다. 정수로 지정하며 숫자가 높을 수록 위로 올라오게 됩니다.

(2) position

위치와 관련된 속성을 설정합니다. 이 속성의 값을 absolute로 설정하면 top과 left 속성에 지정된 좌표값(절대값)에 해당하는 위치에 요소가 배치되도록 합니다.

(3) top

요소가 배치되는 세로위치를 지정합니다. 단위로는 in(인치), cm(센치미터), mm(밀리미터), pt(포인터), pc(피카스) 단위를 사용하며 em(배수, 1.5 = 150%), ex(em대비 1/2크기), px(픽셀), %(%단위)등의 상대적 단위크기를 사용하기도 합니다.

(4) left

요소가 배치되는 가로위치를 지정합니다. 단위는 top과 같습니다.

(5) zoom

요소가 배치될때 확대비율을 지정합니다. 1이면 100%를 1.5면 150%를 의미하며 100%, 150%의 단위를 사용하여 지정할 수도 있습니다.

(6) float

텍스트와 함께 배치되는 경우의 표시위치를 지정합니다. left(왼쪽), right(오른쪽) 값을 사용할 수 있으며 none(적용없음)을 지정할 수도 있습니다. none는 기본값입니다.

본래 이 속성은 이미지에만 사용하는 것을 기본으로 하지만 필요에 따라 div등 화면의 레이아웃을 구성하기 위한 다른 태그에도 적용이 가능합니다.

(7) overflow

부모 요소안에 자식요소의 배치가 포함되어 있는 경우 자식 요소가 부모요소의 범위를 벗어날때 어떻게 처리되느냐를 지정하는 속성입니다.

이 속성값을 hidden으로 하는 경우 안에 포함된 자식 요소가 범위를 벗어나면 벗어나는 부분을 숨기게 되고 scroll 로 지정하면 벗어나는 부분을 표시하되 그 영역이 브라우저 화면을 넘으면 스크롤을 생성하게 됩니다.

이 속성은 부모 요소에 적용해야 합니다.
0 0
Programming/C C++
1. Data형

변수를 선언할때는 선언하고자 하는 변수가 어떤 Data를 얼마나 담을 수 있는지에 대한 형을 지정해 줘야 합니다. 이때 C에서 선언할 수 있는 정수와 실수의 Data형으로는 다음과 같은 종류가 있습니다.

 Data형  크기  실 표현 범위
 char  1  -128 ~ 127
 unsigned char  1  0 ~ 255
 int  4  -214783648 ~ 2147483647
 short int (16 bit)  2  -32768 ~ 32767
 long int (32 bit)  4  -214783648 ~ 2147483647
 unsigned int  4  0 ~ 4294967295
▶<1-1> 정수

 Data형  byte  실 표현 범위
 float  4  10-38 ~ 1038 (유효자리수 7자리)
 double  8  10-308 ~ 10308 (유효자리수 15자리)
 long double  -  10-4932 ~ 104932 (유효자리수 19자리)
▶ <1-2>실수

2. unsigned

unsigned는 특정 Data형에서 부호를 나타내는 bit를 수치로 나타내는 bit로 활용하는 것을 말합니다. 예를 들어 Char형 Data는 1byte크기로서 bit로 따지면 8bit가 됩니다.

00000000

그런데 맨앞의 1bit는 부호를 나타내는 bit이므로 실제 수치를 표현하는데 쓸 수 있는 bit는 뒤의 7bit뿐입니다. 이 7bit를 모두 1로 하고

01111111

10진수로 변환하면

127

이 됩니다. 결국 양수든 음수든 최대 127를 이상은 표현하지 못하는 것입니다.

여기서 맨앞의 1bit는 부호를 나타낸다고 하였는데 0일때는 양수, 1일때는 음수가 되므로 모두 1이 되었다고 가정한다면

11111111

-127 이 됩니다. 여기에서 상위 1bit를 부호가 아닌 unsigned를 통하여 수치로 환산하게 되면 255가 되므로 활용할 수 있는 Data형이 그 만큼 커지게 되는 것입니다.

참고:
부호를 나타내지 않을때는 unsigned를 쓴다고 하였는데 반대로 부호를 나타내고자 한다면 signed라고 써야합니다.(다만 생략이 가능한데 이 경우 기본값으로 signed가 사용됩니다.)

또한 unsigned는 Char형 뿐만 아니라 Int나 long형에도 동일하게 적용될 수 있습니다.

참고:
int는 long int와 같으므로 어떤걸 써도 차이는 없습니다. 다만 long int 라고 하기보다 줄여서 int로 하는 경우가 더 많습니다.

3. 수치자체에 Data형 지정하기

정수뒤에 u(U)를 붙이면 unsigned형을 l(L)을 붙이면 long형을 ul(UL)을 붙이면 unsigned long형 정수를 의미하게 됩니다.

12345u;
12345ul;

참고 :
위에서 처럼 u나 l르 반드시 붙여야만 되는 것은 아닙니다.(Compiler가 알아서 처리합니다.) 위 방식은 Program 작성시에 개발자가 눈으로 보기에 어떠한 성격의 Data형인지를 명확히 구분하기 위한 용도로 쓰입니다.

4. 단일 변수의 선언

보통 변수를 선언하는 방법은  'Data형 변수명'형식으로 하게 됩니다.

int a;

이때 같은 Data형일 경우 연속해서 선언할 수도 있습니다.

int a, b;

변수는 선언함과 동시에 초기화 하는 것도 가능합니다.

int a = 10;

정수가 아닌 문자는 문자상수 또는 수치상수를 이용하는 두가지 방법이 있습니다.

#include <stdio.h>

main()
{
  char c;

  c = 65; /* 수치 상수 */
 
  printf("%c\n", c);
 
  c = 'A'; /* 문자 상수 */
 
  printf("%c\n", c);
}



위와 같이 값을 대입하면 문자 'A'를 대입한 것과 같게 됩니다. 수치상수의 경우에는 ASCII값과 대응되어 값에 해당하는 문자가 표시되는 것입니다.

C에서 변수가 선언되면 특정 Memroy공간을 할당하게 되는데 이때 해당 변수에 대해서 초기화를 행하지 않으면 변수는 변수에 확보된 Memory의 Data값을 그대로 가지게 됩니다.

#include <stdio.h>

main()
{
  int i;
 
  printf("%d\n", i);
}


i변수를 선언한뒤 초기화 하지 않은채 i값을 출력하도록 하고 있습니다.


이때 출력되는 값은 i의 실제값이라기 보다는 변수 i가 위치하고 있는 Memroy의 값을 그대로 출력한 것입니다.(단, Static이나 전역변수는 0으로 자동 초기화 되며 배열 변수또한 초기화 하지 않으면 기본값은 0이 됩니다.)

#include <stdio.h>

int j;

main()
{
  static int i;
 
  printf("%d\n", i);
  printf("%d\n", j);
}


Static과 전역변수 확인


#include <stdio.h>

main()
{
  int i[2] = {1};
 
  printf("%d\n", i[0]);
  printf("%d\n", i[1]);
}


배열변수 i의 0번째 요소는 1로 초기화 하지만 1번째 요소는 초기화 하지 않습니다.


5. 배열 변수의 선언

배열은 []를 통해 나타냅니다. 이때 [와 ]사이에 배열의 크기를 지정하게 되는데 이때 배열의 순서는 0부터 시작하게 됩니다.

#include <stdio.h>

main()
{
  int i[2];
 
  i[0] = 123;
  i[1] = 456;
 
  printf("%d\n", i[0]);
  printf("%d\n", i[1]);
}


배열은 [2]라고 지정하여 총 2개 크기의 배열을 선언하였습니다. 두개의 배열이므로 배열의 순서는 0부터 1까지가 됩니다.(2까지가 아님을 주의하십시오. 0부터 2까지가 되려면 배열의 크기는 3이되야 합니다.)

배열의 선언 후 i[0] = 123; 등을 통해 각 요소에 값을 초기화 하고 printf()함수를 통해 배열의 값을 출력하도록 하고 있습니다.


위에서 배열은 i[0] = 123; 으로 i배열 [0]에 123이라는 정수값을 지정하였습니다. 이렇게 일일이 요소를 지정하여 값을 대입하는 대신 배열을 초기화 할 수 있는 별도의 방법을 이용하여 초기화 할 수도 있습니다.

int i[2] = {123, 456}; / * {} 괄호를 사용하여 배열을 초기화 합니다. */

즉 다음과 같이 하여도 결과는 같습니다.

#include <stdio.h>

main()
{
  int i[2] = {123, 456};

  printf("%d\n", i[0]);
  printf("%d\n", i[1]);
}


배열의 크기는 []괄호안에 나타내는데 만일 크기를 지정하기 힘든 경우라면 생략할 수도 있습니다.

int i[] = {123, 456};

이렇게 하게 되면 초기화 하는 값의 크기에 따라 자동으로 배열크기 2가 지정됩니다.

단, 이 생략의 경우 다차원 배열을 선언한 상태라면 가장 처음의 배열크기만 생략할 수 있습니다. 예를 들어

int i[][3] = {
    {1, 2, 3},
    {4, 5, 6}
  };

위와 같은 형태의 생략은 가능하지만

int i[2][] = {
    {1, 2, 3},
    {4, 5, 6}
  };

이렇게 생략하는건 불가능합니다.

지금까지 배열 선언시 1차원으로만 선언하였는데 배열은 필요하다면 다차원으로도 선언할 수도 있습니다.

int i[5][5];

[5][5]를 통하여 int형 변수 i배열을 2차원으로 선언하였습니다.

int i[5][5][5];

[5][5][5]를 통하여 int형 변수 i배열을 3차원으로 선언하였습니다.

이렇게 배열을 다차원으로 선언하면 그 만큼의 배열을 더 확보하게 됩니다. 예를 들어 int i[5][5];라고 했을때

i[0][0] 부터 i[0][4]까지 5개, i[1][0] 부터 i[1][4]까지 5개, i[2][0] 부터 i[2][4]까지 5개, i[31][0] 부터 i[3][4]까지 5개, i[4][0] 부터 i[4][4]까지 5개씩 총 25개의 배열를 확보하게 됩니다.

#include <stdio.h>

main()
{
  int i[5][5];
  i[3][2] = 100;
  i[4][1] = 200;

  printf("%d\n%d\n", i[3][2], i[4][1]);
}



다차원 배열의 초기화 방식도 1차원 배열의 초기화 방식과 크게 다르지 않습니다.

int i[2][3] = {1, 2, 3, 4, 5, 6};

다차원 배열을 초기화 하면 첫번째 첨자에 해당하는 배열부터 먼저 초기화 됩니다.(예를 들면 다음 순서처럼 [0][0]..[0][1]..[0][2]...[1][0]...[1][1]...)

다차원 배열을 초기화 할때는 아래경우 처럼 괄호({})를 중복하면

int i[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
  };

배열초기화에 대한 구조를 좀더 알아보기 쉽도록 할 수 있을 것입니다.

주의:
만일 배열을 통한 Program개발시 배열의 범위를 넘어서는 경우가 있어도 Compiler는 Error를 발생하지 않습니다.

예를 들어

#include <stdio.h>

main()
{
  int i[2];
  i[5] = 100;

  printf("%d\n", i[5]);
}


이와 같은 Program의 경우 i배열크기로 2를 지정해놓고 100이라는 값을 i의 5번째배열에 저장하고 있습니다. 이 상태로 Program을 Compile하고 실행하면


잘 실행됨을 확인할 수 있습니다. 이런경우가 생기는 이유는 i[5]= 100;이라고 했을때 C는 배열의 크기를 고려하지 않은채 i배열의 5번째에 해당하는 Mmemory주소에 100이라는 값을 그대로 집어넣기 때문입니다.

하지만 이는 전혀 예상치 못한 Memory위치에 값을 써넣기 때문에 중대한 오류를 일으킬 수 있는 소지가 다분합니다. 따라서 반드시 배열을 사용할때는 그 크기를 잘 감안하도록 주의해야 합니다.

6. 배열을 이용한 문자열 다루기

문자열은 Char형 배열을 통해 다루게 됩니다. C에서는 문자열을 다루는 Data형은 존재하지 않기 때문에 Char형 Data를 배열화 하여 여러 문자를 결합함으로써 문자열을 표현합니다.

#include <stdio.h>

main()
{
  char s[6];
 
  s[0] = 'h';
  s[1] = 'e';
  s[2] = 'l';
  s[3] = 'l';
  s[4] = 'o';
  s[5] = 0;
 
  printf("%s\n", s);
}



여기서 맨 마지막 배열에 0을 추가한 이유는 C에서 '문자열의 끝은 0으로 표시한다.'라는 규칙이 존재하기 때문입니다. 문자열을 다룰때는 종종 문자열의 끝을 판단할 필요가 있는데 이런 경우 위와 같이 0으로 해당 문자열의 종료를 판단하곤 합니다.

따라서 실제 'hello'라는 문자열을 나타내는 경우 문자수는 5개이지만 문자열 끝을 나타내는 0이 필요하므로 실제 배열을 6개로 해야 합니다.

또한 문자열을 나타내는 문자배열도 일반 배열과 다를바 없으므로 다음과 같이 배열초기화 방법을 그대로 사용할 수 있습니다.

char s[6] = {'h', 'e', 'l', 'l', 'o', \0};

마지막 \0은 문자로서의 0이 아닌 문자열의 종료를 나타내기 위한 숫자 0임을 나타내기 위해서 입니다.

Char형 배열도 int형 배열처럼 다차원일 경우 {}를 통해 같은 방식으로 초기화 할 수 있습니다.

#include <stdio.h>

main()
{
  char s[2][6] = {
    {'h', 'e', 'l', 'l', 'o', '\0'},
    {'k', 'o', 'r', 'e', 'a', '\0'}
  };
 
  printf("%s\n", s[1]);
}



Char형으로 문자를 나타내기 위해서는 수치정수를 사용할 수 있으므로 다음과 같이 하여도 같은 결과를 나타내게 됩니다.

char s[5] = {104, 101, 108, 108, 111, 0};

배열 변수에 문자열을 대입하는 경우라면 문자열자체를 초기화 할 수 있는 방법이 별도로 존재합니다.

char s[6] = "hello";

위와 같이 하면 배열 s에 'hello'라는 문자열과 함께 문자열 종료를 의미하는 0도 같이 초기화 됩니다. 물론 이때에도 배열의 크기는 생략이 가능합니다.

char s[] = "hello";

문자배열도 다른 정수형태의 배열과 Data형만 틀릴뿐 별 차이가 없습니다. 따라서 초기화 할때도 배열의 크기에 맞지 않으면 나머지 부분은 0으로 자동초기화 됩니다.

#include <stdio.h>
main()
{
  char s[6] = "hell";
 
  printf("%s\n", s);
}


앞서 문자열의 끝은 0으로 판단한다고 하였습니다. 결국 s[4]에 0이 초기화 되어서 hell 문자열이 정상적으로 출력되고 있는 것입니다.

다차원 배열의 문자열 초기화 방식도 요소하나하나를 초기화 하는 것과 별반 차이가 없습니다.(단, 1차원 배열에서 문자열 초기화의 경우 {}를 사용하지 않은 것처럼 다차원도 {}를 사용하지 않고 ,만 사용됩니다.)

#include <stdio.h>
main()
{
  char s[2][6] = {
    "hello",
    "korea"
  };
 
  printf("%s\n", s[0]);
}


7. 변수의 이름 지정

변수의 이름은 비교적 자유롭게 작성할 수 있으나 꼭 지켜야할 몇몇 규칙이 존재합니다.

(1) 변수명은 영문대문자, 소문자, 밑줄, 숫자만 사용가능합니다.

(2) 변수명은 반드시 영문자나 밑줄로만 시작해야 합니다. 이때 숫자를 포함하는 변수명은 사용가능하지만 숫자로 변수명을 시작해서는 안됩니다.(숫자로 시작하는 경우 수치를 나타내는 정수로 인식될 수 있기 때문입니다.)

(3) 이름의 길이에는 제한이 없지만 처음부터 31문자 까지만 인식합니다. 즉, 31자를 넘어도 되지만 인식되는 이름은 31자 까지입니다.

(4) 변수명에서 대문자와 소문자는 구분됩니다.

(5) 예약어라는 것이 있습니다. C에서 쓰는 정해진 구문인데 이 예약어는 변수명으로 사용이 불가능 합니다.

auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while

다만 예약어를 포함하고 있는 전혀 새로운 문장의 경우에는 사용이 가능합니다. 예를 들어

autobicycle, doit

등 예약어를 포함한 전혀 다른 문장은 예약어와 충돌하지 않습니다.

8. Data형의 재정의

integer형의 변수선언은 int나 long int로 선언합니다.

int a;
long int a;

하지만 선언하고자 하는 Data형이 너무 길어서 쓰기 불편하거나 나만이 쓰는 다른 이름으로 대체하여 사용하고자 할때는 typedef를 통해 Data형의 이름을 다음과 같이 재정의 할 수 있습니다.

typedef long int l_int;

위와 같이 하면 l_int라고 했을때 long int를 사용한것과 같게 됩니다.

#include <stdio.h>

main()
{
  typedef long int l_int;
 
  l_int i;
 
  i = 100;
 
  printf("%d\n", i);
}



참고:
typedef는 얼핏 치환한다는 개념에서 #define와 비슷합니다만 #define는 전처리과정에서 해당 문자열을 치환할 뿐입니다. 반면 typedef는 Compiler에 의해 치환된다는 차이가 있습니다.

또한 typedef는 변수이외에 구조체등에도 사용할 수 있습니다. 자세한 설명은 다음 글를 참조하기 바랍니다.

[Develop/C, C++] - [C, C++] 구조체

9. const 상수


변수는 값이 변할수 있기 때문에 변수라고 합니다. 하지만 변수선언도 const를 동반하면 변수에 처음 값을 지정한 이후부터는 해당 변수값을 바꿀 수 없도록 할 수 있습니다.

#include <stdio.h>
main()
{
  const int i = 100;
 
  i = 200;
 
  printf("%d\n", i);
}


const를 사용하면 해당 변수의 값은 바꿀 수 없게 되며 만일 값을 바꾸려고 하는 시도가 있을 경우 Compil과정에서 오류를 발생하게 됩니다.


10. size_t

size_t는 가상Data형이라고 부르며 다른Data형과 구분되는 별도의 Data형이 아닌 typedef를 통해 unsigned int형으로 정의되어 있는 Data형입니다.

개인적인 견해로는 크게 쓸일이 없는 형입니다. size_t의 원래 목적은 C가 작동되는 여러 System안에서 같은 int형이라도 Data의 크기에 따라 Program이 틀어지는 문제를 해결하고자 호환성을 유지할 수 있도록 만들어진 것입니다.

하지만 현재에 와서는 큰 의미가 없습니다. 대부분의 Computer가 32bit이고(64bit로 발전해 가고 있는 추세) 또한 범위가 크다/작다를 따질만큼 빈약환 환경이 아니므로 빈번히 사용할 일은 없는듯 합니다.

#include <stdio.h>

main()
{
  printf("%d\n", sizeof(size_t));
  printf("%d\n", sizeof(int));



0 0
1
블로그 이미지

클리엘