스터디/C++

자료형 및 흐름제어

elenalee 2023. 10. 11. 19:01

 

1. 키워드와 식별자

키워드 : 미리 용도가 정해진 단어 ex) return, int, namespace .. 

식별자 : 여러가지 대상을 구분하기 위해 만든 이름 (변수, 함수, 클래스 등의 이름) c++은 대소문자 구분

- 첫문자는 비숫자 문자 (영문 대소문자와 '_', MS c++만 '$"포함, c++11에서는 다국어문자 가능 )

- 두번째 문자이후는 비숫자문자와 숫자(특수문자 사용불가)가능하며 길이제한 없음

- 키워드는 식별자로 사용할수 없음 ( '_'으로 시작하는 이름은 컴파일러에서 많이 사용하므로 비권장)

* 부적절한 사례 : 4day, my name, my#name, int, initial-v, max;value 

 

2. 자료형

기본자료형 : 정수형,  실수형

복합자료형 : 배열(array), 구조체(struct), 클래스(class), 열거형(enum), 공용체(union), 포인터, 참조

 

1) 기본 자료형  

- 정수자료형 : 고정소숫점(fixed-point)숫자표현, overflow유의

- 문자 표현 자료형 : char

- 정수 표현 자료형 : short(16bit) < int(32bit) < long(32bit) < long long 

- 참/거짓 표현 자료형 : bool (true/false)

- 다국어 표현 자료형 : wchar_t, char16_t, char32_t

 

(1)실수자료형: (floating-point)방식의 숫자표현

float (4byte) : 부호1, 지수부8, 가수부 23bit로 구성 (1.17549e-38 ~ 3.40282e38 범위표현) 

ex) numeric_limits<float>::min(), numeric_limits<float>::max()로 가장 큰값과 작은값 출력가능

double(8byte)  : 부호1, 지수부11, 가수부 52bit로 구성 (2.22507e-308 ~ 1.179789e308 범위표현) 

ex) numeric_limits<double>::min(), numeric_limits<double>::max()로 가장 큰값과 작은값 출력가능

 

(2)상수 표현 - literal 

정수형 리터럴 : 숫자를 표현하는 문자와 부호만으로 표현 (0~9와 a~f혹은 A~F로 표현)

접두사를 이용한 진법 표현 : 0b(2진수 int형 상수), 0(8진수 int형 상수), 0x(16진수 int형 상수)

접미사를 이용한 자료형 표현 : u(undesigned int), L(long), ul(unsigned long), ll(long long)

문자 리터럴 : ''안에 표기, 8진수나 16진수 문자코드 표기가능

ex)'A'는 ASCII로 65로서, '\101' (8진수) 혹은 '\x41' (16진수)로 표시가능

실수형 리터럴 : 소수점이 있거나 10의 거듭제곱을 표현하기 위한 지수기호인 'e'를 활용

ex) 1200., 1200.0, 12e2, 1.2e+5 (double형 값 1200)

      1200.0f, 12e2f (float형 값 1200)

 

(3)변수

프로그램이 실행시 기억하고 있어야 하는 값을 저장하는 메모리 영역, 자료형/이름 지정, 사용전에 선언 

 초기화 

ex) int total;(선언) + total =0(대입), int total =0;, int total(0); 

주의사항 int x(13170.5); 오차 발생(소숫점 뒷자리 버림), short y(x)는 overflow발생

→중괄호를 통해 개선 : int total {0};,  short a{total} 혹은 float b{total} (오류: 축소변환, 메모리 자릿수가 달라 변환불가) 

 자료형 추론 : 변수를 초기화할때 초기화하는 값의 자료형으로 변수의 자료형을 추론 ex) auto i(10) // int i(10)과 동일

 

(4) 변수의 사용영역(scope) : 변수가 갖는 영역

비지역변수 : 프로그램 전체영역, 소속파일의 전체영역에서 사용 (static으로 선언) ex) static int b{10}; 

지역변수 : 블록 내부에서 선언 ( 소속 블록의 전체영역에서 사용 ), 이름가리기 (가장 근접한 선언이 유효)

 

(5) const (상수)

const 한정어 

변수의 값을 수정할수 없음, 초기화를 통해서 값을 정할 수 있음  ex) const double PI {3.14159} 

constexpr 한정어 (constant expression)
값을 컴파일 시 미리 계산해둠으로써 실행시 값을 평가하는 것에 비해 효율적, 값 수정 불가 

ex) int a; std::cin >> a; const int b = 20;

const int C1 = a; (cin으로 입력된 a로 초기화) ;

constexpr int C2= a+10;(a의 값을 컴파일 할때 알수 없으므로 오류)   

constexpr int C3=b+100; (b+100의 값을 컴파일할때 계산할수 있음)

 

ex) constexpr int fac(int n) { return n>1 ? n * fac(n-1):1; }

