chatgpt의 도움을 받은 글입니다.
강의를 듣던 중 강사가 아래와 같은 코드를 사용했는데, typedef를 사용하지 않고 using을 사용하는 이유가 궁금해서 알아보았다.
template<typename T>
using Atomic = std::atomic<T>;
using Mutex = std::mutex;
using CondVar = std::condition_variable;
using UniqueLock = std::unique_lock<std::mutex>;
using LockGuard = std::lock_guard<std::mutex>;
기본 개념
typedef는 기존 C 스타일의 타입 별칭 방법으로 C와 C++ 모두에서 사용 가능하다.
using은 c++11부터 도입된 현대적 타입 별칭 방법이다.
문법 차이
// typedef 방식 "A를 B라 부르겠다"
typedef std::lock_guard<std::mutex> LockGuard1;
// using 방식 "A B 둘이 똑같다"
using LockGuard2 = std::lock_guard<std::mutex>;
템플릿 지원 (가장 중요한 차이)
// typedef는 템플릿 별칭 불가능 ❌
typedef std::vector<T> Vec; // 오류: T를 알 수 없음
// using은 템플릿 별칭 가능 ✅
template<typename T>
using Vec = std::vector<T>;
Vec<int> v; // OK!
복잡한 타입에서의 가독성
// 함수 포인터 typedef (읽기 어렵고 헷갈림)
typedef void(*FuncPtr)(int, float);
// 함수 포인터 using (훨씬 명확함)
using FuncPtr = void(*)(int, float);
그 외 using 만의 특징
using namespace xxx
특정 네임스페이스 안에 있는 모든 이름, 특정 클래스를 현재 스코프로 가져온다.
헤더파일에서, 전역에서 사용시 이름 충돌 문제로 위험할 수 있다고 한다.
#include <iostream>
using namespace std;
int main() {
cout << "Hello\n"; // std::cout 생략 가능
}
#include <iostream>
using namespace std::cout;
using namespace std::endl;
int main() {
cout << "Hello" << endl; // std 전체가 아니라 필요한 것만
}
using enum
enum class Color { Red, Green, Blue };
void paint() {
using enum Color;
Color c = Red; // ✅ Color::Red 대신 Red 사용 가능
}
'공부 > C\C++' 카테고리의 다른 글
| c++ placement new (0) | 2025.07.04 |
|---|---|
| c 매크로 - 함수형 매크로 () (0) | 2025.06.28 |
| c 매크로 - ## (토큰 결합 연산자) (0) | 2025.06.28 |
| typeid 키워드 (0) | 2025.06.28 |
| c extern 키워드 (with 선언과 정의) (0) | 2025.06.24 |