오버로딩 Vs 오버라이딩 ( Overloading Vs Overriding )




1.오버로딩 


함수의 이름은 같지만, '반환형 / 매개변수 - (매개변수의 수, 순서, 타입)'가 다른 것.


컴파일러는 함수의 구분할 때 함수의 서명(=signature)를 통해 관리를 한다. 

기본적으로 함수의 함수의 이름이 다르거나,

함수의 이름은 같지만, 매개변수의 리스트가 다르다면 signature자체를 따로 관리를 한다


Overloaded functions must have different signatures. 


# 시그니처가 포함하는 것

 1) 함수의 이름

 2) 파라메터의 순서와 개수, 타입



# 시그니처가 포함하는 것

 1) 리턴형 타입

 2) const 여부

 3) call by reference &  - 인자가 &로 전달되어도 같은 함수로 생각함




2. 오버라이딩


완전히 동일하다. 즉, 함수의 이름도, 함수의 반환형도, 매개변수도 동일하다.


다만 내용이 재정의(re-definition)가 되어있다.

 



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

증감연산자 오버로딩  (0) 2018.02.18
'<< 오퍼레이터, >> 오퍼레이터' 오버로딩  (0) 2018.02.18
파일스트림 입출력  (0) 2018.02.17
배열  (0) 2018.02.17
디폴트 인수  (0) 2018.02.16

증감연산자 오버로딩


증감 연산자 ++, -- 의 경우, 특수한 케이스이다.


1) prefix

2) postfix 


두가지로 나누어 처리하는데, 다음의 msdn 문서를 참고하면 좋다. main 함수 부분은 내가 추가했다.


// increment_and_decrement1.cpp class Point { public: // Declare prefix and postfix increment operators. Point& operator++(); // Prefix increment operator. Point operator++(int); // Postfix increment operator. // Declare prefix and postfix decrement operators. Point& operator--(); // Prefix decrement operator. Point operator--(int); // Postfix decrement operator. // Define default constructor. Point() { _x = _y = 0; } // Define accessor functions. int x() { return _x; } int y() { return _y; } private: int _x, _y; }; // Define prefix increment operator. Point& Point::operator++() { _x++; _y++; return *this; } // Define postfix increment operator. Point Point::operator++(int) { Point temp = *this; ++*this; return temp; } // Define prefix decrement operator. Point& Point::operator--() { _x--; _y--; return *this; } // Define postfix decrement operator. Point Point::operator--(int) { Point temp = *this; --*this; return temp; } int main() {      

Point p1, p2; p1++;

++p2;

}



문득, 나는 어떻게 컴파일러가 prefix와 postfix 의 호출을 구분하는지 너무 궁금했다... 특수한 케이스라고만 적혀있어서 답답했는데

다음을 읽으면서 의문이 확풀렸다.



I don't think we're understanding your question, because the answer seems plainly obvious.

In the case of primitives it is clear the ++ before the primitive is treated as prefix and after the primitive is treated as postfix

It is exactly the same for objects.

But this is a user defined object.

That doesn't matter. If the ++ is before the object name, it uses prefix. If it's after, it uses postfix.

How does compiler brand one as "prefix" and other as "postfix"?


The C++ standard says that if it has a dummy int parameter, it's a postfix operator. If no dummy int parameter, then it's the prefix operator.


 결국, 컴파일러는 객체 전과 후로 prefix / postfix를 구분하고, 더미의 유무로 함수를 찾아갈 뿐 호출상으로 int 값을 나도 모르게 넘긴다던가.. 그런 일은 없었다...

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

오버로딩 Vs 오버라이딩  (0) 2018.02.19
'<< 오퍼레이터, >> 오퍼레이터' 오버로딩  (0) 2018.02.18
파일스트림 입출력  (0) 2018.02.17
배열  (0) 2018.02.17
디폴트 인수  (0) 2018.02.16


'<< 오퍼레이터, >> 오퍼레이터' 오버로딩


<< 연산자의 이름이 double shift라고 막연히 생각했는데, insertion operator 라는 충격적인 사실을 알게 되었다. 마찬가지로 >> 도 extraction operator라는 이름을 가지고 있었다. 


