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

🌲 지식인의 숲 🌲

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



         
232, 씨쏘네임
















 
48, 페이지짓는사람





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

홈페이지 유지보수(수정) 및 제작 해드립니다.ASP, PHP, MSSQL, MYSQL, jQuery, Javascript, 각종 API연동 등홈페이지(웹/모바일) 개발 및 디자인 ...

안녕하세요.부동산, ​학원, 재고관리, ​기관/관공서, 기업, ERP, 기타 솔루션, 일반 서비스(웹, 모바일) 등다양한 분야에서 개발을 해왔습니...

주된 경력은 php기반 업무용 웹프로그램 개발입니다.웹프로그램과 연계되는 윈도우용 응용프로그램도 가능합니다. 학사관리시스템,리스업무관...

경력 12년 웹 개발자입니다.  (2012~)책임감을 가지고 원하시는 웹사이트 요구사항을 저렴한 가격에 처리해드리겠습니다. 간단한 ...

연산자 오버로딩: 사용자 정의 타입 확장

2024-09-28 11:42:34

재능넷
조회수 884 댓글수 0

연산자 오버로딩: 사용자 정의 타입 확장 🚀

콘텐츠 대표 이미지 - 연산자 오버로딩: 사용자 정의 타입 확장

 

 

안녕하세요, C++ 프로그래밍의 세계로 오신 것을 환영합니다! 오늘은 C++의 강력한 기능 중 하나인 '연산자 오버로딩'에 대해 깊이 있게 알아보겠습니다. 이 기능은 프로그래머들에게 큰 유연성을 제공하며, 코드의 가독성과 직관성을 높이는 데 큰 도움을 줍니다. 마치 재능넷에서 다양한 재능을 거래하듯이, 연산자 오버로딩을 통해 우리는 C++의 기본 연산자들에 새로운 '재능'을 부여할 수 있죠. 😉

💡 알고 계셨나요? 연산자 오버로딩은 C++의 핵심 기능 중 하나로, 객체 지향 프로그래밍의 다형성 원칙을 구현하는 강력한 도구입니다.

1. 연산자 오버로딩이란? 🤔

연산자 오버로딩은 기존의 C++ 연산자들에 새로운 의미를 부여하는 기능입니다. 이를 통해 사용자 정의 타입(클래스나 구조체)에 대해 연산자의 동작을 재정의할 수 있습니다. 예를 들어, 두 복소수를 더하는 연산이나, 두 문자열을 연결하는 연산 등을 구현할 수 있죠.

연산자 오버로딩의 주요 목적은 코드의 가독성과 직관성을 높이는 것입니다.

일반적인 함수 호출 대신 익숙한 연산자 기호를 사용함으로써, 코드를 더 자연스럽고 이해하기 쉽게 만들 수 있습니다. 연산자 오버로딩 개념도 기본 연산자 오버로딩된 연산자 사용자 정의 타입에 적용

2. 연산자 오버로딩의 장점 👍

  • 직관적인 코드: 복잡한 함수 호출 대신 간단한 연산자를 사용할 수 있습니다.
  • 타입의 자연스러운 확장: 사용자 정의 타입을 기본 타입처럼 다룰 수 있습니다.
  • 코드의 일관성: 표준 라이브러리의 타입들과 유사한 방식으로 사용자 정의 타입을 다룰 수 있습니다.
  • 표현력 향상: 복잡한 연산을 간결하게 표현할 수 있습니다.

⚠️ 주의사항: 연산자 오버로딩은 강력한 도구이지만, 남용하면 코드의 의미를 모호하게 만들 수 있습니다. 항상 직관적이고 예측 가능한 방식으로 사용해야 합니다.

3. 연산자 오버로딩의 기본 문법 📝

C++에서 연산자 오버로딩은 다음과 같은 기본 문법을 따릅니다:

return-type operator symbol (parameters) {
    // 연산자 동작 정의
}

여기서:

  • return-type은 연산의 결과 타입입니다.
  • operator는 키워드입니다.
  • symbol은 오버로딩하려는 연산자 기호입니다. (예: +, -, *, / 등)
  • parameters는 연산자가 작동할 피연산자들입니다.

연산자 오버로딩은 멤버 함수로 정의할 수도 있고, 전역 함수로 정의할 수도 있습니다.

각각의 방식에는 장단점이 있으며, 상황에 따라 적절한 방식을 선택해야 합니다.

4. 멤버 함수로의 연산자 오버로딩 🏠

