C언어에서의 static 개념

1. 전역변수에 선언된 static의 의미

-선언된 파일 내에서만 참조를 허용하겠다는 의미

2. 함수 내에 선언된 static의 의미
-한번만 초기화되고, 함수를 빠져나가도 소멸 안됨

 

 

static 멤버 변수(클래스 변수)

-프로그램 시작 시, 메모리 공간에 딱 하나만 할당이 되어서 공유되는 변수

-클래스 안에 작성되어 있지만 staic변수는 객체 외부에 있음

-단지, static변수가 작성되어져 있는 객체에게 멤버변수처럼 접근할 수 있는 권한을 준 것

 

 

-똑같은 이름으로 static변수를 선언해도 클래스에 따라 구분이 됨

 

 

static멤버변수 예시

-static변수를 생성자에서 초기화하면 안되는 이유는 객체가 생성될 때마다 static변수가 0으로 초기화 되기 때문

 

 

static 멤버함수

-선언된 클래스의 모든 객체가 공유함

-public으로 선언되면, 클래스의 이름을 이용해서 호출이 가능

-객체의 외부에 존재함(멤버가 아님)

 

static 멤버함수 예시

-static 멤버함수 내에서는 static멤버변수, static멤버함수만 호출이 가능

 -static멤버함수는 객체의 멤버로 존재하지 않기 때문, 객체 생성 이전에도 static멤버함수는 호출이 가능(객체가 생성되지 않았기 때문에 객체의 멤버변수에 접근하는 것은 말이 안됨)

 

 

const static 멤버

-const멤버변수(상수)의 초기화는 intializer를 통해야 했지만,

const static으로 선언되는 멤버변수(상수)는 다음과 같이 선언과 동시에 초기화가 가능

 

 

mutable

-const함수 내에서의 값의 변경을 예외적으로 허용

-제한적으로 예외적인 경우에 사용해야함

 

 

 

'Programming Language > C++' 카테고리의 다른 글

07-2 상속의 문법  (0) 2019.07.16
07-1 상속의 필요성  (0) 2019.07.16
06-2 클래스와 함수에 대한 friend 선언  (0) 2019.07.15
06-1 const 개념  (0) 2019.07.15
16-6 dynamic_cast와 static_cast 차이  (0) 2019.06.27

friend

-클래스의 friend 선언(A클래스가 B클래스 대상으로 friend 선언하면, B클래스는 A클래스의 private 멤버에 접근 가능, 역은 불가능)  

-함수의 friend 선언(함수에 선언하면 자신이 선언된 클래스의 private 영역에 접근이 가능)

 

클래스 friend선언 예시

 

 

멤버함수, 전역함수 friend선언 예시

*friend void ShowPointPos(cosnt Point&);

-이 문장에는 2가지 의미가 있다

1.ShowPointPos라는 함수가 있다!

2.이 함수를 friend선언 하겠다

-따라서, friend선언을 위해서 별도의 함수원형을 선언할 필요는 없음

 

*friend선언은 필요한 상황에서만 극히 소극적으로 사용해야함

-정보은닉 해침, coupling강해짐

 

 

'Programming Language > C++' 카테고리의 다른 글

07-1 상속의 필요성  (0) 2019.07.16
06-3 C++의 static  (0) 2019.07.16
06-1 const 개념  (0) 2019.07.15
16-6 dynamic_cast와 static_cast 차이  (0) 2019.06.27
16-5 C++ 형 변환 연산자 - reinterpret_cast  (0) 2019.06.27

const 사용하는 경우

-변수를 상수화(데이터 변경을 허용하지 않음, 객체일 경우 멤버변수의 변경 허용하지 않음)

-멤버변수를 const 선언(데이터 변경 불가)

-멤버함수를 const 선언(함수 내에서 데이터 변경을 허용하지 않음, 읽기전용함수를 작성할때 사용)

 

*const의 선언 유무도 함수 오버로딩의 조건에 해당됨

 

 

 

 

 

공통 : 둘다 상속 관계의 클래스의 형 변화에서 사용

 

dynamic_cast

-안정적인 형 변환을 보장함

-프로그램 실행 동안에 안전성을 검사하도록 컴파일러가 바이너리 코드를 생성

-대신, 속도가 느림

-안정적이지 못한 형 변환을 하는 경우 NULL반환(만약, 참조자가 형 변환 연산후 대입대상인 경우 bad_cast예외를 발생시킴)

 

static_cast

-안전성 보장 안함(프로그래머가 책임짐)

-컴파일러가 무조건 형 변환이 되도록 바이너리 코드 생성

 

 

 

 

 

<사용 경우>

-상관없는 자료형으로의 형 변환

-포인터를 대상으로 하는, 포인터와 관련이 있는 모든 유형의 형 변환을 허용

 

<예시>

reinterpret_cast<T>(expr)

 

<코드>

const_cast : 포인터와 참조자의 const성향을 제거하는 형 변환을 목적으로 사용

 

<예시>

const_cast<T>(expr)

 

<사용경우>

-포인터와 참조자의 const성향을 제거하는 형 변환을 목적으로 사용

-함수의 인자 전달 시 const선언으로 형의 불일치가 발생해서 인자전달이 불가능한 경우 유용

 

<코드>

static_cast

-유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환하거나 그 반대도 가능

-대신, 프로그래머가 오류에 대한 책임을 짐

 

<사용경우>

상속관계에서 놓여있는 두 클래스 사이에서, 기초 클래스의 포인터 및 참조형 데이터를 유도 클래스의 포인터 및 참조형 데이터로 형 변환할 경우

 

<예시>

static_cast<T>(expr)

 

<코드>

 

dynamic_cast : 상속관계에서의 안전한 형 변환

 

<사용하는 경우>

상속관계에 놓여 있는 두 클래스 사이에서 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환하는 경우

 

<예시>

dynamic_cast<T>(expr)

- T는 변환하고자 하는 자료형의 이름(객체의 포인터 or 참조형)을 둠

- expr은 변환의 대상

 

<코드>

 

<예외경우>

"기초 클래스가 Polymorphic클래스(하나 이상의 가상함수를 가진 클래스)인 경우 기초 클래스의 포인터 및 참조형 데이터를 유도 클래스의 포인터 및 참조형으로의 형 변환을 허용함

 

 

 

 

이러한 유형의 논란과 문제점 때문에 C++에서 4개의 연산자를 추가로 제공해 용도에 맞는 형 변환 연산자의 사용을 

유도함

 

- dynamic_cast

- static_cast

- const_cast

- reinterpret_cast

예외 객체 : 예외발생을 알리는 사용되는 객체

예외 클래스 : 예외객체의 생성을 위해 정의된 클래스

 

<예외클래스 코드>

-예외객체를 참조로 받음

 

-AccountException부모클래스를 DepositException, WithdrawException이 상속받는 구조로 해서 AccountException으로 throw 자료형을 명시하면 둘다 받을 수 있음

 

<예외의 전달방식에 따른 주의사항>

 

 

<new연산자에 의해서 발생하는 예외>
-new연산에 의한 메모리 공간의 할당이 실패하면 bad_alloc(<new>에 선언된 예외클래스)이라는 예외발생

 

<모든 예외를 처리하는 catch블록>

-모든 예외가 자료형에 상관없이 거렬듬

try

{

}

catch{...}

{

}

 

<예외던지기>
-catch블록에 전달된 예외는 다시 전져질수 있음

-하나의 예외가 둘 이상의 catch블록에 으해서 처리되게 할 수있음

 

try

{

}

catch(int expn)

{

 cout<<"first catch"<<endl;

 throw; //예외를 다시 던짐

}

+ Recent posts