# C++의 표준 입출력 스트림 객체와 함께 사용되는 연산자  >> , <<

1) >> operator :  extraction operator

2) << operator :  insertion operator 


이를 위해, msdn 의 차료를 참고해서 공부를 해보자.



1. >> operator  오버로딩(Input stream - extraction operator)


Input streams use the extraction (>>) operator for the standard types. You can write similar extraction operators for your own types; your success depends on using white space precisely.

Here is an example of an extraction operator for the Date class presented earlier:

istream& operator>> ( istream& is, Date& dt )  
{  
   is >> dt.mo >> dt.da >> dt.yr;  
   return is;  
}  


이 경우에는 return by address를 통해서 istream 객체를 반환하여 chaining을 지원하여 1) is >> dt.mo, 2) is > >dt.da , 3) is >> dt.yr 순으로 실행된다.




2. << operator  오버로딩


Output streams use the insertion (<<) operator for standard types. You can also overload the << operator for your own classes.

The write function example showed the use of a Date structure. A date is an ideal candidate for a C++ class in which the data members (month, day, and year) are hidden from view. An output stream is the logical destination for displaying such a structure. This code displays a date using the cout object:

Date dt( 1, 2, 92 );  
cout << dt;  

To get cout to accept a Date object after the insertion operator, overload the insertion operator to recognize an ostream object on the left and a Date on the right. The overloaded << operator function must then be declared as a friend of class Date so it can access the private data within a Date object.

// overload_date.cpp // compile with: /EHsc #include <iostream> using namespace std; class Date { int mo, da, yr; public: Date(int m, int d, int y) { mo = m; da = d; yr = y; } friend ostream& operator<<(ostream& os, const Date& dt); // friend 키워드를 통해 directly access data 가능 }; ostream& operator<<(ostream& os, const Date& dt) // 오퍼레이터 오버로딩 { os << dt.mo << '/' << dt.da << '/' << dt.yr; // 예를 들면 5/6/92 와 같이 출력 return os; } int main() { Date dt(5, 6, 92); cout << dt; }

5/6/92

The overloaded operator returns a reference to the original ostream object, which means you can combine insertions:

cout << "The date is" << dt << flush;  


https://msdn.microsoft.com/ko-kr/library/1z2f6c2k.aspx

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

오버로딩 Vs 오버라이딩  (0) 2018.02.19
증감연산자 오버로딩  (0) 2018.02.18
파일스트림 입출력  (0) 2018.02.17
배열  (0) 2018.02.17
디폴트 인수  (0) 2018.02.16



파일스트림을 통한 입출력



C 언어에서 입출력을 위해서 #include <stdio.h>를 통해 printf 함수( )를 활용해서 출력을 했다. C++은 C언어와 마찬가지로 입출력에 관한 기능을 언어에서 기본적으로 제공하지 않는다. 컴파일러 개발자에게 컴파일러를 만들 때 입출력 기능을 해당 하드웨어에 가장 적합한 형태로 만들도록 자유도를 주었기 때문이다. 하지만 내가 사용하는 Visual C/C++와 같이, 대부분의 C++ 컴파일러는 iostream과 fstream 헤더 파일에 정의되어 있는 클래스 라이브러리를 제공하기 때문에 우리는 iostream 및 fstream을 공부하여 파일스트림을 통해 입출력을 할 수 있다.


iostream과 fstream 클래스 라이브러리의 가장 핵심은 바로 스트림(stream)이다. C++ 프로그램은 파일이나 콘솔의 입출력을 직접 다루지 않고, 운영체제에 의해 생성된 스트림(stream)이라는 흐름을 통해 입출력 기기에 데이터를 전달해 입력을 받거나 출력을 한다.


결국, 스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 흐름을 나타낸 것이다.



1. 버퍼의 개념, 스트림의 핵심


스트림은 내부에 버퍼(buffer)라는 임시 메모리 공간을 가진다. 입력 시 Enter 키(\n)를 누르면 입력 버퍼를 비워 바로 프로그램에 전달을 한다. 즉, 버퍼에서는 입력 중 자동으로 개행 문자를 전달받거나 버퍼가 가득 차면 버퍼를 비우게 된다.


