시작은 미미하나 끝은 쥬쥬하리라.

Study/Passionate C++ Programming

[열혈 C++ 프로그래밍] (6) friend, static, const

코딩뚜벅이 2024. 1. 21. 15:17

friend, static, const

  • const
  • 클래스와 함수 friend 선언
  • static

const

객체의 const 선언 : 객체 안에 존재하는 데이터의 변경을 허용하지 않겠다는 의미

-> const로 선언된 객체를 대상으로 const 선언되지 않은 멤버 함수를 호출하면 컴파일 에러 발생
const 함수의 오버로딩 : const 선언의 유무도 오버로딩의 조건으로 사용 가능

 

simple();
simple() const;


-> 두 함수는 오버로딩 관계에 있음
-> const 객체를 인자로 함수를 호출하면 simple() const가, 일반 객체를 대상으로 호출하면 simple()

 

 


 

클래스와 함수 friend 선언

friend 선언이 된 대상은 클래스의 private 멤버에 직접 접근이 가능

friend class Boy;

 

-> Boy클래스를 대상으로 friend 선언
+ A클래스에서 B클래스를 대상으로 friend 선언을 하는 경우에 B클래스에서는 A클래스에 접근이 가능하지
만 A클래스에서 B클래스 멤버에 접근하고 싶다면 B클래스에도 선언이 정의되어야 함
-> 정보은닉을 위해 가급적 사용 자제
-> private 혹은 public 어느 위치에 선언하는 것은 중요하지 않음

 


 

static

외부 정적 변수

전역으로 선언한 static 변수
-> 같은 소스파일의 함수 내부와 외부 모두 사용 가능
-> 초기화하지 않으면 디폴트 값 0
-> 다른 소스파일에서는 사용하지 못함
내부정적변수 : 함수 내부에 선언한 static

 

 

내부 정적 변수

함수 내부에 선언한 static 변수
-> 다른 함수에서 값을 참조할 수 없음
-> 함수가 종료되어도 소멸하지 않음
+ 외부/내부정적변수는 함수의 시작과 종료가 아닌 프로그램의 시작과 종료 시점에 메모리가 할당/해제

 

 

 

 

- 함수 내 일반 변수는 함수 재실행 시 초기화
- static 변수는 전역변수의 성격으로 함수가 재실행
되어도 초기화되지 않음

 

 

static 멤버 변수

클래스 내부에 선언되었지만 전역 변수의 의미를 가진다는 것을 명시
전역 변수와 공통점 : 프로그램 시작과 종료에 생성/소멸, 전역변수와 static 변수는 하나만 존재
전역 변수와 차이점 : 일반적으로 static 변수가 함수 내부에 선언되면 외부에서 접근 불가능


외부에서의 static 변수 접근 방법
1. 클래스 내부에서는 변수명으로 접근 가능
2. 소스파일 내에서 자유롭게 사용하기 위해서는 static을 public으로 선언
3. 객체의 이름을 통해서 접근

obj1.num++;


-> 하지만 이는 클래스의 멤버변수인지 전역변수인지 분간이 어려움
static 변수의 초기화 : 일반적으로 생성자로 초기화를 하면 프로그램이 시작될 때 초기화되고 종료 시 소멸
-> 생성자의 메모리 할당과 소거의 장점이 퇴색 됨 : 별도의 초기화 문법을 정의 필요

 

 

static 멤버 함수

클래스 내부에 선언되었지만 전역 함수의 의미를 가진다는 것을 명시
-> 클래스 내 모든 객체가 공유
-> public 선언 시 클래스 이름을 통해 호출 가능
+ 객체의 멤버로 존재하지 않아 static 멤버 함수는 static 멤버변수에만 접근이 가능

 

 

const static

static 선언은 변수 선언이고 별도의 초기화 과정이 필요
-> const로 상수화 한다면 static 선언과 동시에 초기화가 가능하도록 예외적으로 허용

const static int RUSSIA = 1707540;

 

 

mutable

일반적으로 const 함수는 멤버 변수의 값에 대한 접근 및 변경이 불가

-> 멤버변수에 mutable 선언 시 const 함수에서의 접근 및 변경이 가능