void f(int x) {

constexpr int a = fac(4) //값이 분명하므로 컴파일시 미리계산하여 실행시 부담을 줄임 
int b = fac(x) // 값이 분명하지 않으므로 실행시 계산하게 됨)

}

 

(6) 변수의 유효기간 : 변수의 생성 및 소멸 

자동변수 : 함수(블록) 시작시 생성되고 종료시 소멸 

정적변수 : 프로그램 시작시 생성되고 프로그램이 종료될때 소멸

    ex) int x                     // 전역변수 - 정적 유효기간 

          int f() {

             int y{10};           // 지역변수 - 자동 유효기간 

             static int z{0};   // 정적 지역변수 - 정적 유효기간
            }

 

 

3. 연산자

2항 연산자 (피연산자 2개)

사칙연산자  :  +, -, *, /

나머지 연산자 : %   (피젯수외 같은 부호를 가지게 됨)

ex) 5/3=1 ... 2, -5/3 = -1... -2, 5/(-3)=-1...2, -5/(-3)=1...(-2)  

 

증감 연산자 : ++, -- 전위 혹은 후위표기에 따라 값의 차이가 나타남

a=10, b=++a(b=11), b=a++(b=10), b=--a(b=9), b=a-- (b=10)

 

 대입 연산자 : = , 연산자의 결합방향은 ( 좌 ← 우 ) 

ex) a = b = 1.5 (a는 double, b는 int인 경우, b ← 1, a ← 1 ) 

 

 복합 대입연산자 : 2항연산자 대입연산자 결합  (+= , -= , /=, *=, %=, <<= , >> = )

ex) a += b ( a = a + b )

 관계연산자 : 두 값 사이의 관계 ( >, <, >=, <=, ==, != )

 논리연산자 : 논리합 ||, 논리곱 &&, 부정 ! ( || 혹은 &&에서 앞의 조건으로부터 참/거짓이 명확해지면 연산하지 않음)

 

비트단위 연산자

비트단위 논리연산자 : 논리합 |, 논리곱 &, 배타적 논리합 ^, 부정 ~ 

ex) x는 0x35(53, 0011 0101), y는 0xf0(240 1111 0000)

x|y (1111 0101, 특정비트를 1로 만들고자 할때) x&y(0011 0000, 특정비트를 0으로 만들고자 할때)

x^y (1100 0101, 원하는 비트의 0과 1을 반전하고자 할때), ~x(1100 1010, 전체를 반전)

비트단위 이동연산자

좌측이동(<<) 지정된 비트수만큼 좌측 피연산자를 좌이동(비워지는 비트는 0) 
ex) unsigned char x = 0b00011101 //29 unsigned char y= x << 2; 

x 00011101 (밀려나가 없어지는 비트), y = 01110100  (이동비트,채워진 비트)  ==> 116 (4를 곱한값)

우측이동(>>) 지정된 비트수만큼 좌측 피연산자를 우이동(sign은 부호유지. 부호비트가 좌측 비는 비트에 채움) 
ex) unsigned char x = 0b10010100 //-108 unsigned char y= x << 2; 

x 10010101 (부호비트, 없어지는 비트), y = 11100101  (부호비트, 이동비트)  ==> -27 (2를 제곱하여 나눈값)

 

조건연산자 : 조건에 따른 3항연산자 ( 조건? 값1 : 값2 , true 값1, false 값 2)

 

4. 자료형의 변환 

1) 묵시적 형변환 : 우선 순위가 낮은 자료형의 값이 순위가 높은 자료형의 값과 같은 형으로 변환 

수식에서 묵시적 형변환은 연산자 단위로 진행, 대입연산자는 변수의 자료형으로 묵시적 형변환 

ex) double > float > int의 우선순위, 마지막 저장은 int형이므로 최종적으로 int로 저장 

(오차나 오류 가능성이 높아서 유의해야 함)

 

2) 명시적 형변환 : 형변환 연산자 

static_cast : 연관된 자료형 간의 형변환을 처리하며, 변환처리는 컴파일 단계에서 시행(번역단계에서 정적)

dynamic_cast : 기초클래스와 파생클래스간 포인터 또는 참조형 변환이 프로그램 실행중에 일어나도록 지시(실행단계에서 동적)

reinterpret_cast : 관련이 없는 자료형 사이의 변환을 처리, 포인터를 다른 자료형 포인터나 정수자료형, 또는 그 역으로 변환 

const_cast : const지정을 일시 해제함 

 

3) 형변환 연산자 사용형식


1. 흐름제어 구조

순차구조 : 문장의 나열된 순서에 따라 실행

조건제어구조 : 지정된 조건에 따라 실행흐름을 제어하는 구조, if문, switch문

반복제어구조 : 정해진 범위의 문장을 반복실행 for문, while문, do..while문 

 

1) 조건문  

(1) if문 : if (조건) 문장 1  else  문장 2