멤버 함수로 연산자를 오버로딩할 때는 클래스 내부에 연산자 함수를 정의합니다. 이 방식의 장점은 클래스의 private 멤버에 직접 접근할 수 있다는 것입니다.

class Complex {
private:
    double real;
    double imag;

public:
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

    // 덧셈 연산자 오버로딩
    Complex operator+(const Complex& other) const {
        return Complex(real + other.real, imag + other.imag);
    }

    // 출력 스트림 연산자 오버로딩 (멤버 함수로는 불가능)
    friend std::ostream& operator<<(std::ostream& os, const Complex& c);
};

// 출력 스트림 연산자 오버로딩 구현
std::ostream& operator<<(std::ostream& os, const Complex& c) {
    os << c.real << " + " << c.imag << "i";
    return os;
}

이 예제에서 + 연산자는 멤버 함수로 오버로딩되었습니다. 반면 << 연산자는 friend 함수로 선언되어 클래스 외부에서 정의되었습니다. 이는 << 연산자의 왼쪽 피연산자가 std::ostream 객체이기 때문입니다.

💡 팁: 멤버 함수로 연산자를 오버로딩할 때는 왼쪽 피연산자가 항상 해당 클래스의 객체여야 한다는 점을 기억하세요.

5. 전역 함수로의 연산자 오버로딩 🌍

전역 함수로 연산자를 오버로딩하면 클래스 외부에서 연산자 함수를 정의합니다. 이 방식은 양쪽 피연산자를 모두 사용자 정의 타입으로 만들고 싶을 때 유용합니다.

class String {
private:
    char* str;
    int length;

public:
    String(const char* s = "") {
        length = strlen(s);
        str = new char[length + 1];
        strcpy(str, s);
    }

    ~String() {
        delete[] str;
    }

    friend String operator+(const String& s1, const String& s2);
};

// 전역 함수로 + 연산자 오버로딩
String operator+(const String& s1, const String& s2) {
    char* temp = new char[s1.length + s2.length + 1];
    strcpy(temp, s1.str);
    strcat(temp, s2.str);
    String result(temp);
    delete[] temp;
    return result;
}

이 예제에서 + 연산자는 전역 함수로 오버로딩되었습니다. 이를 통해 String + String, "문자열" + String, String + "문자열" 등 다양한 조합의 연산이 가능해집니다.

전역 함수로 연산자를 오버로딩할 때는 friend 키워드를 사용하여 클래스의 private 멤버에 접근할 수 있게 해야 합니다.

6. 자주 오버로딩되는 연산자들 🔄

C++에서는 다양한 연산자를 오버로딩할 수 있지만, 몇몇 연산자들은 특히 자주 오버로딩됩니다:

  • 산술 연산자: +, -, *, /, %
  • 비교 연산자: ==, !=, <, >, <=, >=
  • 대입 연산자: =, +=, -=, *=, /=
  • 증감 연산자: ++, --
  • 입출력 연산자: <<, >>
  • 첨자 연산자: []
  • 함수 호출 연산자: ()
자주 오버로딩되는 연산자들 연산자 오버로딩 산술 연산자 비교 연산자 대입 연산자 증감 연산자 입출력 연산자

7. 연산자 오버로딩의 제한사항 🚫

연산자 오버로딩은 강력한 기능이지만, 몇 가지 제한사항이 있습니다:

  • 새로운 연산자를 만들 수 없습니다.
  • 기본 타입에 대한 연산자의 의미를 변경할 수 없습니다.
  • 연산자의 우선순위나 결합법칙을 변경할 수 없습니다.
  • 일부 연산자는 오버로딩할 수 없습니다. (예: ., ::, ?:, sizeof)

⚠️ 주의: 연산자 오버로딩을 남용하면 코드의 가독성을 해칠 수 있습니다. 항상 직관적이고 예측 가능한 방식으로 사용해야 합니다.

8. 연산자 오버로딩의 실제 사용 예시 💼

이제 연산자 오버로딩의 실제 사용 예시를 살펴보겠습니다. 여기서는 2D 벡터 클래스를 구현하고, 다양한 연산자를 오버로딩해보겠습니다.

class Vector2D {
private:
    double x, y;

public:
    Vector2D(double x = 0.0, double y = 0.0) : x(x), y(y) {}

    // 벡터 덧셈
    Vector2D operator+(const Vector2D& v) const {
        return Vector2D(x + v.x, y + v.y);
    }

