모든수업자료는 한성현 교수님 시간입니다.
상속에서 부모는 protected를 많이쓰고, 자식은public을 많이쓴다.
부모와,자식이 함께있을떄 부모를 실행하지말고, 자식을 우선실행하는것을 오버라이딩 이라고하고, 이떄 가상함수가 필ㅇ하다.(virtual function) 다른언어에서도 객체지향이라면 다쓴다.
오버라이딩은 .c++에선 virtual을 부모 함수 앞에 꼭 써야 한다.
overloading 과overriding은 다른것이다. 오버로딩은 함수 이름이 같게여러개 사용이고, 라이딩은 자식 우선(시험나옴)
정적바인딩과, 동적바인딩.프로그래밍 언어에서 바인딩은 컴파일할떄 일어나는것인가?(static,early)바인딩 아니면 실행될떄 결정되는것은 동적(dynamic,late)바인딩 이다.
중요,
static을 넣지 않으면 1010만 계속 찍히지만, static을 넣은후, y는실행하자마자 컴파일로 들어가 10이 할당되고,실행할떄
값 할당되는것이 아니다. x는 지역변수쪽이 끝날때 사라지는데, y는 컴파일에 있기떄문에 사라지지 않고, 점점 쌓이게 된다. #include <iostream>
using std::cout;
// 함수 프로토타입 선언
void sub();
int main()
{
cout << "start\n"; // 프로그램 시작 메시지 출력
sub(); // sub() 함수 호출
sub(); // sub() 함수 호출
sub(); // sub() 함수 호출
return 0; // 프로그램 종료
}
void sub()
{
int x = 10; // 지역 변수 x를 선언하고 10으로 초기화
// 동적 바인딩: 매 호출 시마다 새로 생성되는 지역 변수
static int y = 10; // 정적 변수 y를 선언하고 10으로 초기화
// 정적 바인딩: y의 초기값은 컴파일 시 결정되며,
// 첫 번째 호출 이후 y의 초기화는 다시 일어나지 않음
cout << x << y << '\n'; // x와 y의 현재 값 출력
x++; // x를 1 증가시킴 (다음 호출 시 새로 초기화됨)
y++; // y를 1 증가시킴 (다음 호출 시에도 유지됨)
}
주석달아 설명해달라고 해보았다.
c++에선 auto가 동적으로 타입을 결정할 수 있는(자료형 자동 맞춤기능) 자료형이다.
멤버변수중에static이 있는 변수를 정적멤버변수(static멤버변수)라고 한다. 이건, 멤버들이 객체들을 공유할 목적으로 사용하는 변수이다.*즁요)
클래스로 부터 객체를 만들떄 멤버변수는 따로 만들어지고, 멤버함수는 모든객체가 공유한다.
객체들이 공유하고싶은것은 static을 쓰면 되고, 하나만 만들어진다.
12번쨰 줄을 주석처리하면 오류가 난다.
이유와,수정
클래스 안에 넣기만 하는게 아니라, 클래스 밖에서 정의를해줘야 static을 쓸수있다.(정적멤버변수)
부모 앞에virtual을 쓰면 override가 된다. 재정의 가능상태.
2가지 cast는 같은 방법이다. 요즘엔 밑에쪽static_cast<double>(x)를 많이쓴다. c++문법에서 사용한다.
순수가상함수.제일 중요한것.
순수가상함수 에러
순수 가상함수가 하나라도 있는소스는 추상클래스 라고 한다.
추상클래스는 객체를 만들수 없다.
순수가상함수는 자식에게 물려주면 자식이 기능을 만들고 강제로 정의시킨다.(안만들면 객체도 없다!)
(돈을 줄테니 주식만해서 너가 뿔려봐라) 주식말곤 돈을 주지않겠다.
자식의 주소를 부모가 받을수 있다. 순수 가상함수는 추상클래스를 정의하는데 사용하고, 부모클래스에서
자식에게 반드시 구현해야하는 메서드를 정의한다. 순수 가상 함수가 있는 클래스는 인스턴스를 만들수 없다.
부모에게 제공받은 자식은 반드시 어떤 메서드를 구현해야만 한다.
override 에선 만약virtual을 안쓰면 자식이 무시당하고 부모의것만 나온다. 하지만.virtual을 쓰면 자식의것이 나오게된다.\
자식클래스의override는 안써도 되지만, 쓰는것이 좋다
1. Java
Java에서 @Override 애너테이션을 사용하여 부모 클래스의 메서드를 재정의합니다.
java
class Parent {
void show() {
System.out.println("부모 클래스");
}
}
class Child extends Parent {
@Override
void show() {
System.out.println("자식 클래스");
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child();
obj.show(); // 자식 클래스
}
}
2. C#
C#에서는 override 키워드를 사용하여 메서드를 재정의합니다.
csharp
class Parent {
public virtual void Show() {
Console.WriteLine("부모 클래스");
}
}
class Child : Parent {
public override void Show() {
Console.WriteLine("자식 클래스");
}
}
class Program {
static void Main() {
Parent obj = new Child();
obj.Show(); // 자식 클래스
}
}
3. C++
C++에서는 override 키워드를 사용하여 가상 메서드를 재정의합니다.
cpp
#include <iostream>
using namespace std;
class Parent {
public:
virtual void show() {
cout << "부모 클래스" << endl;
}
};
class Child : public Parent {
public:
void show() override { // override 키워드 사용
cout << "자식 클래스" << endl;
}
};
int main() {
Parent* obj = new Child();
obj->show(); // 자식 클래스
delete obj;
return 0;
}
4. Python
Python에서는 override 키워드가 없지만, 메서드 이름이 같으면 자동으로 재정의됩니다.
python
class Parent:
def show(self):
print("부모 클래스")
class Child(Parent):
def show(self): # 자동으로 재정의
print("자식 클래스")
obj = Child()
obj.show() # 자식 클래스
5. PHP
PHP에서는 override 키워드가 없지만, 부모 클래스의 메서드를 동일하게 정의하면 재정의됩니다.
php
class ParentClass {
public function show() {
echo "부모 클래스\n";
}
}
class ChildClass extends ParentClass {
public function show() { // 자동으로 재정의
echo "자식 클래스\n";
}
}
$obj = new ChildClass();
$obj->show(); // 자식 클래스
다른언어에서 override사용법을 알려달라고 해보았다.