디폴트 값



함수를 호출 할 때 필요한 인자 값을 넣어주지 않으면 어떻게 될까?

컴파일 할 때 인자 값이 없다며 에러를 출력한다.

하지만 함수를 정의 할 때 디폴트 값을 설정 후 위와같이 컴파일 하면 에러가 발생되지 않는다.

이렇게 인자 값을 넣지 않고 함수를 호출 할 수 있는 디폴트 값에 대해 알아보자.



디폴트 값 설정 하기


사용방법은 다음과 같다.

 int sum( int a = 1, int b = 2 )

 {

     return a + b ;

 }


함수 정의 할 때 매개 변수 a, b에 각각 1,2를 초기 값으로 설정해 줬다.

이것이 디폴트 값이라 한다.


아래와 같이 각각 호출 때 결과 값을 예측 해보자.


int result = 0 ;


result = sum();

std::cout<<result<<std::endl;


result = sum( 8 );

std::cout<<result<<std::endl;


result = sum( 6, 3 );

std::cout<<result<<std::endl;


[결과]

 3

 10

 9

result = sum()

-> 두 개 인자 모두 입력되지 않아 모두 디폴트 값으로 설정이 된다.

    디폴트 값이 1,2 이며 두개 합은 3이다.


result = sum(8)

-> 첫번째 인자가 8로 입력되며 두번째 인자는 디폴트 값으로 설정이 된다.

    첫번째 인자 값인 8과 두번째 디폴트 값인 2가 더해져 10이 된다.


result = sum( 6, 3 )

-> 두 개 인자 모두 입력이 되었으며 두 합은 9이다.





 부분 적 디폴트 값 설정 하기

    

함수 매개변수를 부분적으로 선언 가능하다.

 int sum1( int a , int b = 2 int c = 3 )

 {

     return a + b + c ;

 }

 int sum2( int , int b, int c = 3 )

 {

     return a + b + c ;

 }


sum1, sum2 함수에 각각 일부만 디폴트 값을 선언했다.

sum1 함수 후출 할 때 첫 번째 인자를 필수로 넣어야 한다.

sum2 함수 후출 할 때 첫 번째, 두 번째 인자를 필수로 넣어야 한다.


여기서 주의 할 점은 아래와 같이 1,2번째는 디폴트 값을 설정 하고

3번째는 설정 안하면 안된다는 점이다.

int sum( int a = 1, int b = 2, int c ) <=== (X)

int sum( int a = 1, int b, int c ) <=== (X)

int sum( int a, int b = 2, int c ) <=== (X)


부분 디폴트 값 설정은 맨 오른쪽 매개 변수 부터 설정 한다.





[전체 예제]


#include <iostream>


int sum( int a = 1, int b = 2 )

{

    return a + b ;

}


int sum2( int a, int b = 2, int c = 3 )

{

    return a + b + c ;

}


int main(int argc, char** argv) 

{

    int result = 0 ;


    result = sum();

    std::cout<<result<<std::endl;

    

    result = sum(8);

    std::cout<<result<<std::endl;

    

    result = sum( 6, 3 );

    std::cout<<result<<std::endl;

    

    result = sum2( 5 );

    std::cout<<result<<std::endl;

    

    result = sum2( 5, 6 );

    std::cout<<result<<std::endl;

    

    result = sum2( 5, 6, 7 );

    std::cout<<result<<std::endl;

return 0;

}


[결과]

 3

 10

 9
 10
 14
 18




반응형

'프로그램 > C++' 카테고리의 다른 글

[C++] bool 자료형  (0) 2017.12.29
[C++] namespace 사용법  (0) 2017.12.27
[C++]인라인 함수 사용법  (0) 2017.12.26
[C++]함수 오버로딩 (Function Overloading)  (0) 2016.12.03
[C++] cout,cin 사용법  (0) 2016.11.15

CodeBlock 무료툴 사용 방법



CodeBlock은 C, C++ 무료 IDE TOOL 이다.

CodeBlock 설치, 설정, 실행 순으로 하나씩 알아가보도록 하겠다.



CodeBlock 설치


1. 싸이트 접속한다.

    http://www.codeblocks.org/



2. 싸이트 좌측에 Downloads를 클릭 한다.



3. 싸이트 중간에 Download the binary release를 클릭 한다.




4. 싸이트 중간에 codeblocks-16.01mingw-setup 옆에 Sourceforge.net을 클릭 한다.

    ※codeblocks-16.01mingw-setup 로 하지 않으면 mingw를 따로 설치 해야 하기 때문에 해당 설치 파일을 받는다.



5. 다운이 완료되어 설치 파일을 실행 하면 아래와 같은 화면이 나온다.

    Next 버튼을 눌러 설치를 진행 한다.



6. I agree 버튼을 눌러 설치를 진행 한다.



7. 설치 목록은 수정하지 말고 Next 버튼을 눌러 설치를 진행 한다.



8. 설치가 진행 중이다.



9. 설치가 완료 되고 지금 실행 할거냐는 물음에 '예' 버튼을 누른다.





CodeBlock 설정


1. CodeBlock이 실행되면 우측 메뉴 중 Settings를 누른다.

    하위 목록 중 Compiler...를 선택 한다.



2. Toolchain executables 탭을 선택 한다.

   Auto-detect를 하면 MinGW가 설치된 곳을 찾는다.

   확인 버튼을 누른다.

   ※ 설치할 때 MinGW를 포함한 설치 파일로 하지 않았을 경우 재 설치 혹은 MinGW를 따로 설치해 준다.



CodeBlock 실행


1. 새로운 프로젝트를 만들어 실행해 보자

    File -> New -> Project 순으로 선택 한다.



2. Console application -> Go 순으로 선택 한다.



3. Next를 선택 한다.