다음은 표준입력이 처리되는 과정을 도식화하였다.

 



 다시 한번 정리하자면 표준 입력( ex. 키보드)은 입력되는 문자를 입력 버퍼에 저장했다가 엔터 키(\n)가 입력되거나 버퍼가 가득 차면 지정된 변수(할당한 메모리 - 배열 등)로 버퍼의 내용을 비우면서 메모리의 내용을 옮긴다.  마찬가지로 표준 출력(화면 출력, 파일 저장 등)은 출력 버퍼에 문자가 저장되었다가 특정 조건에 의해 버퍼가 비워지면 출력되는 것이다. 참고적으로 입/출력 버퍼가 비워지는 시점은 운영체제나 설정에 따라 다르다.


즉, 버퍼는 키가 눌리는 이벤트가 발생할 때 마다 즉시 프로그램에게 이를 전달하는 것이 아니라, 모아서 한번에 전달하는 것임을 알 수 있다. 이를 버퍼링이라고 부른다.

 

1. 문자를 하나씩 전달하는 것이 아닌 묶어서 한 번에 전달하므로, CPU 사용횟수와 메모리 접근 횟수도 줄어든다.

2. 사용자가 문자를 잘못 입력했을 경우 수정을 할 수가 있다. ex) 콘솔에서 입력하다 오타 발생 시 지우고 엔터누를 수 있음

 

하지만 버퍼가 있다고 해서 항상 좋은 것은 아니다. 바로 동작해야 하는 프로그램(Ex 게임, 문서작업 )에서는 키를 누르는 즉시 바로 전달되어야 한다.

예를 들어 글자를 입력하는데 엔터에 입력할 때까지 화면에 글자가 안보인다면 당혹스러울 것이다.

 

입력을 결정할 때는 버퍼를 사용하는 입력과 버퍼를 사용하지 않는 입력 중 자신의 목적에 맞게 버퍼의 사용 여부를 판단해 도입해야한다



2. 입력버퍼를 사용하지 않는 함수 : getch()



2.1) getch


이 함수를 사용하기 위해서는 console input/output 즉, 콘솔 입출력 함수를 제공하는 헤더 파일로서 conio.h 헤더 파일을 include 해야한다. 다만 이 헤더파일은 C 언어 표준이 아니고, MS-DOS 때 부터 사용되었기 때문에 POSIX 함수도 아니어서 Visual Studio에서도 비표준함수라며 에러를 발생시킨다. 이를 없애주기 위해서는 _getch()와 같은 형태로 사용하면 된다.


2.2) 문법

int getch(void);

읽은 문자를 반환

# 사용 예제

10개를 입력받을 때까지, 계속 getch()를 반복문 실행을 하였다. 10개의 글자를 입력받은 후, 종료되는 프로그램을 작성하라.


int main(){

printf("Without buffer!\n");

char ch;

int cnt=0;

while (cnt < 10){

ch = _getch();

printf("%c",ch);

cnt++;

}

}


3. 파일스트림 함수


# 수정중

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

오버로딩 Vs 오버라이딩  (0) 2018.02.19
증감연산자 오버로딩  (0) 2018.02.18
'<< 오퍼레이터, >> 오퍼레이터' 오버로딩  (0) 2018.02.18
배열  (0) 2018.02.17
디폴트 인수  (0) 2018.02.16

  

  배열



1. 배열 


  배열은 같은 종류의 데이터를 많이 다룰 경우 유용하게 사용할 수 있는 가장 기본적인 자료 구조입니다.


  배열(array)은 같은 타입의 변수들로 이루어진 유한 집합으로 정의할 수 있다.

  다른 타입의 변수들로 구성할 때는 구조체(struct)나 공용체(union), 클래스(class)를 사용하면 된다.

 

배열을 사용하기 위해서는 배열 요소(element)의 타입과 유한한 배열의 크기(size)를 지정해줘야한다. 

타입 배열이름[사이즈] ;

ex) int Arr[10]; 


배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 합니다. 

