핵심 개념
1. 클래스: 함수를 포함할 수 있는 구조체의 확장
2. 생성자와 소멸자: 클래스 객체가 생성 및 소멸할 때 ‘자동으로’ 호출되는 함수
3. 메서드: 함수 형태로 클래스의 실제 동작과 상태를 책임. 실제 동작을 구현하는데 중심
학습 목표
1. 개념상으로 묶여야 하는 모음인 클래스를 선언하고 제어하는 방법
2. 클래스와 객체가 만들어지고 없어질 때의 상태를 정의하는 생성자와 소멸자 함수
3. 메서드의 여러 가지 사용 형태
1. 객체지향 프로그래밍 개요
A. 클래스: 객체를 모아 사용하는 틀
i. 객체: 변수와 메서드가 모여서 동작이나 상태를 나타내는 단위
B. 프로그래밍 작성 요령
i. 코드를 작성할 때 사용자를 배려한다.
ii. 사용자의 편의성을 극대화
iii. 사용자의 실수 가능성을 제작자가 차단
C. 절차 지향 vs 객체 지향
i. 절차 지향
- 사용자는 제작자가 만든 자료구조의 멤버 및 구성을 알고 있어야 함
- 자료구조에 담긴 정보를 출력하려면 사용자 스스로 직접 멤버에 접근, 적절한 출력 방법을 선택
- 제작자가 자료구조를 변경한다면 사용자는 제작자의 코드와 관련된 자신의 코드 전체 수정
ii. 객체 지향
- 제작자가 사용자에게 인터페이스를 제공
- 사용자가 굳이 함수 구조까지 알 필요가 사라짐(인터페이스 함수)
D. 구조체 안에 함수를 넣고 선언을 하기 위해서
i. c: 구조체이름.함수이름(&구조체이름)
- 구조체 안에 있는 함수를 사용하기 위해 구조체 주소를 넘겨준다는 것 이상함
ii. c++: 구조체이름.함수이름()
- 주소를 생략했지만 실제로는 (&구조체이름)이 존재함
2. 클래스 기본 문법
- 클래스: 함수를 포함할 수 있는 구조체
- 기본 형태
Class 클래스이름
{
접근제어지시자:
멤버변수 선언;
멤버함수 선언 및 정의;
};
- 함수 내부에서 선언되지 않은 변수를 호출할 경우
n 함수가 속한 클래스의 멤버 변수를 찾으러 감
u 2.5절 참고
A. 멤버 선언 및 정의
- 생성자를 이용하는 함수 특징
n 반환 자료형이 없다
n 호출하는 함수가 아니라 적절한 시기에 내부에서 자동으로 호출되는 함수
i. 생성자 함수의 역할: 멤버 변수를 초기화
n 사용자 코드에 초기화 코드를 기술하지 않아도 생성자 함수에서 규정한 값으로 자동 멤버 초기화
ii. 멤버 함수 선언과 정의 분리
n 함수 원형: 클래스 내부
n 함수 정의: 클래스 외부
iii. 멤버 함수의 변수 식별: 지역 변수, 멤버 변수, 전역 변수 순 -> 2.5절 참고
iv. 생성자 초기화 목록
- 함수 원형 부분과 몸체를 이루는 블록 범위 사이에 위치
- 반드시 함수 원형 다음에 콜론을 기술해야 함
- 기본 형식: 멤버 변수(초깃값)
- 멤버 변수가 참조자 형식이면 반드시 초기화 목록 이용
v. 멤버 변수를 선언과 동시에 초기화 가능함
B. 접근 제어 지시자
- 제작자 스스로 자신이 만든 클래스의 특정 요소에 사용자가 접근할 수 없게 하기 위해 사용
- Public: 멤버에 관한 모든 외부 접근이 허용
- Protected: 멤버에 관한 모든 외부 접근이 차단 단, 상속 관계에 있는 파생 클래스에서의 접근은 허용
- Private: 외부 접근 뿐 아니라 파생 클래스로부터의 접근까지 모두 차단
별도로 언급하지 않는다면, 기본적으로 private
i. 생성자 함수를 private에 선언하게 되면 error
n Main 함수에서 CMyData data를 선언과 동시에 초기화를 진행해야 하는데 생성자가 private라 선언 불가
3. 생성자와 소멸자
- 반환 형식이 없다
- 함수 이름이 클래스 이름과 같다
- 클래스 제작자가 생성자 소멸자를 기술하지 않아도 컴파일러가 자동 생성함
- 생성자: 다중 정의 가능함
- 소멸자: 다중 정의 불가 / 소멸자 이름 앞에 (~) 붙는다.
l 디폴트 생성자: 매개변수가 하나도 없는 생성자 ex) 생성자
- 전역 변수로 선언한 클래스의 생성자가 main() 함수보다 먼저 호출된다.
(c랑 다른 점이다: c로 작성한 프로그램에서 가장 먼저 호출되는 함수는 main())
- 새로운 생성자를 만들면서 디폴트 생성자를 생략 가능함
n 생성자 함수를 CTest(int nParam): m_nData(nParam) {} 할 경우
n 클래스 객체 선언할 대 CTest a; 는 허용이 안된다.
A. 동적 객체의 생성과 소멸
- 클래스의 인스턴스는 선언해서 생성 가능함
- New 연산을 통해 동적으로 생성 가능함 – delete 연산자로 삭제해야 함
- New 와 delete 연산자는 생성자와 소멸자를 호출함
- 객체를 동적으로 생성할 때 배열로 생성한 객체는 배열로 삭제해야 함
n 1.5절 참고
n 이를 실수할 경우 메모리 릭(메모리 누수 발생)
B. 참조 형식 멤버 초기화
i. 참조자는 반드시 선언과 동시에 초기화(생성자 초기화 목록을 이용)
n 1.6절 3.2.1절 참고
n 생성자 초기화 목록을 사용하지 않을 경우 error
ii. CRefTest(int rParam): m_nData(rParam){};
참조자가 가리키는 원본이 삭제가 되어 더미값이 나온다.
함수의 매개변수는 함수 내부의 자동 변수
C. 생성자 다중 정의
i. 생성자 위임
n 생성자 다중 정의를 할 때 기존에 있는 함수와 중복될 경우 기존 함수를 가져다 사용이 가능함
ii. 변환 생성자: 매개변수가 하나뿐인 생성자
D. 명시적 디폴트 생성자
i. Default 예약어: 별도로 정의하지 않더라도 선언과 정의를 한번에 끝내는 예약어
ii. 디폴트 생성자가 사라졌음을 명시하는 법: CTtest(void) = delete;
u 이 경우 CTtest() a 를 선언 하면 error
4. 메서드
- 클래스의 멤버 함수(메서드 / 인터페이스 함수)
n 클래스가 제공하는 기능을 실행하는 방법
- Static: 정적으로 변환시켜주는 예약어
- const: 상수화 시켜주는 예약어
A. this 포인터
i. 작성 중인 클래스의 실제 인스턴스에 대한 주소를 가리키는 포인터
ii. 멤버 함수에서 멤버 변수를 호출할 때 컴파일 시 this->멤버변수 로 컴파일 됨
B. 실습
C. 상수형 메서드
i. 멤버 변수에 읽기 접근 가능, 쓰기는 불가
ii. 기본형식: 함수 원형 뒤에 const 예약어
iii. 상수화된 메서드가 아니라면 멤버 함수라 하더라도 호출할 수가 없다.
iv. this 포인터 형식이 상수형 포인터로 변경하는 것
D. 실습 2
E. 상수형 메서드의 예외 사항
i. mutable로 선언한 멤버 변수는 상수형 메서드에서 쓰기가 허용됨
ii. const_cast<>: 강제로 변환시킴
F. 멤버 함수 다중 정의
i. 기존 함수 다중 정의와 동일
ii. 사용자가 실수로 다른 자료형을 기술했을 때 컴파일 오류를 발생시켜 줌으로써 안전한 코드를 만든다
iii. delete예약어로 명시적 삭제를 한다.
n 기본 형식: void SetData(double dParam) = delete;
5. 정적 멤버
- 사실상 전역 변수
- 단지 클래스의 멤버
- 인스턴스를 선언하지 않고 직접 호출 가능
- This 포인터 사용 불가
- 정적 변수는 반드시 선언과 정의를 분리해야 함
- 정적 멤버 함수
n 인스턴스 및 멤버 접근 연산자를 이용해 호출 가능
n 클래스 이름 및 범위 지정 연산자로 호출 가능
연습 문제
1. 외부 접근 뿐 아니라 파생 클래스로부터의 접근까지 모두 차단한다.
2. 생성자 함수, 다중정의가 가능하다.
3. 생성자 초기화 목록
4. 멤버 변수가 참조자이면 생성자 초기화 목록에 기술해야 한다.
5. this
6. 멤버 변수에 관해 읽기는 가능하나 쓰기는 불가하다.
7. this
'C++ > 이것이 C++이다.' 카테고리의 다른 글
Ch7. 상속 심화 (0) | 2021.01.15 |
---|---|
Ch6. 상속 기본 (0) | 2021.01.15 |
Ch5. 연산자 다중정의 (0) | 2021.01.15 |
Ch4. 복사 생성자와 임시 객체 (0) | 2021.01.15 |
Ch2. C++ 함수와 네임스페이스 (0) | 2021.01.15 |
최근댓글