본문 바로가기

카테고리 없음

23년 C++ chap7 클래스와 생성자 -> 인스턴스 멤버

*이전 포스팅의 생성자와 소멸자를 기반으로 한 Circle클래스 구조도*

ㄴ마지막 main 함수 -> 멤버함수 내에 생성자/소멸자 포함

*끝!*

04 인스턴스 멤버

-지금까지 클래스 정의 / 클래스를 기반으로 객체 인스턴스화하는 방법 / 객체의 데이터 멤버와 멤버함수에 대해 공부함!!

 

-클래스 설계할 때는 인스턴스 멤버 / 클래스 멤버 라는 2가지 멤버 그룹 사용

 

1 인스턴스 데이터 멤버

-인스턴스 데이터 멤버: 인스턴스의 '속성'을 정의

ㄴ따라서 각각의 객체는 클래스에 정의된 데이터 멤버 캡슐화해야 함

캡슐화: 연관된 데이터와 함수를 논리적으로 묶어놓은 것(각 객체별로 서로 다른 데이터를 갖는 속성)

ㄴ데이터 멤버는 해당 인스턴스에만 속하여 인스턴스끼리 서로 접근x

 

인스턴스 데이터 멤버의 접근 제한자

-인스턴스 데이터 멤버는 private로 설정하는 것이 좋다(멤버함수로만 접근하도록)

ㄴ> 객체지향프로그래밍 - 객체 -> 행위(멤버함수) -> 속성 과정으로 조작함

 

2 인스턴스 멤버 함수

-인스턴스 멤버함수: 인스턴스의 '행위'

ㄴ객체의 인스턴스 데이터 멤버를 조작하기 위해 사용

ㄴ데이터 멤버는 모든 객체가 개별적으로 가짐 BUT 멤버함수는 모든 객체가 공유

 

 (1)인스턴스 멤버함수의 접근 제한자

-인스턴스 멤버함수는 public으로 한다(클래스 외부에서 멤버함수에 접근할 수 있도록)

ㄴ클래스 내부의 멤버함수에서만 접근해야 하는 함수 -> 이와 같이 특별한 경우 private로 한다

 

(2)인스턴스 멤버함수 선택자

-멤버 선택 연산자(2개)

이름 연산자 표현식 결합방향
멤버 선택 . 객체.멤버
멤버 선택 -> 포인터->멤버

ㄴ> 멤버함수를 모든 객체가 공유한다고 했는데, 한 객체가 멤버함수를 사용할 때 다른 객체가 사용하고 싶으면 어떻게 할까?

 

(3) 락킹과 언락킹

-해결방법은 백그라운드에서 함수를 잠그는 락킹 / 잠금 해제하는 언락킹이다

ㄴ이를 위해 멤버함수에 포인터를 지정하는 방법을 사용한다

*포인터: 객체의 주소를 나타내는 변수

 

-this 포인터: 현재 사용하고 있는 객체를 나타내기 위한 포인터(모든 멤버함수는 this 포인터가 숨겨져 있다)

ㄴ멤버함수에는 하나의 this 포인터만 있으므로 한 번에 한 객체만 멤버함수를 호출할 수 있다

ㄴ컴파일러가 멤버함수의 매개변수에  this키워드를 자동으로 추가한다

사용자가 작성한 코드 -> 컴파일러가 매개변수를 추가한 코드

ㄴ> this->radius 와 (*this).radius는 같다

* -> 연산자는 추후 포스팅에서 다루겠다

 

(4) 명시적인 포인터 사용

-this 포인터를 사용하지 않은 경우, 변수이름 충돌을 피하기 위해 데이터 멤버와 매개변수를 다른 이름으로 사용해야 한다

ㄴthis 포인터를 사용하면 데이터 멤버와 매개변수를 같은 이름으로 사용 가능

this 포인터 사용하지 않은 경우 / 사용한 경우

 

 

(5) 접근자 멤버함수(겟터getter)

*호스트 객체: 인스턴스 멤버함수를 호출하는 객체

ㄴ즉 this포인터가 가리키는 객체 = 호스트 객체

 

-호스트 객체의 정보를 추출할 때 사용하는 함수(읽기 전용!!)

ㄴex) Circle 객체의 반지름 값을 리턴하는 인스턴스 멤버함수

-헤더 끝에 const한정자를 추가하는 것이 좋다(객체의 상태를 변경하지 않는다를 확실히 하도록!!)

ㄴex) double getRadius() const;

-일반적으로 매개변수 목록을 갖지 않는다

 

(6) 설정자 멤버함수(셋터setter)

-호스트 객체의 정보를 변경할 때 사용하는 함수

-상태를 변경하므로 const한정자 사용 불가

ㄴex) void setRadius(double rds);

ㄴ매개변수가 없어도 데이터 멤버 값을 변경한다면 설정자 함수다!!

ㄴ생성자와 소멸자도 객체 상태를 변경하므로 설정자 함수다!!(객체를 초기화, 정리함)