*이전 포스팅의 생성자와 소멸자를 기반으로 한 Circle클래스 구조도*
*끝!*
04 인스턴스 멤버
-지금까지 클래스 정의 / 클래스를 기반으로 객체 인스턴스화하는 방법 / 객체의 데이터 멤버와 멤버함수에 대해 공부함!!
-클래스 설계할 때는 인스턴스 멤버 / 클래스 멤버 라는 2가지 멤버 그룹 사용
1 인스턴스 데이터 멤버
-인스턴스 데이터 멤버: 인스턴스의 '속성'을 정의
ㄴ따라서 각각의 객체는 클래스에 정의된 데이터 멤버 캡슐화해야 함
ㄴ캡슐화: 연관된 데이터와 함수를 논리적으로 묶어놓은 것(각 객체별로 서로 다른 데이터를 갖는 속성)
ㄴ데이터 멤버는 해당 인스턴스에만 속하여 인스턴스끼리 서로 접근x
인스턴스 데이터 멤버의 접근 제한자
-인스턴스 데이터 멤버는 private로 설정하는 것이 좋다(멤버함수로만 접근하도록)
ㄴ> 객체지향프로그래밍 - 객체 -> 행위(멤버함수) -> 속성 과정으로 조작함
2 인스턴스 멤버 함수
-인스턴스 멤버함수: 인스턴스의 '행위'
ㄴ객체의 인스턴스 데이터 멤버를 조작하기 위해 사용
ㄴ데이터 멤버는 모든 객체가 개별적으로 가짐 BUT 멤버함수는 모든 객체가 공유
(1)인스턴스 멤버함수의 접근 제한자
-인스턴스 멤버함수는 public으로 한다(클래스 외부에서 멤버함수에 접근할 수 있도록)
ㄴ클래스 내부의 멤버함수에서만 접근해야 하는 함수 -> 이와 같이 특별한 경우 private로 한다
(2)인스턴스 멤버함수 선택자
-멤버 선택 연산자(2개)
이름 | 연산자 | 표현식 | 결합방향 |
멤버 선택 | . | 객체.멤버 | → |
멤버 선택 | -> | 포인터->멤버 | → |
ㄴ> 멤버함수를 모든 객체가 공유한다고 했는데, 한 객체가 멤버함수를 사용할 때 다른 객체가 사용하고 싶으면 어떻게 할까?
(3) 락킹과 언락킹
-해결방법은 백그라운드에서 함수를 잠그는 락킹 / 잠금 해제하는 언락킹이다
ㄴ이를 위해 멤버함수에 포인터를 지정하는 방법을 사용한다
*포인터: 객체의 주소를 나타내는 변수
-this 포인터: 현재 사용하고 있는 객체를 나타내기 위한 포인터(모든 멤버함수는 this 포인터가 숨겨져 있다)
ㄴ멤버함수에는 하나의 this 포인터만 있으므로 한 번에 한 객체만 멤버함수를 호출할 수 있다
ㄴ컴파일러가 멤버함수의 매개변수에 this키워드를 자동으로 추가한다
ㄴ> this->radius 와 (*this).radius는 같다
* -> 연산자는 추후 포스팅에서 다루겠다
(4) 명시적인 포인터 사용
-this 포인터를 사용하지 않은 경우, 변수이름 충돌을 피하기 위해 데이터 멤버와 매개변수를 다른 이름으로 사용해야 한다
ㄴthis 포인터를 사용하면 데이터 멤버와 매개변수를 같은 이름으로 사용 가능
(5) 접근자 멤버함수(겟터getter)
*호스트 객체: 인스턴스 멤버함수를 호출하는 객체
ㄴ즉 this포인터가 가리키는 객체 = 호스트 객체
-호스트 객체의 정보를 추출할 때 사용하는 함수(읽기 전용!!)
ㄴex) Circle 객체의 반지름 값을 리턴하는 인스턴스 멤버함수
-헤더 끝에 const한정자를 추가하는 것이 좋다(객체의 상태를 변경하지 않는다를 확실히 하도록!!)
ㄴex) double getRadius() const;
-일반적으로 매개변수 목록을 갖지 않는다
(6) 설정자 멤버함수(셋터setter)
-호스트 객체의 정보를 변경할 때 사용하는 함수
-상태를 변경하므로 const한정자 사용 불가
ㄴex) void setRadius(double rds);
ㄴ매개변수가 없어도 데이터 멤버 값을 변경한다면 설정자 함수다!!
ㄴ생성자와 소멸자도 객체 상태를 변경하므로 설정자 함수다!!(객체를 초기화, 정리함)