cs 면접

[프로그래밍 언어] c, c++, java, python 의 차이점은?

슈뢰딩거의 고등어 2022. 2. 20. 20:13

 

사용가능한 언어에 대해 알려주시고 각 차이를 말해주세요


[요약]

  c c++ java python
객체지향 / 절차지향 절차지향 객체지향 객체지향 객체지향
속도 빠름 빠름 느림 느림
용도 시스템프로그래밍 응용프로그래밍 응용/웹 프로그래밍 등 응용/웹/데이터분석 등
객체지향의 특징
1. 추상화 공통의 속성이나 기능을 묶어 이름을 붙이는 것
2. 캡슐화 변수와 함수를 하나로 묶는 것
3. 상속 상위 개념을 하위 개념이 물려받는 것

overloading : 같은 이름의 메서드를 여러개 가지면서 매개변수의 수, 타입을 다르게 하는 기술

overloading : 상위 클래스가 가지고 있는 메서드를 하위클래스가 재정의해서 사용하는 기술

  절차지향 객체지향
순서 중시 중시 중시하지 않음
유지보수 어려움 쉬움
초기 개발속도 빠름 느림
실행속도 빠름 느림

[설명]

c는 절차지향적언어이고, java 는 객체지향적 언어입니다.

c는 하드웨어를 제어하기 위해서 만들어진 언어이기 때문에 os 위에서 작동하는 반면

java는 os위의 jvm (자바가상머신) 위에서 작동합니다.

 

절차지향적 언어란, 코드가 위에서 아래로 흐른다는 것입니다. 순서를 중요시한다는 의미이죠

c의 경우 A라는 함수를 호출하기 위해서는 A 함수 호출 위치보다 위에 (그 전에) A 함수가 정의가 되어있어야합니다.

그렇지 않다면 A함수가 없다고 컴파일 에러가 발생하죠. 따라서, 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법입니다.

하지만, java의 경우 객체지향 언어입니다. 말 그대로 모든 것을 객체로 생각하죠! 이 객체들이 서로 연결되어 큰 프로그램을 완성시킵니다.

 

c는 하드웨어를 제어하기 위해 만들어진 언어이니만큼, 바이너리 파일로 구성됩니다.

java는 완전한 기계어가 아닌, 바이트 코드 파일(.class) 로 구성됩니다.

바이트 코드는 os 에서 바로 실행할 수 없고 jvm 이라는 번역기가 필요합니다! jvm 덕분에 다양한 os위에서 java는 사용이 가능합니다.

 

하지만 jvm으로 번역하는 과정에서 c에 비해 속도가 느릴 수 밖에 없습니다.

하지만 유지보수는 문제가 되는 객체만 수정하면 되기 때문에 java가 효율이 더 좋습니다.

 

c++ 은 c를 발전시켜 만든 언어이기 때문에 c에서 추가된 문법이 많고, 더 개발자 프렌들리 하다고 생각합니다.

대부분의 c++ 컴파일러가 c 코드를 컴파일할 수 있습니다. 하지만 c 언어에 없는 문법이 c++ 에 있고, 입출력 방식부터 달라서

사용하는 표준 라이브러리가 다릅니다.

또한, c++ 은 객체지향적 언어입니다. c의 성격을 가지고 있다면서 객체지향이라니... 헷갈릴 수도 있을 것 같습니다.

하지만, 객체지향은 말 그대로 객체! class 를 선언할 수 있느냐 없느냐의 차이라고 생각하시면 될 것 같습니다.

c에 없는 문법이 추가가 된 것이 C++이라고 앞서 말씀드린 것처럼 c++에는 class 를 선언할 수 있는 문법이 추가되었습니다.

 

다시 한번 정의하겠습니다.

c++ 은 c(절차지향)에서 발전한 객체지향 언어이다.

[c++]

#include <iostream>

using namespace std;

int main() {
	cout << "hello world" <<endl;
    printf("hello word"); // c 처럼 할수도 있어요!
}

[c]

#include <stdio.h>
int main() {
	printf("hello world");
}

비슷하죠.

 

c를 배울때는 식별자의 이름은 유일해야 한다고 배웁니다. 하지만 c++은 유일하지 않을 수도 있습니다.

그런데 식별자가 유일하지 않다면 어떤 것을 사용해야 할지 컴파일러가 헷갈리게죠.

그것을 방지하고자 사용하는 것이 namespace 입니다.

 

"using namespace std;" 는 std에 있는 식별자를 사용할 것이라는 것을 알려주는 것입니다.

cout 은 std 라는 namespace 에 있는 것을 사용할 것이라는 것을 알려줍니다.

std :: cout << "hello world" <<endl;

 

그럼 왜 더 유용한 라이브러리가 많은 c++ 을 사용하지 않고 c를 유지사용하는 경우가 있는 걸까요?

최근에는 c 언어는 응용프로그램을 만드는데에 덜 사용되고 있지만 대부분의 운영체제의 핵심은 c로 구현이 되어있기 대문에

시스템 프로그래밍 혹은 임베디드 프로그래밍에 적합한 언어입니다.

그리고 많은 언어들이 c 언어 문법 기반으로 만들어졌기 때문에 향후 다른 언어를 학습할 때 좋습니다.

 

c++ 은 성능이 중요한 응용프로그래밍의 경우에 사용됩니다.

활용 분야로는 게임, 서버 등이 있습니다.

대표적인 예시로 유니티와 함께 게임엔진의 양대산맥인 unreal 환경에서는 c++을 사용하여 프로그래밍을 할 수 있습니다.

 

python 은 자바와 마찬가지로 둘다 높은 수준의 언어입니다. 높은 수준이란 기계어보다 인간의 언어에 가깝다는 의미입니다.

python은 객체지향/ 절차지향 두 성격을 갖는 언어입니다. java 와 마찬가지로 모든 선언을 객체화하여 사용이 가능하지만 스크립트로 사용하면 c와 같은 순서를 중요시하는 절차지향적 성격을 가질 수 있습니다.

하지만, 보통의 경우 python 을 절차지향적언어라고들 하는데요.

왜냐하면 python은 class 를 정의할 수 있거든요.

또한, python 의 특이한 특징 중 하나는 인터프리터 위에서 실행되는 언어입니다. 이러한 인터프리터 언어는 한 줄씩 순서대로 해석되고 실행됩니다. (이러한 점은 절차지향 코딩 같죠)