쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
구매 만족 후기
추천 재능





    
153, simple&modern



















해당 지식과 관련있는 인기재능

안녕하세요.신호처리를 전공한 개발자 입니다. 1. 영상신호처리, 생체신호처리 알고리즘 개발2. 안드로이드 앱 개발 3. 윈도우 프로그램...

소개안드로이드 기반 어플리케이션 개발 후 서비스를 하고 있으며 스타트업 경험을 통한 앱 및 서버, 관리자 페이지 개발 경험을 가지고 있습니다....

안녕하세요. 경력 8년차 프리랜서 개발자 입니다.피쳐폰 2g 때부터 지금까지 모바일 앱 개발을 전문적으로 진행해 왔으며,신속하 정확 하게 의뢰하...

 안녕하세요. 안드로이드 기반 개인 앱, 프로젝트용 앱부터 그 이상 기능이 추가된 앱까지 제작해 드립니다.  - 앱 개발 툴: 안드로이드...

C++에서의 다중 상속과 가상 상속

2025-01-10 02:09:36

재능넷
조회수 490 댓글수 0

C++에서의 다중 상속과 가상 상속: 객체지향의 꽃🌸과 가시🌵

콘텐츠 대표 이미지 - C++에서의 다중 상속과 가상 상속

 

 

안녕하세요, 코딩 덕후 여러분! 오늘은 C++의 핵심 개념 중 하나인 '다중 상속'과 '가상 상속'에 대해 깊이 파헤쳐볼 거예요. 이 주제는 마치 재능넷에서 다양한 재능을 한 번에 습득하는 것처럼 복잡하면서도 매력적이죠. 그럼 우리 함께 C++의 세계로 뛰어들어볼까요? 준비되셨나요? 3, 2, 1... 출발! 🚀

💡 Pro Tip: C++의 다중 상속은 마치 재능넷에서 여러 가지 재능을 동시에 배우는 것과 같아요. 복잡할 수 있지만, 제대로 이해하면 엄청난 파워를 얻을 수 있죠!

1. 다중 상속: 여러 부모의 특징을 한 몸에! 🦸‍♂️🦸‍♀️

자, 여러분! 다중 상속이 뭔지 아시나요? 간단히 말해서, 한 클래스가 여러 부모 클래스로부터 특성을 물려받는 거예요. 마치 슈퍼히어로가 여러 능력을 가진 것처럼요! 🦹‍♂️

예를 들어볼까요? 우리가 '슈퍼개발자'라는 클래스를 만든다고 생각해봐요. 이 슈퍼개발자는 '프로그래머', '디자이너', '기획자'의 능력을 모두 가지고 있어야 해요. C++에서는 이렇게 표현할 수 있어요:


class Programmer {
public:
    void code() { cout << "코딩 중... 버그 발견!" << endl; }
};

class Designer {
public:
    void design() { cout << "디자인 중... 영감 폭발!" << endl; }
};

class Planner {
public:
    void plan() { cout << "기획 중... 아이디어 샘솟는 중!" << endl; }
};

class SuperDeveloper : public Programmer, public Designer, public Planner {
public:
    void doEverything() {
        code();
        design();
        plan();
        cout << "난 슈퍼개발자다! 모든 걸 할 수 있지!" << endl;
    }
};

와우! 이렇게 하면 SuperDeveloper 클래스는 Programmer, Designer, Planner의 모든 능력을 가지게 되는 거예요. 마치 재능넷에서 여러 가지 재능을 한 번에 습득한 것 같죠? 😎

🚨 주의사항: 다중 상속은 강력하지만, 복잡성을 증가시킬 수 있어요. 마치 여러 가지 재능을 동시에 익히려다 혼란스러워지는 것처럼요. 사용할 때는 신중해야 해요!

1.1 다중 상속의 장점: 슈퍼파워 획득! 💪

  • 코드 재사용성 증가: 여러 클래스의 기능을 조합해 새로운 클래스를 만들 수 있어요.
  • 유연한 설계: 복잡한 관계를 표현하기 좋아요.
  • 기능 확장 용이: 필요한 기능만 골라서 상속받을 수 있어요.