주의할 점은 인덱스는 언제나 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있다는 점이다. 만약 배열의 사이즈가 10이라면 0부터 9까지 총 9개의 인덱스를 가지고 있다. 


또한, 배열이름은 배열의 시작주소값을 가지고 있다. &배열이름= 배열의 시작주소 이며 배열이름 = 배열의 시작주소 는 사실을 아야한다. 즉, 배열이름과 배열이름이 존재하는 위치는 다 해당 배열의 시작주소(인덱스 0이 위치한 메모리주소)이다.

이를 통해 우리는 배열의 이름은 해당 배열이 시장되는 곳의 별칭이라 판단할 수 있다. 참고적으로 배열이름이 시작주소(0번 인덱스)를 가리키기 때문에 (*배열이름) = 배열이름[0] 과 같다.



1) 사용법

   1.1 ) 배열 선언

타입 배열이름[사이즈];

 1.2 ) 선언과 동시에 초기화

타입 배열이름[배열길이] = {배열요소1, 배열요소2, ...};

   1.3 ) 컴파일러를 통해 자동으로 길이 설정

       타입 배열이름[] = {배열요소1, 배열요소2, ... 배열요소n-1 }; // 이때 컴파일러가 사이즈를 n이라고 판단함 

   1.4) 동적 배열 할당

타입* 배열이름;

배열이름 = (타입 *) malloc(sizeof(타입) * 사이즈));


2) 주의사항

 2.1) 컴파일러는 배열의 끝을 확인하지 않는다.

 2.2) C++11에서는 int arr[10]={}; 이런식으로 괄호만 지정하면 0으로 다 초기화를 한다.

 2.3) 배열을 초기화 해주지 않으면 쓰레기 값을 가지고 있다.

 2.4) 배열을  초기화 할때도 narrow casting 이 발생한다. 강제 형변환으로 인한 값의 손실 발생.

 


2. 다차원 배열


배열은 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 그 이상의 다차원 배열로도 선언할 수 있다.

다차원 배열이란 2차원 이상의 배열을 의미하며, 배열의 요소를 또 다른 배열을 가지는 배열이다.

 

즉, 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이며, 3차원 배열은 배열 요소로 2차원 배열을 가지는 배열이고,

4차원 배열은 배열 요소로 3차원 배열을 가지는 배열을 의미한다


하지만 현실적으로 이해하기가 쉬운 2차원 배열까지가 많이 사용되고, 빠른 속도를 위해서 2차원배열을 1차원으로 구현하기도 한다.


  1)  2차원 배열의 선언 

타입 배열이름[세로길이][가로길이];

= row ,      column
= 행         열
  참고적으로 세로의 길이는 행의 길이고, 가로의 길이가 열이다. 행렬을 배웠다면, 2*3의 경우, 다음과 같이 표기됨을 알 수있다.
     1행 1열, 1행 2열 1행 3열
       2행 1열, 2행 2열 2행 3열」

 1.2 ) 선언과 동시에 초기화

타입 배열이름[배열길이 n][배열길이 m] = { {배열 요소 1, 배열요소2, ... 배열요소 m-1}, {배열요소 m, .. 배열요소 2m-1}, ... ;

   1.3)  동적배열 할당

        int ** arr = (int**) malloc(sizeof(int*) * 배열의 세로길이(row));

  for(int i=0; i<col ; i++){

arr[i] = (int*) malloc(sizeof(int) * 배열의 가로길이 (col)); 

}


  2) 2차원 배열의 구조
   
   다음은 6 by 8 2차원 인트형 배열이다.
   arr 는 int 를 가리키는 이중포인터형 이고
   arr 와 arr[0]은 같은 주소값을 가지고 있다. 하지만 arr[0]은 int 포인터형으로 또 다른 int 배열인 int[8]을 가리키고 있는 것이다.

  정리하자면 arr이는 2차원 배열이며, arr는 arr[0], arr[1], ... , arr[5] 총 6개의 int*형을 가진 배열에 접근가능하다.
  또 이 각각의 arr[0], arr[1] .. 은 크기 8짜리 int 배열을 가지고 있는데 arr[0][1], arr[0][2].. arr[0][7]을 통해 int 값에 접근이 가능 하다.

  


