본문 바로가기
Language & Framework & GIT/C++

[씨앤씨뿔] C++ Template VS Java Generic?

by veganwithbacon 2023. 6. 20.
반응형

C++ 템플릿에 대해 공부하고 있는데, 문득 궁금증이 들어서 살짝 공부 방향을 틀었다.

 

Spring을 통해 프로젝트를 진행할 적에, 메모리를 고려하지 않고 남들이 좋다는 어노테이션이며 안전하다는 방법들을 막갖다붙였다. 여러가지가 겹치니까 속도가 무지막지하게 느려졌다.

그 뒤로 특정 기술이나 방법이 좋다해도 현재의 프로젝트나 기술에 있어서 이를 도입했을 때, 사이드 이펙트를 고려하게 되어 좀더 파악하고 도입하는 습관이 생겼다.

 

서론과는 무관하지만,  

JAVA의 generic,

C++의 Template 

이 비슷해보여서 두 가지의 차이에 대해 궁금해졌다.

 

사실 기록하려던 내용이 구글링을 하다보니 방향이 틀어져서 서론을 왜썼나 싶게 됐다..

-----------------------------------------------------------------------------------------------------------------------------------

얼핏보기에는 너무 똑같은데, 정말 똑같다면 전부 자바를 쓰지 왜 C++을 쓰겠니! 

 

  JAVA의 Generic부터

JAVA의 Generic은 타입 제거 개념에 근거한다.

이는 소스 코드를 JVM이 인식하는 바이트 코드로 변환할 때 인자로 주어진 타입을 제거하는 기술이다.

즉, JAVA의 Generic은 좀더 예쁘게 작성할 수 있게 해주는 문법적 양념(syntactic sugar)일 뿐 큰 차이를 반든다고 볼 수는 없다.

 

  이제 C++의 template

컴파일러는 인자로 주어진 각각의 타입에 대해 별도의 템플릿 코드를 생성한다.

Myfeeds<one>, Myfeeds<two>가 서로 static 변수를 공유하지 않는다.

이에 반해 Java static변수는 Myfeeds로 만든 모든 객체가 공유한다.

 

이처럼 구조적 차이로 인해 Generic과 template의 차이점이 다수 존재한다.

 

   C++  Template에는 int와 같이 기본 타입을 인자로 넘길 수 있다.

   그러나 Generic에서는 모든 타입이 Object를 상속함에 따라 원시타입인 Integer를 사용해야 한다.

 

   Java의 경우, Generic 타입 인자를 특정 타입만 되도록 제한할 수 있다. 예로 PokerCard를 Generic 클래스로 정의한다면, 그 인자로는 PokerCard의 하위 클래스만 사용되도록 제한이 가능한 것이다.(한정적 형인자)

 

   Java에서 Generic type 인자는 static 메서드나 변수 선언에 사용될 수 없다.  Myfeeds<one>, Myfeeds<two>가 서로 메서드와 변수를 공유할 것이기 때문이다. 반면, C++에서는 이 두 클래스는 다른 클래스이기에 템플릿 타입 인자를 static 메서드나 변수 선언에 사용할 수 있다.

 

   Java에서 MyClass로 만든 모든 객체는 제네릭 타입 인자가 무엇이냐에 관계없이 전부 동등한 타입이다. 실행시간에 타입 인자 정보는 삭제된다. C++에서는 다른 템플릿 타입 인자를 사용해 만든 객체는 서로 다른 타입의 객체이다.

 

 

반응형

댓글