1.2 다중 상속의 단점: 주의! 함정 주의! ⚠️

  • 다이아몬드 문제: 여러 부모 클래스가 같은 조상을 가질 때 발생해요. (이건 나중에 자세히 설명할게요!)
  • 복잡성 증가: 클래스 간의 관계가 복잡해질 수 있어요.
  • 이름 충돌: 서로 다른 부모 클래스에 같은 이름의 멤버가 있으면 골치 아파져요.

자, 이제 다중 상속의 기본 개념은 이해하셨죠? 그럼 이제 좀 더 깊이 들어가볼까요? 🏊‍♂️

2. 다중 상속의 실전 활용: 코드로 보는 재미난 예제들! 🎭

자, 이제 다중 상속을 실제로 어떻게 사용하는지 재미있는 예제로 살펴볼까요? 우리의 상상력을 마음껏 펼쳐봐요! 🌈

2.1 동물원 시뮬레이션: 신기한 동물들의 세계 🦁🐠🦅

우리가 동물원 시뮬레이션 게임을 만든다고 상상해봐요. 여기에는 다양한 특성을 가진 동물들이 있겠죠?


class LandAnimal {
public:
    void walk() { cout << "육지를 걸어요!" << endl; }
};

class WaterAnimal {
public:
    void swim() { cout << "물속을 헤엄쳐요!" << endl; }
};

class FlyingAnimal {
public:
    void fly() { cout << "하늘을 날아요!" << endl; }
};

// 펭귄: 걷고 수영할 수 있어요
class Penguin : public LandAnimal, public WaterAnimal {
public:
    void beingCute() { cout << "뒤뚱뒤뚱 귀엽게 걸어요!" << endl; }
};

// 오리: 걷고, 수영하고, 날 수 있어요
class Duck : public LandAnimal, public WaterAnimal, public FlyingAnimal {
public:
    void quack() { cout << "꽥꽥!" << endl; }
};

// 박쥐: 걷고 날 수 있어요
class Bat : public LandAnimal, public FlyingAnimal {
public:
    void useEcholocation() { cout << "초음파로 위치를 파악해요!" << endl; }
};

와! 이렇게 하면 각 동물들의 특성을 아주 잘 표현할 수 있어요. 펭귄은 땅에서 걷고 물에서 수영할 수 있고, 오리는 거기에 날기까지 할 수 있죠. 박쥐는 땅에서 걷고 하늘을 날 수 있어요. 마치 재능넷에서 여러 가지 재능을 조합해 새로운 캐릭터를 만드는 것 같지 않나요? 😄

🌟 재미있는 사실: 실제로 자연계에는 이런 '다중 상속'과 비슷한 특성을 가진 동물들이 많아요. 오리너구리같은 동물은 포유류인데 알을 낳고, 부리도 있어서 마치 여러 동물의 특성을 '상속'받은 것 같죠?

2.2 슈퍼히어로 팩토리: 능력자들의 향연 🦸‍♂️🦹‍♀️

이번에는 슈퍼히어로를 만드는 게임을 만든다고 상상해볼까요? 다양한 초능력을 조합해서 나만의 히어로를 만들 수 있다면 얼마나 재밌을까요?


class Strength {
public:
    void superStrength() { cout << "엄청난 힘을 발휘해요!" << endl; }
};

class Flight {
public:
    void fly() { cout << "하늘을 날아요!" << endl; }
};

class LaserVision {
public:
    void shootLaser() { cout << "레이저 빔을 쏴요!" << endl; }
};

class Invisibility {
public:
    void becomeInvisible() { cout << "투명 인간이 되었어요!" << endl; }
};

// 슈퍼맨: 힘, 비행, 레이저 비전을 가지고 있어요
class Superman : public Strength, public Flight, public LaserVision {
public:
    void saveTheWorld() { cout << "세상을 구했어요!" << endl; }
};