이미지 출처 : http://codeng.tistory.com/8

따라서  arr 를 출력하면 arr[0][0]이 출력되는 것이 아니라 arr[0]이 위치한 주소값이 출력되며 이는 arr[0][0]주소이기도 하다.
즉, arr[0]을 출력해도 arr[0]이 가지고 있는 것은 arr[0][0]의 주소일 뿐 arr[0][0]이 가진 int 값은 출력되지 않는다.



# 디버깅

  arr[2][3]의 경우 arr = arr[0] = &arr[0][0] 인 것을 확인할 수 있다.
 


 

# 확인하기

  컴퓨터의 메모리는 선형구조 형태이다. 





3. 추가 문법



3.1 배열의 일부 요소만을 초기화하는 방식

C++에서는 2차원 배열의 일부 요소만을 초기화할 수도

 

이 방식으로는 다음 예제처럼 2차원 배열의 원하는 배열 요소만을 초기화할 수 있습니다.

이때 초기화하지 않은 배열 요소는 모두 0으로 자동 초기화


int arr_col_len, arr_row_len;

int arr[3][4] = {

    {10, 20},

    {30, 40, 50, 60},

    {0, 0, 70, 80}

};

 


4. 활용


특정 배열을 받고, 배열의 길이를 알아야할 경우,


배열의 길이 = sizeof(배열 이름) / sizeof(배열 이름[0])


를 통해서 길이를 구할 수 있다. sizeof(배열 이름)은 해당 배열이 차지하는 메모리 크기를 반환하고, size(배열이름[0])은 타입의 메모리 크기를 반환하기 때문에 배열의 길이(요소의 개수)를 알 수 있다. 



2차원 배열 역시 마찬가지다.


int arr_col_len, arr_row_len;

int arr[3][4] = {

    {1020},

    {30405060},

    {0, 107080}

};


//// 가로길이 - 열 길이= 한 행의 사이즈 / 한칸의 사이즈

//// 세로길이 - 행 길이 = 전체 / 열 / 한칸의 사이즈  

arr_col_len = sizeof(arr[0]) / sizeof(arr[0][0]);              // 열의 길이를 계산= 4

arr_row_len = (sizeof(arr) / arr_col_len) / sizeof(arr[0][0]); // 행의 길이를 계산= 3



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

오버로딩 Vs 오버라이딩  (0) 2018.02.19
증감연산자 오버로딩  (0) 2018.02.18
'<< 오퍼레이터, >> 오퍼레이터' 오버로딩  (0) 2018.02.18
파일스트림 입출력  (0) 2018.02.17
디폴트 인수  (0) 2018.02.16

  


  디폴트 인수(default argument)


1. 디폴트 인수란


  C++의 컴파일러가 함수가 호출될 때, 인수를 필요로 한다면 우리는 인수와 함께 함수를 호출한다. 즉, 전달된 인자를 가지고 함수를    호출하는 것이다. 만약 인수를 적지 않은 채 함수를 호출하면 컴파일러가 Syntax 에러가 났음을 알려주어 컴파일이 되지 않는다.


하지만 C++은 컴파일 에러를 내지 않으면서, 인수를 적지 않으면서 무사히 실행할 수 있다. 디폴트 인수를 통해 미리 정의된 디폴트 인수를 부를 수 있다. 이 때, 미리 정의된 인수를 디폴트 인수(default argument)라고 부른다.  컴파일러는 파라메터가 없으면 함수가 선언될 때 자동적으로 정의된 인수를 할당한다.



2. 예제


#include <iostream>

using namespace std;


void Check(int a=10); // 디폴트 인수

//void Check(int a); // 일반적인 함수

int main() {

Check();

}


void Check(int a)

{

if (a == 10)

cout << "10이 맞음" << endl;

}


예를 들어, Check란 함수의 프로토 타입은 다음과 같다.


void Check(int a);


이 함수는 int 타입의 파라메터 1개를 인자로 전달한다. 만약, 메인함수에서 Check함수를 호출해 사용하고 싶다면 Check(10); 이런식으로 사용하면 된다. 만약 Check();라고 하면 컴파일이 안되며, 인자를 넣으라고 컴파일러가 친절히 알려준다.


