#include <iostream>
using namespace std;
class A
{
public:
virtual void print(){cout <<"A"<<endl;}
};
class B
{
public:
void print(){cout <<"B"<<endl;}
};
class C : public A
{
public:
void print(){cout <<"C"<<endl;}
};
class D : public B
{
public:
void print(){cout <<"D"<<endl;}
};
class E : public A
{
public:
//void print(){cout <<"E"<<endl;}
};
class F : public B
{
public:
//void print(){cout <<"F"<<endl;}
};
int main(){
A a;
B b;
C c;
D d;
E e;
F f;
A &ref1=c;
ref1.print();
B &ref2=d;
ref2.print();
e.print();
f.print();
}
부모 클래스의 특정 함수가 virtual이라면,
클래스의 포인터/레퍼런스가 부모 or 자식 타입 여부에 상관없이,
자식 클래스의 특정 함수가 정의되어 있을 시, -> 자식의 특정 함수가 실행됨
특정 함수가 정의되어 있지 않을 시에는, -> 부모의 특정 함수가 실행됨
부모 클래스의 특정 함수가 virtual이 아니고 & 클래스의 포인터/레퍼런스가 부모 클래스 타입이라면,
자식 클래스의 특정 함수의 정의 여부에 상관 없이, 부모의 특정 함수가 실행됨
부모 클래스의 특정 함수가 virtual이 아니고 & 클래스의 포인터/레퍼런스가 자식 클래스 타입이라면,
자식 클래스의 특정 함수가 정의되어 있을 시, -> 자식의 특정 함수가 실행됨
특정 함수가 정의되어 있지 않을 시에는, -> 부모의 특정 함수가 실행됨
C++에서의 virtual:
C++에서 virtual은 가상 함수(virtual function)를 선언하는 데 사용됩니다. 가상 함수는 파생 클래스에서 재정의(override)될 수 있는 함수로, 런타임에 객체의 실제 유형에 따라 동적으로 호출됩니다. 이를 통해 다형성(polymorphism)을 구현할 수 있습니다.
virtual을 사용하면 베이스 클래스(Base Class)에서 파생 클래스(Derived Class)에서 재정의될 것으로 예상되는 함수를 표시할 수 있습니다. 이는 다양한 유형의 객체를 동일한 인터페이스를 통해 사용할 수 있게 해줍니다.
간단히 말하면, virtual은 C++에서 다형성을 지원하기 위한 도구이며, 추상화는 객체를 단순화하고 필수적인 기능에만 집중하기 위한 개념입니다. 다만, 추상화에는 인터페이스와 구현의 분리 등 더 넓은 의미가 포함되어 있습니다.
// 추상화를 위한 객체 생성
function Car(make, model) {
// 내부 상태
let speed = 0;
// 노출된 속성
this.make = make;
this.model = model;
// 노출된 메서드
this.accelerate = function (increment) {
speed += increment;
console.log(`Accelerating to ${speed} km/h`);
};
this.brake = function (decrement) {
speed -= decrement;
console.log(`Decelerating to ${speed} km/h`);
};
// 내부 동작은 감춤
function calculateFuelEfficiency() {
// 복잡한 연료 효율 계산 로직
console.log("Calculating fuel efficiency...");
}
}
// 사용자는 객체의 노출된 부분만 이해
const myCar = new Car("Toyota", "Camry");
myCar.accelerate(20);
myCar.brake(10);
console.log(myCar.make); // 노출된 속성에 접근
// 사용자는 내부 동작에 대한 세부 사항을 모름
// myCar.calculateFuelEfficiency(); // 오류: 접근할 수 없음
자바스크립트는 프로토타입 기반 언어이며 클래스 기반 언어와는 다른 방식으로 객체와 추상화를 다룹니다. 하지만, 여전히 사용자에게 필요한 부분만 노출하고 내부 구현의 세부 사항을 숨기는 개념을 구현할 수 있습니다. 아래는 자바스크립트에서 추상화를 보여주는 간단한 예시 코드입니다.
추상화는 객체 지향 프로그래밍(OOP)에서의 중요한 원칙 중 하나로, 사용자에게 필요한 부분만 노출하고 내부 구현의 세부 사항을 숨김으로써 단순화된 추상 버전을 제공합니다. 즉, 객체는 사용자가 필요로 하는 핵심적인 기능만을 노출하고, 그 외의 내부 동작에 대한 구체적인 세부 사항은 감추는 것입니다. 이로써 사용자는 객체를 더 쉽게 이해하고 사용할 수 있습니다.
이 코드에서 Car 함수는 자동차 객체를 추상화하고 있습니다. 사용자는 make, model, accelerate, brake와 같은 노출된 속성 및 메서드에만 접근할 수 있습니다. 내부적으로는 speed와 calculateFuelEfficiency와 같은 세부 사항은 감춰져 있습니다. 이를 통해 사용자는 자동차 객체를 더 쉽게 이해하고 사용할 수 있습니다.
Class : Type of an object
Field : State of an object
Method : Behavior of an object
Object : An individual instance of a class
Typically, objects interact with each other through methods
Car class object's attribute?
road signs - 관련x
look at the map - state
drive - state