// 투명 날아다니는 사람: 비행과 투명 능력을 가지고 있어요
class InvisibleFlyer : public Flight, public Invisibility {
public:
    void stealthMission() { cout << "은밀한 임무 수행 중!" << endl; }
};

// 전능한 영웅: 모든 능력을 다 가지고 있어요
class OmnipotentHero : public Strength, public Flight, public LaserVision, public Invisibility {
public:
    void doEverything() { cout << "난 모든 걸 할 수 있어!" << endl; }
};

우와! 이렇게 하면 정말 다양한 조합의 슈퍼히어로를 만들 수 있겠죠? 슈퍼맨은 힘, 비행, 레이저 비전을 가지고 있고, 투명 날아다니는 사람은 비행과 투명 능력을 가지고 있어요. 그리고 전능한 영웅은 모든 능력을 다 가지고 있네요. 이렇게 다중 상속을 사용하면 정말 창의적인 캐릭터들을 만들 수 있어요! 🎨

💡 생각해보기: 여러분이 직접 슈퍼히어로를 만든다면 어떤 능력들을 조합하고 싶나요? 다중 상속을 사용하면 여러분의 상상력을 마음껏 펼칠 수 있어요!

2.3 스마트 가전 제품: IoT의 세계 🏠📱

이번에는 조금 더 현실적인 예제를 살펴볼까요? 요즘 핫한 IoT(사물인터넷) 기기들을 C++로 모델링해본다면 어떨까요?


class WifiConnectable {
public:
    void connectWifi() { cout << "Wi-Fi에 연결되었습니다." << endl; }
};

class Bluetooth {
public:
    void pairBluetooth() { cout << "블루투스 기기와 페어링되었습니다." << endl; }
};

class VoiceControl {
public:
    void listenVoiceCommand() { cout << "음성 명령을 기다리는 중..." << endl; }
};

class TemperatureControl {
public:
    void setTemperature(int temp) { cout << "온도를 " << temp << "도로 설정했습니다." << endl; }
};

// 스마트 스피커: Wi-Fi 연결, 블루투스, 음성 제어 가능
class SmartSpeaker : public WifiConnectable, public Bluetooth, public VoiceControl {
public:
    void playMusic() { cout << "음악을 재생합니다." << endl; }
};

// 스마트 에어컨: Wi-Fi 연결, 음성 제어, 온도 조절 가능
class SmartAirConditioner : public WifiConnectable, public VoiceControl, public TemperatureControl {
public:
    void turnOn() { cout << "에어컨을 켭니다." << endl; }
};

// 올인원 스마트홈 컨트롤러: 모든 기능을 다 가지고 있음
class SmartHomeController : public WifiConnectable, public Bluetooth, public VoiceControl, public TemperatureControl {
public:
    void controlAllDevices() { cout << "모든 스마트 기기를 제어합니다." << endl; }
};

어떤가요? 이렇게 다중 상속을 사용하면 다양한 스마트 기기들의 특성을 아주 잘 표현할 수 있어요. 스마트 스피커는 Wi-Fi에 연결하고, 블루투스로 다른 기기와 연결하고, 음성 명령을 받을 수 있죠. 스마트 에어컨은 Wi-Fi로 연결되고, 음성으로 제어할 수 있으며, 온도도 조절할 수 있어요. 그리고 올인원 스마트홈 컨트롤러는 이 모든 기능을 다 가지고 있네요. 😎

🔍 심화 학습: 실제 IoT 기기 개발에서는 이런 다중 상속 구조를 사용해 모듈화된 설계를 할 수 있어요. 각 기능을 클래스로 분리하고, 필요한 기능만 상속받아 새로운 제품을 쉽게 만들 수 있죠. 마치 재능넷에서 필요한 재능만 골라 새로운 서비스를 만드는 것처럼요!

3. 다중 상속의 함정: 다이아몬드 문제 💎🤔