    // 벡터 뺄셈
    Vector2D operator-(const Vector2D& v) const {
        return Vector2D(x - v.x, y - v.y);
    }

    // 스칼라 곱
    Vector2D operator*(double scalar) const {
        return Vector2D(x * scalar, y * scalar);
    }

    // 벡터의 크기 (멤버 함수)
    double magnitude() const {
        return std::sqrt(x*x + y*y);
    }

    // 등호 연산자
    bool operator==(const Vector2D& v) const {
        return (x == v.x) && (y == v.y);
    }

    // 출력 스트림 연산자 (friend 함수)
    friend std::ostream& operator<<(std::ostream& os, const Vector2D& v);
};

// 출력 스트림 연산자 구현
std::ostream& operator<<(std::ostream& os, const Vector2D& v) {
    os << "(" << v.x << ", " << v.y << ")";
    return os;
}

// 스칼라 곱 (전역 함수로 구현하여 scalar * vector 형태도 가능하게 함)
Vector2D operator*(double scalar, const Vector2D& v) {
    return v * scalar;  // 이미 정의된 vector * scalar 연산 활용
}

이 예제에서는 2D 벡터에 대한 다양한 연산자를 오버로딩했습니다. 이를 통해 벡터 연산을 매우 직관적으로 수행할 수 있게 되었습니다.

연산자 오버로딩을 통해 수학적 객체나 복잡한 데이터 구조를 다룰 때 코드의 가독성과 사용성을 크게 향상시킬 수 있습니다.

9. 연산자 오버로딩의 best practices 🏆

연산자 오버로딩을 효과적으로 사용하기 위한 몇 가지 best practices를 소개합니다:

  1. 의미를 유지하세요: 연산자의 일반적인 의미와 일치하는 방식으로 오버로딩하세요. 예를 들어, + 연산자는 항상 덧셈이나 연결을 의미해야 합니다.
  2. 일관성을 유지하세요: 관련된 연산자들은 함께 오버로딩하세요. 예를 들어, ==를 오버로딩했다면 !=도 함께 오버로딩하는 것이 좋습니다.
  3. 효율성을 고려하세요: 특히 대입 연산자나 복사 생성자를 오버로딩할 때는 성능을 고려해야 합니다.
  4. const 정확성을 유지하세요: 객체를 변경하지 않는 연산자 함수는 const로 선언하세요.
  5. 반환 값 최적화를 고려하세요: 가능한 경우 객체를 값으로 반환하는 것이 좋습니다. 현대 컴파일러는 반환 값 최적화(RVO)를 수행할 수 있습니다.

💡 Pro Tip: 연산자 오버로딩을 사용할 때는 항상 "이것이 사용자에게 직관적일까?"라고 자문해보세요. 직관적이지 않다면, 일반 멤버 함수를 사용하는 것이 더 나을 수 있습니다.

10. 연산자 오버로딩의 고급 기법 🚀

이제 연산자 오버로딩의 몇 가지 고급 기법에 대해 알아보겠습니다.

10.1 이동 의미론(Move Semantics)과 연산자 오버로딩

C++11부터 도입된 이동 의미론을 연산자 오버로딩에 적용할 수 있습니다. 이를 통해 불필요한 복사를 줄이고 성능을 향상시킬 수 있습니다.

class String {
    // ... 다른 멤버들 ...

    // 이동 생성자
    String(String&& other) noexcept
        : str(other.str), length(other.length) {
        other.str = nullptr;
        other.length = 0;
    }

    // 이동 대입 연산자
    String& operator=(String&& other) noexcept {
        if (this != &other) {
            delete[] str;
            str = other.str;
            length = other.length;
            other.str = nullptr;
            other.length = 0;
        }
        return *this;
    }

    // 이동 의미론을 활용한 + 연산자
    friend String operator+(String&& left, const String& right) {
        left.append(right);  // left는 이동될 예정이므로 직접 수정 가능
        return std::move(left);
    }
};

이동 의미론을 활용한 연산자 오버로딩은 큰 객체를 다룰 때 특히 효과적입니다. 불필요한 복사를 줄여 성능을 크게 향상시킬 수 있습니다.

10.2 리터럴 연산자 오버로딩

C++11부터는 사용자 정의 리터럴을 만들 수 있게 되었습니다. 이를 통해 단위를 가진 값을 더 직관적으로 표현할 수 있습니다.

class Distance {
    long double kilometers;
public:
    explicit Distance(long double km) : kilometers(km) {}
    // ... 다른 멤버 함수들 ...
};