그러나, 디폴트 인수를 통해 함수를 만들 수 있다.

void Check(int a=10); 이런 식으로 선언하는 것이다. 


그러면 메인함수에서도 Check(); 로 호출해도 Check(10); 과 똑같은 결과가 실행된다.


void Check(int a=10); 대신 void Check(int a); 을 쓰면 컴파일러가 too few arguments in function call 란 에러를 발생시킨다.




3. 문법


1) 사용법

반환형 함수명 ( 매개변수타입 매개변수명 );


2) 주의사항 

 2.1) 디폴트 인수는 함수의 원형에만 지정할 수 있습니다.

 2.2) 디폴트 인수는 가장 오른쪽부터 시작하여 순서대로만 지정할 수 있습니다.

 2.3) 가운데 인수들만 별도로 디폴트 인수를 지정할 수는 없습니다.


3) 예시

   3.1) void Check(int x, char ch, int y, int z = 4);       // Good

   3.2) void Check(int x, char ch = 's'int y, int z = 4); // Good

   3.3) void Check(int x = 6, char ch, int y, int z = 4);   // 컴파일 에러

   3.4) void Check(int x = 1, int y = 2, char ch, int z);   // 컴파일 에러



4. 활용


다음과 같이 디폴트 생성자를 만드는 데 활용될 수 있다.

디폴트 인수로 두마리 토끼를 잡는 것이다. 

디폴트 생성자를 명시하지않아도, 문자열을 인수로 가지는 생성자를 통해  디폴트 인자를 적용하여 클래스 객체의 인스턴스를 만들 수 있게 되는 것이다.


class ExpandableArray {

public:

ExpandableArray(char name[]=""); // char name[]="";이 없으면 default constructor가 없다는 에러가 나온다.

~ExpandableArray();

int size() const { return n; };

int capacity() const { return n; };

private:

char name[16]; // name of expandable array

int capa;

int n;

double *dA; // pointer of double array

};


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

오버로딩 Vs 오버라이딩  (0) 2018.02.19
증감연산자 오버로딩  (0) 2018.02.18
'<< 오퍼레이터, >> 오퍼레이터' 오버로딩  (0) 2018.02.18
파일스트림 입출력  (0) 2018.02.17
배열  (0) 2018.02.17

공용체



1. Union(공용체)

Union이란 공용체로 메모리를 공유하는 구조체이다. 

이 때 메모리 할당은 가장 큰 크기를 가진 멤버변수의 타입을 기준으로 할당된다.


예를 들어,


# 익명 공용체


typedef union{ //typedef로 공용체의 별칭(Alias)를 만듬

char a;

int b;

double c;

float d;

} Uni;  // 이 익명 공용체의 별칭은  


int main(){

Uni U1;

U1.a = 'A';

U1.b = 8; 

U1.c = 3.0;


printf("%d\n", sizeof(U1); // dobule이 제일 크므로, 8이 출력

}


Uni 라는 별칭(Alias)을 가진 공용체는 char : 1 byte, int : 4byte, double : 8 byte, float : 4 byte 중 제일 큰 자료형인 double을 기준으로 멤버 전체가 메모리를 공유하는 형태이다. 메모리를 공유한다는 것은 멤버 모두 같은 메모리의 시작주소를 가지고 있다는 뜻으로 a, b c, d 모두 같은 시작 주소를 같기 때문에 멤버변수 하나가 사용중일 때 이를 사용하면 오버라이팅이 된다.


즉, U1.a = 'A'를 하였더라도. U1.b=8을 한 후에는 'A'가 저장된 자리에 8이라는 정보가 덮어 씌워져 printf("%c", U1.a)를 해도 'A'라는 글자가 나오지 않게 된다.

 

2. 사용법


1) 공용체를 정의

# 문법

union 공용체이름 {
    자료형 멤버이름;
};

int main(){
  union 공용체이름 변수이름;
}

# 예

union Box {// 공용체 정의
    short choco;
    float snack;
    char letter[16];
};  