자, 이제 다중 상속의 가장 유명한 문제인 '다이아몬드 문제'에 대해 알아볼 시간이에요. 이 문제는 마치 퍼즐 게임의 보스 몬스터 같아요. 해결하기 어렵지만, 한 번 해결하면 엄청난 성취감을 느낄 수 있죠! 🏆

3.1 다이아몬드 문제란? 💎

다이아몬드 문제는 다중 상속에서 발생하는 모호성 문제예요. 클래스 계층 구조가 다이아몬드 모양을 형성할 때 발생하죠. 어떤 모양인지 그림으로 한번 볼까요?

다이아몬드 문제 도식 A B C D

이 그림에서 클래스 D는 클래스 B와 C를 상속받고, B와 C는 모두 클래스 A를 상속받아요. 이렇게 되면 D는 A의 특성을 두 번 상속받게 되는데, 이게 바로 문제의 원인이 되는 거죠.

코드로 한번 볼까요?


class A {
public:
    void foo() { cout << "A의 foo" << endl; }
};

class B : public A {
public:
    void bar() { cout << "B의 bar" << endl; }
};

class C : public A {
public:
    void baz() { cout << "C의 baz" << endl; }
};

class D : public B, public C {
public:
    void qux() { cout << "D의 qux" << endl; }
};

int main() {
    D d;
    d.foo();  // 어떤 foo()를 호출해야 할까요? B를 통한 A의 foo? 아니면 C를 통한 A의 foo?
    return 0;
}

이 코드에서 d.foo()를 호출하면 어떤 일이 일어날까요? B를 통해 상속받은 A의 foo()를 호출해야 할까요, 아니면 C를 통해 상속받은 A의 foo()를 호출해야 할까요? 이런 모호성이 바로 다이아몬드 문제예요. 😵

⚠️ 주의: 이 문제를 해결하지 않으면 컴파일러는 에러를 발생시킬 거예요. "request for member 'foo' is ambiguous" 같은 메시지를 보게 될 수도 있죠.

3.2 다이아몬드 문제 해결하기: 가상 상속의 등장! 🦸‍♂️

자, 이제 우리의 영웅 '가상 상속'이 등장할 시간이에요! 가상 상속은 다이아몬드 문제를 해결하기 위한 C++의 특별한 기능이에요. 마치 슈퍼히어로가 도시를 구하러 오는 것처럼, 가상 상속이 우리의 코드를 구하러 왔어요! 🦸‍♀️

가상 상속을 사용하면 공통 기본 클래스(여기서는 A)의 인스턴스가 단 한 번만 상속되도록 할 수 있어요. 코드로 한번 볼까요?


class A {
public:
    void foo() { cout << "A의 foo" << endl; }
};

class B : virtual public A {  // 가상 상속 사용
public:
    void bar() { cout << "B의 bar" << endl; }
};

class C : virtual public A {  // 가상 상속 사용
public:
    void baz() { cout << "C의 baz" << endl; }
};

class D : public B, public C {
public:
    void qux() { cout << "D의 qux" << endl; }
};

int main() {
    D d;
    d.foo();  // 이제 모호성 없이 A의 foo()를 호출할 수 있어요!
    return 0;
}

와우! 🎉 이제 d.foo()를 호출해도 모호성 없이 A의 foo() 메서드를 호출할 수 있어요. 가상 상속을 사용함으로써 A의 인스턴스가 D에 단 한 번만 포함되도록 보장했기 때문이죠.

💡 Pro Tip: 가상 상속은 강력하지만, 메모리 사용량과 성능에 영향을 줄 수 있어요. 꼭 필요한 경우에만 사용하는 것이 좋아요. 마치 재능넷에서 필요한 재능만 선택적으로 습득하는 것처럼요!

3.3 가상 상속의 작동 원리: 뒤에서 벌어지는 마법 🎩✨