(2) switch문 : switch(정수형, 수식) { case 값1:  문장1; break;  case2: 문장2; break; ... default:문장 n; }

 

2) 반복문

(1) for문 : for( 초기화문장, 반복조건, 증감_문장) 반복할 문장; 

int val, total = 0

for ( int i =0 ; i < 10 ; i++) { cin >> val; total +=val }

 

 범위기반 for loop ( c++11 이후) : for (원소선언 : 데이터집합) { 반복할 문장 }

int arr[5] = { 2,3,9,4,7 } int sum = 0; 

for ( int a : arr ) sum += a;  cout << "합계="<< sum endl; 

 

(1) while문 : while( 반복조건) 반복할 문장; 

(2) do while문 : do 반복할 문장 while( 반복조건) ; 

 

 

2. 구조체와 클래스

 

1) 구조체 : 여러가지 자료형의 데이터 집합을 저장할 새로운 자료형을 정의한 것

구조체 선언과 구조체를 이용한 좌표선언, 원의 넓이 구하기

2) 클래스 : 표현하고자 하는 대상(객체)의 데이터(속성)와 함께 동작을 나타내는 함수(행위)를 묶어서 선언한것 

예) '원' 클래스의 행위 (원의 초기화, 원의 면적계산, 다른원과의 중첩, 원 정보표시 ) 속성 (중심좌료, 반경)

3. 배열

동일한 자료형의 값을 여러개 저장할수 있는 연속적으로 할당된 공간을 묶어 하나의 값으로 변수를 만든것

각각의 원소는 0번부터 시작하여 차례로 부여된 번호(첨자, 인덱스)를 이용하여 엑세스, 배열의 첨자갯수가 배열의 차원

 

1차원 배열  ex) float fArray[4]; 

2차원 배열 ex) int Arr2D[4][3];  ** c++은 행우선 저장 ( -------> )

 

배열의 초기화 

int a[5] = { 1,2,3,4,5}    // "="는 생략가능 

int b[5] = {1,2,3}    // b[3]=0, b[4]=0으로 초기화 

int c[] = {1,2,3,4,5}  // 배열의 크기는 5

int d[2][4] = {{1,2,3,4}, {5,6,7,8}}  d[0][0], d[0,1], d[0,2],.... 

 

4. 포인터와 동적메모리 할당

 

(1) 포인터 : 어떠한 대상이 위치한 곳을 가리키는(주소 저장)변수 

포인터에 지정된 자료형에 해당되는 변수, 동적으로 할당된 메모리, 함수등을 가리킴

 

포인터 선언형식 

TypeName* ptrVar; ( Typename: 가리킬 값이 자료형, ptrVar: 포인터 변수이름 )

ex) int* iPtr ( iPtr은 정수형 포인터 변수)

 

포인터 사용 : 포인터가 유효한 대상을 가리키게 한 후 사용해야 함 

ptrVar = &var;  // prtVar가 var를 가리킴  (&: 주소 계산 연산자)

*prtVar = value; // ptrVar를 이용하여 var를 억세스  (ptrVar로 var를 access)

ex) int a; int* iPtr = &a; *iPtr = 10; 

(2) 동적 메모리 할당

프로그램 동작중에 기억 공간의 필요성 및 소요량을 결정하여 필요한 공간을 할당 

포인터 변수가 할당된 기억 공간을 가리키케 함 

(기억공간의 생성: new연산자 생성시점, 기억공간 소멸: delete연산자 실행시점)

 

 

5. 참조 

(1) 참조:  어떠한 대상을 가리키는 값 (포인터와 유사)이며 참조변수는 참조대상의 별명처럼 사용됨 

(2) I-value참조 : 실체가 있는 대상에 대한 참조, ex) a=b+10 ( 대입명령에서 a: l-value, b:r-value)

      TypeName& refVar = varName; (TypeName : 참조대상의 자료형, refVar: 참조변수이름, varName: 참조대상)

       ** 포인터와 달리 참조는 반드시 초기화가 필요함

 

(3)const 참조 : 참조변수가 참조하는 대상을 바꿀수 없음 (읽기만 가능)

(4)참조와 포인터가 다른 점

참조 변수를 이용하여 값을 읽거나 저장할 때 참조대상변수를 사용하는 형식과 동일

참조변수는 초기화를 통해 반드시 어떤 대상을 참조해야 함 ( 초기화되지 않은 상태 불가)

참조변수는 참조대상을 변경할수 없어 유효기간동안 하나의 대상만 참조할수 있음 

 

(5) r-value참조

사용한 후에 그 값을 더 이상 가지고 있을 필요가 없는 대상을 참조, 객체의 값을 다른 객체로 이동

'스터디 > C++' 카테고리의 다른 글

상속  (0) 2023.10.18
연산자 다중정의  (0) 2023.10.17
함수와 클래스  (0) 2023.10.12