// 사용자 정의 리터럴 연산자
Distance operator"" _km(long double km) {
    return Distance(km);
}

Distance operator"" _mile(long double miles) {
    return Distance(miles * 1.60934);
}

// 사용 예
Distance d1 = 10.0_km;    // 10 킬로미터
Distance d2 = 26.2_mile;  // 26.2 마일을 킬로미터로 변환

이러한 사용자 정의 리터럴을 통해 코드의 가독성과 타입 안정성을 높일 수 있습니다.

10.3 함수 객체(Functor)와 연산자 오버로딩

함수 호출 연산자 ()를 오버로딩하면 객체를 함수처럼 사용할 수 있는 함수 객체(Functor)를 만들 수 있습니다.

class Adder {
    int base;
public:
    Adder(int b) : base(b) {}
    int operator()(int x) const {
        return base + x;
    }
};

// 사용 예
Adder add5(5);
int result = add5(10);  // 결과는 15

함수 객체는 상태를 가질 수 있어 일반 함수보다 더 유연하게 사용할 수 있습니다. 또한 STL 알고리즘과 함께 사용할 때 매우 유용합니다.

11. 연산자 오버로딩과 표준 라이브러리 🏛️

C++ 표준 라이브러리의 많은 클래스들도 연산자 오버로딩을 활용하고 있습니다. 이를 통해 우리는 복잡한 객체들을 마치 기본 타입처럼 자연스럽게 사용할 수 있습니다.

11.1 std::string 클래스

std::string 클래스는 다양한 연산자를 오버로딩하여 문자열 조작을 쉽게 만듭니다.

std::string s1 = "Hello";
std::string s2 = " World";
std::string s3 = s1 + s2;  // "Hello World"

if (s1 == "Hello") {  // 비교 연산자 사용
    std::cout << "Strings are equal" << std::endl;
}

char ch = s1[0];  // 첨자 연산자 사용

11.2 std::vector 클래스

std::vector도 여러 연산자를 오버로딩하여 배열과 유사한 직관적인 사용법을 제공합니다.

std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = {4, 5, 6};

if (v1 != v2) {  // 비교 연산자 사용
    std::cout << "Vectors are different" << std::endl;
}

int third_element = v1[2];  // 첨자 연산자 사용</int></int>

11.3 std::complex 클래스

복소수를 다루는 std::complex 클래스는 수학적 연산자들을 오버로딩하여 복소수 연산을 자연스럽게 표현합니다.

std::complex<double> c1(1.0, 2.0);  // 1 + 2i
std::complex<double> c2(3.0, 4.0);  // 3 + 4i

std::complex<double> sum = c1 + c2;
std::complex<double> product = c1 * c2;

std::cout << "Sum: " << sum << std::endl;
std::cout << "Product: " << product << std::endl;</double></double></double></double>

이처럼 표준 라이브러리의 클래스들은 연산자 오버로딩을 효과적으로 활용하여 직관적이고 사용하기 쉬운 인터페이스를 제공합니다.

12. 연산자 오버로딩의 주의사항 ⚠️

연산자 오버로딩은 강력한 도구이지만, 잘못 사용하면 코드를 혼란스럽게 만들 수 있습니다. 다음은 연산자 오버로딩 시 주의해야 할 몇 가지 사항입니다:

  1. 의미를 유지하세요: 연산자의 일반적인 의미와 크게 다른 동작을 구현하지 마세요. 예를 들어, + 연산자로 뺄셈을 구현하는 것은 매우 혼란스럽습니다.
  2. 부작용을 최소화하세요:
  3. 부작용을 최소화하세요: 특히 비교 연산자나 산술 연산자의 경우, 객체의 상태를 변경하지 않는 것이 좋습니다. 예를 들어, == 연산자가 객체를 수정한다면 매우 혼란스러울 것입니다.
  4. 일관성을 유지하세요: 관련된 연산자들은 일관된 방식으로 동작해야 합니다. 예를 들어, a + b == b + a가 항상 참이 되도록 구현해야 합니다.
  5. 효율성을 고려하세요: 연산자 오버로딩으로 인해 불필요한 객체 복사가 발생하지 않도록 주의하세요. 필요한 경우 이동 의미론을 활용하세요.
  6. 명확성을 유지하세요: 연산자 오버로딩이 코드를 더 복잡하게 만든다면, 대신 일반 멤버 함수를 사용하는 것이 좋을 수 있습니다.