가상 상속이 어떻게 작동하는지 궁금하지 않나요? 마치 마술사의 비밀을 들여다보는 것 같아요. 자, 그 비밀을 살짝 들여다볼까요? 🕵️‍♀️

가상 상속을 사용하면 컴파일러는 다음과 같은 작업을 수행해요:

  1. 가상 기본 클래스 테이블(VBT) 생성: 각 가상 기본 클래스에 대한 포인터를 저장하는 테이블을 만들어요.
  2. 오프셋 계산: 가상 기본 클래스의 멤버에 접근할 때 사용할 오프셋을 계산해요.
  3. 단일 인스턴스 보장: 가상 기본 클래스의 인스턴스가 단 한 번만 생성되도록 해요.

이렇게 하면 다이아몬드 문제를 해결할 수 있지만, 약간의 오버헤드가 발생할 수 있어요. 하지만 걱정 마세요! 현대의 컴파일러들은 이런 오버헤드를 최소화하기 위해 열심히 노력하고 있답니다. 👨‍💻

🔬 심화 지식: 가상 상속을 사용하면 객체의 메모리 레이아웃이 복잡해질 수 있어요. 디버깅할 때 이 점을 주의해야 해요. 하지만 걱정 마세요, 연습하면 마치 재능넷에서 새로운 재능을 익히는 것처럼 익숙해질 거예요!

4. 다중 상속의 실전 활용: 인터페이스와 믹스인 🎭🧩

자, 이제 다중 상속의 더 고급스러운 사용법을 알아볼까요? C++에서는 다중 상속을 사용해 인터페이스와 믹스인이라는 강력한 개념을 구현할 수 있어요. 이건 마치 레고 블록을 조립하는 것과 비슷해요. 필요한 기능을 블록처럼 조립해 새로운 클래스를 만드는 거죠! 🧱

4.1 인터페이스: 약속의 청사진 📜

C++에는 Java나 C#처럼 'interface'라는 키워드가 없어요. 하지만 순수 가상 함수만을 포함한 추상 클래스를 사용해 인터페이스와 비슷한 개념을 구현할 수 있어요.


class Drawable {
public:
    virtual void draw() = 0;  // 순수 가상 함수
    virtual ~Drawable() {}    // 가상 소멸자
};

class Movable {
public:
    virtual void move(int x, int y) = 0;  // 순수 가상 함수
    virtual ~Movable() {}    // 가상 소멸자
};

class Player : public Drawable, public Movable {
public:
    void draw() override {
        cout << "플레이어를 그립니다." << endl;
    }
    void move(int x, int y) override {
        cout << "플레이어를 (" << x << ", " << y << ")로 이동합니다." << endl;
    }
};

class Enemy : public Drawable, public Movable {
public:
    void draw() override {
        cout << "적을 그립니다." << endl;
    }
    void move(int x, int y) override {
        cout << "적을 (" << x << ", " << y << ")로 이동합니다." << endl;
    }
};

이 렇게 하면 Player와 Enemy 클래스는 Drawable과 Movable 인터페이스를 모두 구현하게 돼요. 이는 마치 재능넷에서 '그리기 능력'과 '이동 능력'이라는 두 가지 재능을 동시에 습득하는 것과 같죠! 😃

💡 Pro Tip: 인터페이스를 사용하면 코드의 유연성이 크게 향상돼요. 예를 들어, 모든 Drawable 객체를 하나의 컨테이너에 저장하고 한 번에 그릴 수 있죠!

4.2 믹스인: 기능의 조미료 🧂

믹스인은 클래스에 추가 기능을 '섞어 넣는' 방식이에요. C++에서는 다중 상속을 통해 이를 구현할 수 있죠. 마치 요리에 다양한 향신료를 넣어 맛을 더하는 것처럼요! 🍳


class Loggable {
public:
    void log(const string& message) {
        cout << "로그: " << message << endl;
    }
};

class Serializable {
public:
    virtual string serialize() = 0;
    virtual void deserialize(const string& data) = 0;
};

