08.27.2023
0. Background
면접을 볼 때 나올 수 있는 질문 리스트중에 하나였는데 한 번도 생각해 본 적 없어서 이 기회에 정리해 보려 한다.
1. 객체지향 언어 vs 절차지향 언어
모두 알다싶이 자바는 객체지향, C는 절차지향 언어이다. C는 함수단위로 코드가 작성되지만 자바는 클래스 단위로 작성되고, 클래스는 인스턴스로 만들어져 메모리에 저장이 되어야 하기 때문에 이 부분에서 속도에 영향이 간다. 또한, 기본적으로 동적할당 기법을 사용해 필요할 때만 메모리에 올려 접근하는 방식을 채택했기 때문에 이 부분에서도 속도의 차이가 발생하게 된다.
2. JVM(Java Virtual Machine)
C의 컴파일 절차는 단순히 코드를 기계어로 번역시켜 exe 파일을 만들어 실행시키는 것이다. 그러나 자바는 조금 다르다.
먼저 자바코드를 컴파일해 바이트코드로 번역한다. 그리고 동적할당된 그 코드를 JVM의 Excution Engine이 번역해서 파일을 실행하게 된다.
2-1. 왜 JVM이 필요할까?
OS나 기타 다른 환경에 따라 코드는 조금씩 달라질 수 있는데, 자바에서는 그 역할을 개발자가 아닌 JVM이 해결해준다. 즉, C언어는 OS마다 코드를 다르게 생성해야 하지만, 자바는 JVM이 자동으로 해주기 때문에 코드 재작성이 필요하지 않다. 개발자의 입장에선 훨씬 편하지만, JVM이라는 프로그램이 하나 더 돌아가는 것이므로 메모리 사용 및 연산이 늘어나게 되면서 속도가 많이 떨어지게 된다.
3. GC(Garbage Collector)
마지막으로, 메모리 해제에 관련된 부분에서 속도차이가 발생하게 된다. C에서는 메모리의 동적할당을 개발자가 직접 관리할 수 있기 때문에 메모리 해제도 개발자가 원하는 즉시 가능하게 된다. 그러나 자바에서는 직접 메모리를 다루지 않기 때문에 이 부분을 GC, 가비지컬렉터가 대신 해준다. 개발자의 입장에서는 메모리를 신경쓰지 않아 훨씬 편하지만, GC 자체가 프로그램이므로 위 JVM과 같은 맥락으로 속도저하가 생긴다.
4. 결론
물론 이러한 속도차이는 기본 프로그래밍을 할 때 보다는 소형 장비(임베디드 등) 프로그램을 짤 때나 체감할 수 있는 정도이다. 또한, 자바가 개발자의 입장에서 코딩할 때 훨씬 편한 만큼, 속도부분에서 tradeoff가 있는 것이고, 현재 GC, JVM이 얼마나 코딩을 편하게 해주고 있는지 생각하면 합리적이고 훨씬 이득이라고 생각한다. 잘 기억해서 기술면접때 써먹을 일이 있으면 좋을듯!
'CS' 카테고리의 다른 글
[Database] SQLD 시험 정리본 및 후기 (0) | 2023.09.10 |
---|