int main(){
union Box box1;
strcpy(box1.letter,"My Love"); // 문자열복사
}

참고로 공용체 정의가 끝나기 전 변수명을 추가함으로써 정의와 동시에 변수를 선언가능 하다
# 문법

union 공용체이름 {
    자료형 멤버이름;
} 변수;
예)

# 예

union Box {// 공용체 정의
   short choco;
    float snack;
    char letter[16];
} box1; // 공용체를 정의하는 동시에 변수 box1 선언


2) typedef를 사용하기

  공용체도 구조체와 마찬가지로 매번 union이라는 키워드를 치기번거롭기 때문에 typedef로 별칭을 지정할 수 있다.

# 문법

typedef union 공용체이름 {
    자료형 멤버이름;
} 공용체별칭;

int main(){

공용체별칭 변수이름;
}

# 예

typedef union _BigBox {    // 공용체 이름은 _BigBox 관례적으로 공용체의 이름은 _를 붙여서 만들지만 상관은 없다.
    short choco;
    float snack;
    char letter[16];
} BBox;                  // typedef를 사용하여 공용체 별칭을 BBox로 정의

int main(){
BBox box1; // _BigBox 공용체 타입의 box1 선언
}


3) typedef를 활용한 익명공용체

위와 같이 _BigBox대신 BBox를 통해 공용체타입을 선언할 수 있게 되었다.
굳이 _BigBox라는 공용체이름이 필요하지 않을 시에 익명공용체를 사용할 수 있다.
익명 공용체란 다음과 같이 공용체의 이름을 명시하지 않은 공용체를 뜻한다.
대신,typedef를 통해 별칭(Alias)을 꼭 사용해주어야 한다. 

# 문법

typedef union { // union 다음에 공용체이름을 생략.
    자료형 멤버이름;
} 공용체별칭;


# 예

typedef union {    // 익명 공용체 정의
    short choco;
    float snack;
    char letter[16];
} BBox;             // typedef를 사용하여 공용체 별칭을 BBox로 정의


3.  활용 ( # 업데이트 예정)


1) Byte Ordering

 - Little Endian & Big Endian


 2) Larger Integer



4. 참고


 1) C언어 코딩도장 - 공용체 문법 더블 체크

 https://dojang.io/mod/page/view.php?id=455

 

 2) MSDN - Larger Integer를 공부하던 중

 https://msdn.microsoft.com/en-us/library/windows/desktop/aa383713(v=vs.85).aspx




부트스트랩 시작하기



부트스트랩은 사람들이 많이 쓰는 기능들을 미리 뽑아놓은 프레임워크의 한 종류로 모든 사용법은 부트스트랩 페이지에 다 들어있다.

가장 기본적은 부트스트랩의 템플릿에 대한 내용은


부트스트랩 홈페이지에 들어가서 


1) Get Started(시작하기)


2) 우측의 기본 템플릿을 클릭하면 나온다.








또한, 미리 재정의된 CSS가 어떻게 생긴지 알고 싶다면 CSS 탭을 살펴보면 된다.


예를 들어 h1, h2 와 같은 header의 스타일이 궁금하다면


1) Get started(시작하기) 옆에 있는 CSS 탭을 클릭


2) 타이포그래피를 클릭하여 어떤 스타일으로 출력되는지 눈으로 확인할 수 있다.


h1 의 경우, default로 semi-bold로 36px로 출력된다고 한다.

 

 



' > 부트스트랩' 카테고리의 다른 글

[부트스트랩 웹페이지 제작] 2.부트스트랩 예제 실행  (0) 2018.02.11
부트스트랩이란  (0) 2018.02.11


부트스트랩으로 웹페이지 만들기 1




1. 에디터의 선정

 웹 페이지를 만들기 위한 Sublime Text 3, visual studio code, notepad++ 등과 같은 에디터를 연다.

프로젝트를 하면서 느낀건데, 라이센스 이슈 때문에 기업의 프로젝트에서는 notepad++ 가 많이 사용되는 경향이 있다.

(특히나 유럽 국가들이 notepad++가 가벼워서 많이 쓰는 것 같다..) 