class User : public Loggable, public Serializable {
private:
    string name;
    int age;

public:
    User(const string& n, int a) : name(n), age(a) {}

    string serialize() override {
        return name + "," + to_string(age);
    }

    void deserialize(const string& data) override {
        size_t pos = data.find(',');
        name = data.substr(0, pos);
        age = stoi(data.substr(pos + 1));
    }

    void doSomething() {
        log("User is doing something");
        // 다른 작업...
    }
};

이 예제에서 User 클래스는 Loggable과 Serializable이라는 두 가지 믹스인을 사용하고 있어요. 이렇게 하면 User 객체는 로깅 기능과 직렬화/역직렬화 기능을 모두 가지게 되죠. 마치 재능넷에서 '로깅 능력'과 '데이터 변환 능력'을 추가로 습득한 것과 같아요! 🚀

⚠️ 주의: 믹스인을 과도하게 사용하면 클래스가 너무 복잡해질 수 있어요. 꼭 필요한 기능만 선택적으로 사용하세요!

5. 다중 상속의 모범 사례와 주의사항 🏆🚧

다중 상속은 강력한 도구지만, 제대로 사용하지 않으면 복잡성만 증가시킬 수 있어요. 여기 몇 가지 모범 사례와 주의사항을 소개할게요!

5.1 모범 사례 👍

  • 인터페이스 분리 원칙 준수: 큰 인터페이스보다는 작고 특화된 여러 인터페이스를 사용하세요.
  • 가상 소멸자 사용: 기본 클래스의 소멸자는 항상 가상으로 선언하세요.
  • 관련 키워드

    • 다중 상속
    • 가상 상속
    • 다이아몬드 문제
    • 인터페이스
    • 믹스인
    • C++
    • 객체지향 프로그래밍
    • 클래스 계층
    • 코드 재사용
    • 모듈화 설계

    지적 재산권 보호

    지적 재산권 보호 고지

    1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
    2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
    3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
    4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
    5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

    재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
    무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

    © 2025 재능넷 | All rights reserved.

    댓글 작성
    0/2000

    댓글 0개

    해당 지식과 관련있는 인기재능

     운영하는 사이트 주소가 있다면 사이트를 안드로이드 앱으로 만들어 드립니다.기본 5000원은 아무런 기능이 없고 단순히 html 페이지를 로딩...

    # 최초 의뢰시 개발하고 싶으신 앱의 기능 및 화면구성(UI)에 대한 설명을 같이 보내주세요.# 앱스토어 URL 보내고 단순 카피 해달라고 쪽지 보내...

    안녕하세요 안드로이드 개발 7년차에 접어든 프로그래머입니다. 간단한 과제 정도는 1~2일 안에 끝낼 수 있구요 개발의 난이도나 프로젝...

    애플리케이션 서비스 안녕하세요. 안드로이드 개발자입니다.여러분들의 홈페이지,블로그,카페,모바일 등 손쉽게 어플로 제작 해드립니다.요즘...

    📚 생성된 총 지식 13,457 개

    • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
      통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

      (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
      (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

      Copyright © 2025 재능넷 Inc. All rights reserved.
    ICT Innovation 대상
    미래창조과학부장관 표창
    서울특별시
    공유기업 지정
    한국데이터베이스진흥원
    콘텐츠 제공서비스 품질인증
    대한민국 중소 중견기업
    혁신대상 중소기업청장상
    인터넷에코어워드
    일자리창출 분야 대상
    웹어워드코리아
    인터넷 서비스분야 우수상
    정보통신산업진흥원장
    정부유공 표창장
    미래창조과학부
    ICT지원사업 선정
    기술혁신
    벤처기업 확인
    기술개발
    기업부설 연구소 인정
    마이크로소프트
    BizsPark 스타트업
    대한민국 미래경영대상
    재능마켓 부문 수상
    대한민국 중소기업인 대회
    중소기업중앙회장 표창
    국회 중소벤처기업위원회
    위원장 표창