⚠️ 주의: 연산자 오버로딩을 남용하면 코드의 가독성과 유지보수성이 떨어질 수 있습니다. 항상 코드의 명확성과 직관성을 최우선으로 고려하세요.

13. 연산자 오버로딩의 실제 사용 사례 💼

이제 연산자 오버로딩이 실제로 어떻게 사용되는지 몇 가지 사례를 통해 살펴보겠습니다.

13.1 수학 라이브러리

수학 라이브러리에서는 벡터, 행렬, 복소수 등의 수학적 객체에 대해 연산자 오버로딩을 광범위하게 사용합니다.

class Matrix {
    // ... 행렬 데이터 및 기타 멤버 ...

public:
    Matrix operator+(const Matrix& other) const {
        // 행렬 덧셈 구현
    }

    Matrix operator*(const Matrix& other) const {
        // 행렬 곱셈 구현
    }

    Vector operator*(const Vector& vec) const {
        // 행렬-벡터 곱 구현
    }

    // ... 기타 연산자들 ...
};

// 사용 예
Matrix A, B, C;
Vector v;
Matrix result = A + B * C;
Vector transformed = A * v;

13.2 그래픽스 라이브러리

그래픽스 라이브러리에서는 색상, 좌표, 변환 등을 다루기 위해 연산자 오버로딩을 사용할 수 있습니다.

class Color {
    uint8_t r, g, b, a;

public:
    Color operator+(const Color& other) const {
        // 색상 혼합 구현
    }

    Color operator*(float intensity) const {
        // 색상 밝기 조절 구현
    }
};

class Point2D {
    float x, y;

public:
    Point2D operator+(const Vector2D& v) const {
        // 점에 벡터 더하기 구현
    }
};

// 사용 예
Color red(255, 0, 0);
Color blue(0, 0, 255);
Color purple = red + blue;
Color darkPurple = purple * 0.5f;

Point2D p(10, 20);
Vector2D v(5, -3);
Point2D newP = p + v;

13.3 날짜 및 시간 라이브러리

날짜와 시간을 다루는 라이브러리에서도 연산자 오버로딩을 유용하게 사용할 수 있습니다.

class Date {
    int year, month, day;

public:
    Date operator+(int days) const {
        // 날짜에 일수 더하기 구현
    }

    int operator-(const Date& other) const {
        // 두 날짜 사이의 일수 계산 구현
    }

    bool operator<(const Date& other) const {
        // 날짜 비교 구현
    }
};

// 사용 예
Date today(2023, 6, 15);
Date futureDate = today + 30;  // 30일 후
int daysPassed = futureDate - today;

if (today < futureDate) {
    std::cout << "미래 날짜입니다." << std::endl;
}

이러한 실제 사용 사례들은 연산자 오버로딩이 어떻게 코드를 더 직관적이고 읽기 쉽게 만드는지 보여줍니다. 복잡한 연산을 간단한 수식으로 표현할 수 있게 되어 코드의 가독성이 크게 향상됩니다.

14. 연산자 오버로딩과 템플릿 🧩

템플릿과 연산자 오버로딩을 결합하면 더욱 강력하고 유연한 코드를 작성할 수 있습니다. 이를 통해 다양한 타입에 대해 동작하는 일반화된 연산자를 정의할 수 있습니다.

관련 키워드

  • 연산자 오버로딩
  • C++
  • 객체지향 프로그래밍
  • 다형성
  • 사용자 정의 타입
  • 멤버 함수
  • 전역 함수
  • 이동 의미론
  • 함수 객체
  • 템플릿

지적 재산권 보호

지적 재산권 보호 고지

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

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

© 2025 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

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

워드프레스를 설치는 했지만, 그다음 어떻게 해야할지 모르시나요? 혹은 설치가 어렵나요?무료 워드프레스부터 프리미엄 테마까지 설치하여 드립니...

안녕하세요.자기소개는 아래에 썼으니 참고부탁드리구요.(가끔 개인적 사정으로 인해 연락을 못받거나 답변이 늦어질 수 있습니다. 양해부탁...

​우선 관심을 갖아줘서 감사합니다.제게 편하게 문의주세요.제가 작업을 진행하지 않더라도 답변을 성심 성의것 하겠습니다.10년 이상 된 경력의 ...

JAVA,JSP,PHP,javaScript(jQuery), 등의 개발을 전문적으로 하는 개발자입니다^^보다 저렴한 금액으로, 최고의 퀄리티를 내드릴 것을 자신합니다....

📚 생성된 총 지식 13,375 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 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 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창