🤔클래스, 함수 오버로딩, 생성자/소멸자
이번 포스팅에서는 C++에서의 클래스, 함수 오버로딩, 생성자/소멸자의 사용 방법을 배워보도록 하겠습니다.
중간고사를 대비하여 정리한 내용이기 때문에 내용이 매우 부실할 수 있습니다.
기회가 된다면 C++언어에 대해 제대로 알아보는 시간을 갖도록 하겠습니다.
해당 포스팅은 장진수 교수님의 객체지향설계 과목을 수강하며 작성한 내용임을 알립니다.
🔎 클래스(Classes)
클래스는 사용자가 정의한 타입입니다.
클래스의 객체가 어떤식으로 표현되는지 알려주고 클래스의 객체를 통해 명령이 동작할 수 있습니다.
클래스는 여러개의 멤버를 구성하고 있는데 세 개의 기본 멤버는 멤버변수, 멤버함수, 멤버타입입니다.
해당 클래스는 Public, Private, Protected등으로 해당 클래스의 멤버에 대한 접근 범위가 제한되어 있습니다.
아래는 클래스의 가장 큰 틀입니다.
✍️ Struct
C언어에서도 사용했던 것처럼 struct라는 키워드가 C++에도 존재합니다.
struct키워드는 class와 매우 유사하게 사용됩니다.
✍️ 멤버 변수 (Data Members)
아래의 코드에서 x와 y는 멤버변수입니다.
멤버변수는 "." 연산자를 통해 접근할 수 있습니다.
✍️ 멤버 함수(Function Members)
아래의 코드는 initialize라는 멤버함수를 사용한 코드입니다.
멤버함수를 사용하기 위해서는 클래스의 내부에 해당 함수를 선언해주어야만 합니다.
범위 지정 연산자인 "::"에 의해 해당 멤버함수를 정의할 수 있습니다.
멤버변수와 마찬가지로 "." 연산자를 통해 해당 멤버 함수에 접근할 수 있습니다.
✍️ Const 멤버 함수
const를 통해 나타내어진 멤버함수는 해당 객체의 값을 변경할 수 없습니다.
✍️ 타입 멤버
타입 멤버는 사용자가 직접 타입의 이름을 새로 만들어 주는 것입니다.
아래의 코드에서 Coordinate 는 double과 같은 역할을 하는 새로운 타입입니다.
✍️ friend 키워드
friend 클래스는 크래스의 private 멤버에 접근할 수 있는 함수/클래스입니다.
아래의 예시를 보면 myFunc() 함수는 Widget의 friend 함수이며, Gadget은 Widget의 friend 클래스입니다.
일반적으로 friend 키워드는 꼭 필요한 때가 아니라면 사용하지 않는것이 좋습니다.
frined 키워드를 사용한 코드를 한 번 살펴보겠습니다.
위의 코드에서 tempFunction()과 value는 private 접근 지정자에 선언되어 있습니다.
즉, 클래스의 외부에서 접근이 불가능하다는 것입니다.
하지만 friend 키워드를 사용하여 만든 friendAccess() 함수를 이용한다면 해당 멤버변수, 멤버함수에 접근하여 동작할 수 있습니다.
🔎 함수 오버로딩(Function Overloading)
함수 오버로딩을 이용하면 2개 이상의 이름이 같은 함수를 사용할 수 있습니다.
이때 각각의 함수에 대한 인자의 개수 또는 타입이 달라야만 사용할 수 있습니다.
위의 코드를 살펴보면 a, b, c값에 각각 int, char, double형 데이터 타입의 값이 저장되어 있는데, 모두 다른 print()함수를 불러옴으로써 다른 출력을 하는 것을 알 수 있습니다.
하지만 아래 코드와 같이 사용한다면 특이한 점을 발견할 수 있습니다.
char 데이터 타입의 값을 인자로 가지는 print() 함수의 경우 주석처리가 되었습니다.
그래서 사용할 수 있는 print()함수는 int와 double 데이터 타입의 값을 인자로 가지는 함수 뿐입니다.
print(b)를 호출했을 때 char 값인 'b'가 int 데이터 타입으로 강제 형변환 되며 '88'이라는 값을 출력한 것입니다.
즉, 강제 형변환이 가능한 데이터 타입을 인자로 가지는 함수가 존재한다면 컴파일 에러가 발생하지 않는다는 것을 알 수 있습니다.
그렇다면 컴파일 에러가 발생하는 경우도 있을까요?
위와 같은 코드에서도 마찬가지로 함수 오버로딩은 일어나지만 컴파일 에러가 발생한 것을 알 수 있습니다.
현재 c에는 10.24f 라는 값이 저장되어 있는데 해당 값은 int 또는 char 데이터 타입으로 강제 형변환 할 수 없기 때문입니다.
즉, 함수 오버로딩이 되어있더라도 강제 형변환이 일어나지 않는 경우에는 컴파일 에러가 발생한다는 것입니다.
이는 C++ 언어의 특성과 관련이 있습니다.
1. C++ 언어는 가장 정확하게 매칭되는 값을 찾으려고 합니다.
2. 하지만 만약 정확하게 매칭되는 값이 존재하지 않는다면 Promotion을 통해 다른 값을 매칭합니다.
Char, unsinged char, shor는 int 형으로 Promotion 됩니다.
Unsinged short는 int 또는 unsinged int로 Promotion 됩니다. (unsinged int로 전환된다면 int 데이터 사이즈 크기 내부의 값만 가능합니다)
Float는 double로 Promotion됩니다.
Enumb은 int로 Promotion 됩니다.
3. 만약 promotion이 가능하지 않는다면 C++은 standard conversion을 통해 값을 매칭합니다.
모든 숫자 타입은 다른 숫자 타입으로 매칭 될 수 있습니다.
Enum은 formal한 숫자 타입으로 매칭됩니다.
0은 pointer 타입 그리고 숫자 타입으로 매칭됩니다.
4. C++은 사용자가 정의한 변환으로 매칭하려고 하기도 합니다.
5. 더 이상 매칭할 수 없다면 컴파일 에러가 발생하게 됩니다.
다음 포스팅에서는 생성자와 소멸자에 대해 알아보도록 하겠습니다.
'언어 > C++' 카테고리의 다른 글
[C++] C++언어에서 지원하는 C언어의 문법 (0) | 2022.10.26 |
---|---|
[C++] Namespace (0) | 2022.10.26 |
[C++] 생성자/소멸자 (0) | 2022.10.26 |
[C++] 객체지향설계의 이해(실습) (0) | 2022.10.25 |
[C++] 객체지향설계의 이해(class, object, storage duration, abstraction, encapsulation, inheritance, polymorphism,) (0) | 2022.10.25 |