OOP

jiin lee·2024년 1월 2일
0

frontend-javascript이론

목록 보기
5/15

클래스의 특성

Abstraction(추상화)

  • 이건 c++의 virtual 개념과 다른 건가?

c++에서의 virtual 개념

#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();

}
  • 실행 결과는?
    C
    B
    A
    B
  1. 클래스 C는 A를 상속
    -> A의 print 함수는 virtual임
  2. 클래스 D는 B를 상속
    -> B의 print 함수는 virtual이 아님
  • 부모 클래스의 특정 함수가 virtual이라면,
    클래스의 포인터/레퍼런스가 부모 or 자식 타입 여부에 상관없이,
    자식 클래스의 특정 함수가 정의되어 있을 시, -> 자식의 특정 함수가 실행됨
    특정 함수가 정의되어 있지 않을 시에는, -> 부모의 특정 함수가 실행됨

  • 부모 클래스의 특정 함수가 virtual이 아니고 & 클래스의 포인터/레퍼런스가 부모 클래스 타입이라면,
    자식 클래스의 특정 함수의 정의 여부에 상관 없이, 부모의 특정 함수가 실행됨

  • 부모 클래스의 특정 함수가 virtual이 아니고 & 클래스의 포인터/레퍼런스가 자식 클래스 타입이라면,
    자식 클래스의 특정 함수가 정의되어 있을 시, -> 자식의 특정 함수가 실행됨
    특정 함수가 정의되어 있지 않을 시에는, -> 부모의 특정 함수가 실행됨

C++에서의 virtual:
C++에서 virtual은 가상 함수(virtual function)를 선언하는 데 사용됩니다. 가상 함수는 파생 클래스에서 재정의(override)될 수 있는 함수로, 런타임에 객체의 실제 유형에 따라 동적으로 호출됩니다. 이를 통해 다형성(polymorphism)을 구현할 수 있습니다.

virtual을 사용하면 베이스 클래스(Base Class)에서 파생 클래스(Derived Class)에서 재정의될 것으로 예상되는 함수를 표시할 수 있습니다. 이는 다양한 유형의 객체를 동일한 인터페이스를 통해 사용할 수 있게 해줍니다.

간단히 말하면, virtual은 C++에서 다형성을 지원하기 위한 도구이며, 추상화는 객체를 단순화하고 필수적인 기능에만 집중하기 위한 개념입니다. 다만, 추상화에는 인터페이스와 구현의 분리 등 더 넓은 의미가 포함되어 있습니다.

class의 abstarction 개념

// 추상화를 위한 객체 생성
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

  • attribute = data
    car brand
    price
    passenger capacity
profile
creative engineer

0개의 댓글

관련 채용 정보