인덕대 C++-출처 smile han

13주

Plki 2024. 11. 25. 15:53

가상함수

=상속 받은 함수(부모)를 실해하지 않고 자신(자식)의 함수 실행

 

오버로딩

=동일한 함수 이름을 사용하지만 매개변수의 수나 타입이 다르게 정의하는 것을 의미합니다.

오버라이딩

= 상속을 통해 부모 클래스의 가상 함수(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은 소멸자,,                  클래스 밖 같쪽에 정의 필수, 시험 매년 냄 (정의)

 

 

 

부모가 virtual을 붙이고 자식은 똑같은 이름의 함수 만든다. 기능만 다르게 제작

 

밑에 두개외는 잘 쓰이지 않는다 ㅕㄱㄹ과 2, 2.5, 2.5 시험에 가끔 나옴

#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의 형태는 순수가상함수라고 함        =시험에 매년냄

override는 안써도욈but 구분을 위해 사용

C++
사용 위치: 클래스 멤버 함수에서 사용되며, 부모 클래스의 가상 함수가 자식 클래스에서 재정의될 때 사용합니다.
특징: override 키워드를 사용하면, 해당 함수가 부모 클래스의 가상 함수를 오버라이드하고 있음을 명시적으로 나타냅니다. 컴파일러는 이를 확인하여 잘못된 함수 시그니처를 방지합니다.

 

C#
사용 위치: 클래스 멤버 함수에서 사용되며, 부모 클래스의 가상 메서드를 자식 클래스에서 재정의할 때 사용합니다.
특징: override 키워드를 사용하여 부모 클래스의 메서드를 재정의함을 나타냅니다. virtual 키워드와 함께 사용되며, 메서드를 재정의할 때는 public 또는 protected로 접근 제한자를 맞춰야 합니다.

 

Java
사용 위치: 클래스 멤버 함수에서 사용되며, 부모 클래스의 메서드를 자식 클래스에서 재정의할 때 사용합니다.
특징: @Override 어노테이션을 사용하여 메서드를 재정의하고 있음을 나타냅니다. 이 어노테이션은 컴파일러에게 메서드가 부모 클래스의 메서드를 올바르게 재정의하고 있는지 체크하게 만듭니다.

 

요약
override 키워드는 C++, C#, Java에서 부모 클래스의 메서드를 자식 클래스에서 재정의할 때 사용됩니다.
각 언어마다 문법과 사용법이 다르지만, 기본적인 목적은 동일하며, 이를 통해 다형성과 코드의 가독성을 높이는 데 기여합니다.

'인덕대 C++-출처 smile han' 카테고리의 다른 글

14주차  (2) 2024.12.02
14예습  (0) 2024.12.01
13주차 예습  (0) 2024.11.24
12주차  (1) 2024.11.18
12주차 예습  (0) 2024.11.17