가상함수
=상속 받은 함수(부모)를 실해하지 않고 자신(자식)의 함수 실행
오버로딩
=동일한 함수 이름을 사용하지만 매개변수의 수나 타입이 다르게 정의하는 것을 의미합니다.
오버라이딩
= 상속을 통해 부모 클래스의 가상 함수(virtual function)를 자식 클래스에서 재정의하는 개념입니다. 이를 통해 자식 클래스에서 부모 클래스의 함수를 자신에 맞게 변경할 수 있으며, 다형성을 구현할 수 있습니다.
#include <iostream>
using std::cout;
void sub();
int main()
{
cout << "start\n";
sub();
sub();
sub();
return 0;
}
void sub()
{
int x=10;
//동적 바인딩, run-time시
static int y=10;
//정적 바인딩, y의 초기값은 컴파일시 10으로
//정해지며 실행시에 이 선언문은 실행하지 않음
cout<<x<<y<<'\n';
x++;
y++;
}
#include <iostream> // 입출력을 위한 헤더 파일 포함
using std::cout; // cout을 std 네임스페이스에서 사용
void sub(); // 함수 선언
int main() {
cout << "start\n"; // "start"를 출력
sub(); // sub 함수 호출
sub(); // sub 함수 호출
sub(); // sub 함수 호출
return 0; // 프로그램 종료
}
void sub() {
int x = 10; // 지역 변수 x를 10으로 초기화
// 동적 바인딩: x는 매 호출마다 새로 생성되므로, 각 호출에서 10으로 초기화됨
static int y = 10; // static 변수 y를 10으로 초기화
// 정적 바인딩: y는 함수가 호출될 때 단 한 번만 초기화되며,
// 이후 호출에서는 초기화되지 않고 이전 값이 유지됨
cout << x << y << '\n'; // x와 y의 값을 출력
x++; // x를 1 증가시킴 (다음 호출에서는 초기화됨)
y++; // y를 1 증가시킴 (다음 호출에서도 증가된 값 유지)
}
C와 C++에서 `auto` 키워드는 서로 다른 방식으로 사용되며, 각각의 언어에서의 의미와 기능이 다릅니다. 아래에서 C와 C++의 `auto` 키워드에 대한 차이를 설명하겠습니다.
### C에서의 `auto`
- **기본 동작**: C에서는 `auto` 키워드가 지역 변수를 정의할 때 사용됩니다. 사실, 지역 변수는 기본적으로 `auto`로 간주되므로, `auto`를 명시적으로 사용할 필요는 없습니다.
- **예제**:
```c
#include <stdio.h>
int main() {
auto int x = 5; // x는 지역 변수로, auto는 생략 가능
printf("%d\n", x);
return 0;
}
```
- **결론**: C에서 `auto`는 지역 변수로서의 의미를 지니지만, 거의 사용되지 않습니다.
### C++에서의 `auto`
- **기본 동작**: C++11부터 `auto` 키워드는 변수의 타입을 컴파일 타임에 자동으로 추론하는 데 사용됩니다. 이는 코드의 가독성을 높이고, 복잡한 타입을 간결하게 표현할 수 있게 해줍니다.
- **예제**:
```cpp
#include <iostream>
#include <vector>
int main() {
auto x = 5; // x는 int로 추론됨
auto y = 3.14; // y는 double로 추론됨
std::vector<int> vec = {1, 2, 3, 4};
// 반복자 타입을 자동으로 추론
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
```
- **결론**: C++에서 `auto`는 변수 타입 추론을 자동으로 처리하여 코드를 더 간결하고 명확하게 만들어줍니다.
### 요약
| **특징** | **C** | **C++** |
|----------------|--------------------------------|---------------------------------|
| **용도** | 지역 변수를 정의할 때 사용 (기본값) | 변수의 타입을 자동으로 추론 |
| **예제** | `auto int x = 5;` (주로 사용되지 않음) | `auto x = 5;` (타입 자동 추론) |
| **버전** | C89/C90 | C++11 이후 |
이렇게 C와 C++에서의 `auto` 키워드는 서로 다른 맥락에서 사용되며, C++에서는 더 강력한 기능을 제공합니다. 추가적인 질문이 있으시면 언제든지 말씀해 주세요!
123210 210은 소멸자,, 클래스 밖 같쪽에 정의 필수, 시험 매년 냄 (정의)
#include <iostream>
using std::cout;
using std::endl;
class Shape {//추상클래스(abstract class)
protected:
double x, y;
public:
virtual double area() { return 0; } //주석처리
// 일반 가상 함수
// virtual double area()=0; //주석 해제 //순수가상함수
}; // 순수 가상 함수
class Rectangle : public Shape {
private:
double height, width;
public:
Rectangle(double h, double w)
{
height = h; width = w;
}
double area() { return(width * height); }
};
class Triangle : public Shape {
private:
double height, width;
public:
Triangle(double h, double w)
{
height = h; width = w;
}
double area() { return(width * height / 2.0); }
};
int main()
{
Shape ss; // virtual double area()=0;
// 윗줄 주석과 같이 순수 가상함수가 있으면 추상클래스이고
// 추상클래스는 객체(인스턴스)를 만들 수 없음
Shape* p; //ss같은 일발 객체는 뷸가능 하지만 포인터 객체는 가능
Rectangle nemo(10.0, 20.0);
Triangle semo(10.0, 20.0);
p = &nemo; //자식의 주소를 부모 포인터에 대입
cout << "네모면적:" << p->area() << endl; //Rectangle::area()
p = &semo;
cout << "세모면적:" << p->area() << endl; //Triangle::area()
return 0;
}
//함수()=0의 형태는 순수가상함수라고 함 =시험에 매년냄
C++
사용 위치: 클래스 멤버 함수에서 사용되며, 부모 클래스의 가상 함수가 자식 클래스에서 재정의될 때 사용합니다.
특징: override 키워드를 사용하면, 해당 함수가 부모 클래스의 가상 함수를 오버라이드하고 있음을 명시적으로 나타냅니다. 컴파일러는 이를 확인하여 잘못된 함수 시그니처를 방지합니다.
C#
사용 위치: 클래스 멤버 함수에서 사용되며, 부모 클래스의 가상 메서드를 자식 클래스에서 재정의할 때 사용합니다.
특징: override 키워드를 사용하여 부모 클래스의 메서드를 재정의함을 나타냅니다. virtual 키워드와 함께 사용되며, 메서드를 재정의할 때는 public 또는 protected로 접근 제한자를 맞춰야 합니다.
Java
사용 위치: 클래스 멤버 함수에서 사용되며, 부모 클래스의 메서드를 자식 클래스에서 재정의할 때 사용합니다.
특징: @Override 어노테이션을 사용하여 메서드를 재정의하고 있음을 나타냅니다. 이 어노테이션은 컴파일러에게 메서드가 부모 클래스의 메서드를 올바르게 재정의하고 있는지 체크하게 만듭니다.
요약
override 키워드는 C++, C#, Java에서 부모 클래스의 메서드를 자식 클래스에서 재정의할 때 사용됩니다.
각 언어마다 문법과 사용법이 다르지만, 기본적인 목적은 동일하며, 이를 통해 다형성과 코드의 가독성을 높이는 데 기여합니다.