하지만 notepad++ 확장 기능이 다른 에디터에 비해 아쉽다는 평이 많았고, 나는 UI가 마음에 들지 않아 서브라임텍스트3을 애용해왔다.


Microsoft Student Partners로 활동하면서 visual studio code를 쓰다보니.. 

이번 웹 프로젝트는 Visual studio code, VS code를 활용해보기로 한다.


1.1 VS code 실행

 1) 파일(F) -> 폴더열기

 2) 탐색기에서 C:\bootstrap-3.3.2-dist 클릭 후 열기







2. Bootstrap HTML Template



기본적인 HTML 구조에서 부트스트랩을 활용하기 위해서는 다음과 같은 구조가 필요하다. 


<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 위 3개의 메타 태그는 *반드시* head 태그의 처음에 와야합니다; 어떤 다른 콘텐츠들은 반드시 이 태그들 *다음에* 와야 합니다 -->
    <title>부트스트랩 101 템플릿</title>

    <!-- 부트스트랩 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
    <!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <h1>Hello, world!</h1>

    <!-- jQuery (부트스트랩의 자바스크립트 플러그인을 위해 필요합니다) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <!-- 모든 컴파일된 플러그인을 포함합니다 (아래), 원하지 않는다면 필요한 각각의 파일을 포함하세요 -->
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>



 # HTML 예제 파일만들기


 새 파일을 클릭하여 test.html이라고 저장한 후 위의 코드를 복사한다.

이를 open in browser라는 확장프로그램으로 연결하면 좋다.


1) open in browser 설치




2) 직접 open in browser를 실행하거나, Alt + B 단축키를 누르면 default browser로 연동됨




# 실행결과




cf. 브라우저를 여는 방법은 다양하다. 그렇지만 확장 플러그인을 쓰는 게 간편하다. 

다음과 같이 task runner 에서 경로를 수정해서 브라우저로 여는 방법도 있다. http://ithub.tistory.com/44





3. 템플릿 설명



HTML 기반의 웹 페이지는 HTML의 내용을 CSS 틀에 맞춰서 출력하는 방식으로 만들어진다. 


3.1 뷰포트(View Port)

 장치에 디스플레이가 표시되는 영역을 말한다.


3.2  Meta 태그

 Meta 태그는 문서를 출력하면 보이는 태그가 아니라, 문서 자체의 정보에 대한 태그이다.

예를 들어, 부트스트랩 템플릿에 있던 하단의 <meta> 태그의 경우, 웹 브라우저에게 화면의 크기와 초기 비율에 대한 정보를 전달한다.


<meta name="viewport" content="width=device-width, initial-scale=1.0">

여기서는 디바이스의 가로 너비와 화면비율을 100%로 하라는 정보를 전달하였다.


<meta> 태그에 대해 추가적으로 설명하자면, 각 디바이스마다 서포트할 수 있는 뷰포트의 속성이 다르다는 것을 알아야한다.




설명
CTRL + \화면분할
CTRL + `내부에서 쉘열기
CTRL + <->축소
CTRL + <+>확대
CTRL + ALT + DOWN멀티선택
CTRL + B사이드바 보기
CTRL + J하단패널 보기
CTRL + P파일팔레트 보기
CTRL + SHIFT + C외부에서 쉘열기
CTRL + SHIFT + E파일탐색기 보기
CTRL + SHIFT + F5Restart
CTRL + SHIFT + GGIT 보기
CTRL + SHIFT + M문제 보기
CTRL + SHIFT + O심볼팔레트 보기
CTRL + SHIFT + P명령팔레트 보기
CTRL + SHIFT + P, beautify파일 인덴트 정리
CTRL + SHIFT + U출력 보기
CTRL + SHIFT + V미리 보기
CTRL + SHIFT + XEXTENSION 보기
CTRL + SHIFT + Y디버그콘솔 보기
CTRL + SPACE자동완성
CTRL + W창닫기
F10Step Over
F11전체화면
F11Step Into, Step Out Shift
F12정의로 이동
F2이름변경
F5Continue / Pause
F5Stop Shift
F8markdown 상세오류 보기
SHIFT + ALT + DRAG박스선택
ab


+ Recent posts