3. C 선택 -> Next 선택 한다.



4. Project title을 입력한다. ( 임의로 입력해도 된다. )



5. Finish를 선택 한다.



6 프로젝트 파일 목록 창과 소스파일 창이 출력 된다.

   기본적으로 실행 할 수 있도록 코드가 만들어져 있다.

   메뉴 중간에 ▶ 버튼을 눌러 실행해 본다.



7. 아래와 같이 Hello world!가 출력 된다.




반응형

엑셀 텍스트 합치는 방법


엑셀에서 각 cell에 있는 텍스트를 합치는 방법에 대해 알아보겠다.

CONCATENATE 함수를 이용해서 텍스트를 합쳐 보겠다.


CONCATENATE 사용법

 

사용방법은 다음과 같다.

 =CONCATENATE( CELL1, CELL2, ... )


텍스트를 합친 결과를 보여줄 cell에 위의 공식을 넣는다.

CELL1, CELL2 ... 인자값에 합칠 텍스트가 있는 위치를 넣어 준다.

합치고 싶은 문자가 많으면 계속 인자값을 넣어준다. 


실제 예를 들어 설명하겠다.


우선 위의 예제에서 공식은 =CONCATENATE(B2,C2,D2) 이다.

이 공식은 E2에 위치해 있음을 확인 할 수 있다.

B2 -> 나는

C2 -> 자연인

D2 -> 이다.

이 모두 합친 텍스트를 E2에 출력 하는 예를 확인 할 수 있다.







반응형

바이트 순서


CPU 종류 마다 데이터를 저장하는 방법이 다르다.

CPU는 데이터를 메모리에 저장을 한다. 

CPU 마다 데이터 순서를 순방향, 역방향 두 가지 방식으로 저장한다.

순방향 => 빅 엔디안   ( Big Endian )

역방향 => 리틀 엔디안( Little Endian )

사실 순방향, 역방향 이라는 말은 없다. 

설명하기 쉽게 하려고 필자가 만든말이니

이글을 읽는 분은 (빅,리틀) 엔디안만 기억해주기 바란다.


2진수 표현식으로 알아보는 바이트 순서


바이트 순서를 말하기 앞서 바이트가 뭔지 알아야 한다.

1byte = 8bit 이다.  1bit는 0과 1로 구성 되어 있다.

1byte는 00000000 이렇게 표현 가능하다.

정수는 4byte이다. 정수를 bit로 표현하면 다음과 같다.

00000000 00000000 00000000 00000000

정수1은 다음과 같이 표현이 가능하다.

00000000 00000000 00000000 00000001

이우리는 정수1이 CPU마다 어떻게 저장 되는지 알아보겠다.


 Big Endian

 Little Endian 

 00000000 00000000 00000000 00000001

 00000001 00000000 00000000 00000000

 순방향, 읽기 좋은 방향

 역방향, 읽는 순서가 바뀐 방향



메모리 저장 방식으로 알아보는 바이트 순서


CPU 가 메모리에 저장하는 순서를 알아보겠다.

'abcd' 를 저장하는 예를 들어보겠다.

영문은 1byte의 공간을 차지 한다. 메모리 한 블록당 1byte씩 저장한다고 가정 한다.



[BIG Endian]


 a

 b

 c

 d




[Little Endian]


 d

 c

 b

 a




메모리 주소와 바이트 순서

한가지 예를 더 들도록 하겠다. 이번 예는 좀 더 어렵다.

메모리 0x01번지를 시작하는 4바이트 int 정수 0x12345678을 넣도록 하겠다.


4바이트이기 때문에 메모리는 다음과 같은 번지수를 사용한다.


 0x01

 0x02

 0x03

 0x04

작은 번지 수에서 큰 번지수 값을 가진다.


그럼 정수 0x12345678의 최상위 바이트는 0x12이며 최하위 바이트는 0x78이다.


 빅 엔디안   ( Big Endian )

  상위 바이트 값을 작은 번지수에 저장

 리틀 엔디안( Little Endian )

  상위 바이트 값을 큰 번지수에 저장   



[BIG Endian]


  0x01

 0x02

  0x03

  0x04

  0x12

 0x34

  0x56

  0x78



[Little Endian]


  0x01

  0x02

  0x03

  0x04

  0x78

  0x56  0x34  0x12



메모리 저장 순서로 인한 송수신 문제와 해결방법


A,B라고 불리는 두 개의 시스템이 있다. 

서로 데이터를 송수신을 하는 프로그램을 구축했다.

하지만 각각 시스템은 서로 다른 CPU를 사용하여 바이트 저장 순서가 다르다.

그래서 데이터를 송신하면 받는 쪽에서 처리가 불가능 하다.


A시스템에서 0x12, 0x34라고 보냈다. 

B시스템은 0x34, 0x12라고 해석하여 개발자가 의도한데로 동작을 하지 않는다.


[해결방법]

네트워크를 통해 전송할 때는 빅 엔디안 방식으로 통일해서 보낸다.

내 CPU와 상관없이 무조건 송신하기 전에는 빅엔디안으로 보내고 받는쪽에서는 빅엔디안에서 받는쪽 CPU에 맞는 바이트 순서로 바꾼다.



마무리

위에 내용을 자세히 몰라도 프로그램 개발 하는데 지장은 없다.

네트워크를 통해 전송 할 때는 빅 엔디안으로 통일한다는 것만 기억한다.

많은 언어가 비슷한 함수명을 사용하는데 바로 ntoh, hton... 와 같은 이름을 갖은 함수들이다.

송신 전 빅엔디안으로 변환, 수신 후 빅엔디안을 수신쪽 CPU에 맞는 바이트 순서로 바꾸는 함수라 생각하면 된다.





반응형

+ Recent posts