Android (안드로이드)

[Android] 안드로이드 환경에서 C언어 사용 이유? / Java · C 성능 차이점

Oscar:) 2024. 12. 2. 21:00
728x90

 

 

 

약 2년 전쯤, 안드로이드 앱을 개발하다가 문득 떠오른 생각이 있었다.

 

모바일 게임은 어떻게 만드는거지?

난 Java를 사용하는데, 나도 모바일 게임을 만들 수 있을까?

 

그때 당시 가볍게 검색해서 알아낸 답은 C언어로 개발한다는 내용이었다.

안드로이드 개발 공식 언어는 Java · Kotlin 인데, 이해하기 힘들었다.

 

 

하지만 어느샌가 그 이유와 원리를 공부하게 되었고, 알게된 내용을 정리할 겸 포스팅한다.

NDK, JNI 등 막상 관련 내용을 공부해야하는 상황이 닥쳐서 시작하는...

 

 

 

 

 


 

 

✅ 안드로이드에서 C언어를 사용하는 케이스

 

결론부터 이야기하자면,

C언어로 Java·Kotlin 보다 좋은 성능을 발휘하는 코드를 작성할 수 있다.

 

여기서 말하는 좋은 성능이라는 기준은

고사양 처리 작업을 더욱 빠른 속도로 처리할 수 있다는 것이다.

 

 

높은 사양을 필요로하지 않는 기본적인 서비스 앱의 경우

Java·Kotlin으로 충분히 개발이 가능하다.

 

하지만 높은 사양을 처리해야하는 모바일 게임 종류의 앱(특히 3D),

또는 높은 용량의 동영상 등을 렌더링해야 하는 앱

C, C++ 등의 네이티브 코드로 개발한다.

 

 

그렇다면 왜 C언어가 성능 최적화에 유리하다는걸까?

 

 

 

 

 

✅ C언어가 성능 최적화에 유리한 이유

 

C, Java의 차이점과 함께 생각해보면 이해에 도움이 된다. 

 

 

● 저수준 언어

Java의 경우 가상 머신(JVM) 위에서 동작한다.

덕분에 운영체제에 구애받지 않는다는 플랫폼 독립성의 특징을 갖지만,

가상 머신이라는 추가적인 계층이 존재하게 된다.

 

반면 C는 추가적인 계층 없이 직접적으로 하드웨어 자원에 접근할 수 있다.

그렇기 때문에 C를 저수준 언어, 네이티브 언어라고 할 수 있다.

 

 

 

고해상도 그래픽이나 물리 연산이 많은 고사양 작업의 경우,

CPU/GPU 등 하드웨어 자원을 많이 소모해야 한다.

 

결국 중간 계층이 존재하지 않는 C는 하드웨어 자원을 직접 제어할 수 있기 때문에

Java에 비해 작업 처리 속도가 더 빠르다.

 

 

 

 

 

● 메모리 성능 최적화

 

Java는 Garbage Collector를 사용하여 메모리를 자동으로 관리한다.

자동 관리라는 것은 정해진 알고리즘을 기반으로 동작하기 때문에 어디까지나 한계가 있다.

때문에 GC 튜닝은 필수라는 이야기가 나올 정도.

또한 GC가 동작하는 것 자체로도 CPU 리소스를 더 사용하게된다.

 

반면 C는 개발자가 직접 메모리를 할당·해제하며 수동으로 관리해줘야 한다.

당연히 수동으로 관리하는 것이 난이도도 높고 번거롭지만,

그만큼 세밀하게 메모리의 성능을 최적화할 수 있다는 이야기다.

 

 

 

 

 

● 객체 지향 언어의 단점

 

대부분 알다시피 Java는 객체 지향 언어다.

클래스 단위로 동작하며 클래스가 인스턴스화 되어 메모리에서 관리된다.

 

또한 객체 지향의 대표적인 특징 중 캡슐화라는 특징이 존재하는데,

캡슐화된 데이터를 컴파일하는 과정은 그렇지 않은 경우보다 오래걸릴 수 밖에 없다.

그리고 캡슐화된 객체는 실제 크기보다 약간 더 많은 메모리를 확보하여 저장된다.

 

 

반면 C는 절차 지향 언어로서 함수·데이터 단위로 동작한다.

 

 

 

 


 

 

 

 

C 언어 기반의 앱이 Java 앱보다 고성능 작업에 유리하다는 사실은 익히 알고 있었는데,

이제서야 그 이유까지 공부하게 되었다.

 

 

 

 

 

728x90