본문 바로가기
개발공부/한눈에 보기 👀

자바, 코틀린, 파이썬, C++ 한눈에 비교하기

by 개발자D 2025. 1. 17.

자바, 코틀린, 파이썬, C++ 한눈에 비교하기

Java, Kotlin, Python, C++ 언어를 한눈에 비교할 수 있도록 표로 정리해 보았습니다.

  JAVA KOTLIN PYTHON C++
클래스명 PascalCase PascalCase PascalCase PascalCase
변수, 함수명 camelCase camelCase snake_case camelCase
snake_case
주석 //, /* */ //, /* */ # //, /* */
주요 문법 문장 끝에 ;
{}
{} 띄어쓰기 중요
: 와 띄어쓰기로 {} 대체
pass 로 추후에 구현할 부분 대체 가능
문장 끝에;
{}
불러오기 import import import #include
선언 규칙 클래스 밖에서 변수와 함수를 선언할 수 없습니다. 클래스 밖에서 변수와 함수를 선언할 수 있습니다. 클래스 밖에서 변수와 함수를 선언할 수 있습니다. 클래스 밖에서 변수와 함수를 선언할 수 있습니다.
기본형
boolean (true, false)
char
byte
short
int
long
float
double
  bool (True, False)
string
number
bool
char
signed char /unsigned char
char8_t
char16_t
char32_t
wchar_t
short / unsigned short
int / unsigned int
long / unsigned long
long long / unsigned long long
float
double
long double
참조형 기본형을 제외한 모든 자료형 Boolean (true, false) …
Char

Byte / UByte
Short / UShort
Int / UInt
Long / ULong
Float
Double
String
기본형을 제외한 모든 자료형 기본형을 제외한 모든 자료형
널 허용 자료형 구분   ?를 붙여 구분함    
문자 'A' 'A' 'A', "A" 구분 없음 'A'
문자열 "String"

불변함
"String"

"""
Multi
Line
"""

불변함
'String', "String" 구분 없음

'''
Multi
Line
'''
"""
Multi
Line
"""

"String"

R"(
Multi
Line
)"

1. C언어 방식
char* str = "String";
char str[] = "String";

2. C++ 방식
std::string str = "String"; 
자료형 확인 참조변수 instanceof 확인할 클래스 참조변수 is 자료형
참조변수 as 자료형
type(참조변수)
isinstance(참조변수, 클래스)
#include <typeinfo>

typeid(참조변수).name()
지연초기화   lateinit var
val … by lazy {}
   
연산자 a?b:c : a조건이 참이면 b 반환 거짓이면 c 반환 ?. : 세이프콜
!!. : 단정기호
?: : 엘비스 연산자
is, !is : 자료형 검사
as, as? : 형변환
in : 범위 연산
.. : 범위 연산
** : 제곱 연산
in : 범위 연산
[] : 슬라이싱 가능
// : 정수형으로 나눗셈 계산
:: : 범위 지정 연산
*(단항) : 역참조
&(단항) : 주소
a?b:c : a조건이 참이면 b 반환 거짓이면 c 반환
<=> : 3방향 비교연산자

다른 형식의 연산자 1. |, &, ^
2. ||, &&
3. !
1. or, and, xor
2. ||, &&
3. !
1. |, &, ^
2. and, or
3. not
1. |, &, ^
2. ||, &&
3. !
다른 결과의 연산자 / : (정수만) 소수점값을 버리고 int형으로 계산
(실수 포함) 실수형으로 계산 
/ : (정수만) 소수점값을 버리고 int형으로 계산
(실수 포함) 실수형으로 계산 
+, - : 컬렉션 연산에도 사용 가능
* : 전개 연산에도 사용 가능
/ : 실수형으로 계산
* : 문자열 반복으로도 사용 가능
+, * : 리스트 연산에도 사용 가능
* : 전개 연산에도 사용 가능
/ : (정수만) 소수점값을 버리고 int형으로 계산
(실수 포함) 실수형으로 계산 
형변환 (타입)대상

1. 문자열 → 기본형
기본형.parse기본형(문자열)

2. 기본형 → 문자열
String.valueOf(기본형)
대상.to타입() 타입(대상) 타입(대상)
(타입)대상
자주 사용하는 문자열 함수 대소문자 바꾸기 : toUpperCase(), toLowerCase()
공백 제거 : trim()
문자 찾기 : indexOf() lastIndexOf()
대소문자 바꾸기 : uppercase(), lowercase()
공백 제거 : trim()
문자 찾기 : indexOf() lastIndexOf()
대소문자 바꾸기 : upper(), lower()
공백 제거 : strip()
문자 찾기 : index(), rindex(), find(), rfind()
대소문자 바꾸기 : std::toupper, std::tolower()
문자 찾기 : std::string::find
format 문자열, StringTemplate String.format("포맷 문자열", 값1, 값2, ...) "${}" f"…{표현식}…"
"{} {}".format(값1, 값2)
std::format("포맷 문자열", 값1, 값2, ...);
~ 이상(초과) ~ 이하(미만) 조건식 3 ≤ a && a ≤ 5 a in 3..5 3 ≤ a ≤ 5
a in range(3, 5 + 1)
3 ≤ a && a ≤ 5
if 문 if (조건식) {
    ...
} else if (조건식) {
    ...
} else {
    ...
}
if (조건식) {
    ...
} else if (조건식) {
    ...
} else {
    ...
}
if 조건식:
    …
elif:
    …
else:
    …
if (조건식) {
    ...
} else if (조건식) {
    ...
} else {
    ...
}
분기 조건문 switch - case 문

swtich (표현식) {
    case 값: 문장
    break;
    default:
    문장
}
when 문

when (인자) {
    값, 표현식 → 문장
}
when {
    조건, 표현식 → 문장
}
  switch - case 문

swtich (표현식) {
    case 값: 문장
    break;
    default:
    문장
}
반복문 for 문
while 문
do - while 문
for 문
while 문
do - while 문
repeat 함수
for 문
while 문
for 문
while 문
do - while 문
반복문 기본형식 for (초기화; 조건식; 증감식) {
    문장
}
for (요소변수 in 반복할 수 있는 것) {
    문장
}
for 반복자 in 반복할 수 있는 것:
    문장
for (초기화; 조건식; 증감식) {
    문장
}
반복문 이름 붙히기 LOOP1 :

break LOOP1;
LOOP1@

break@LOOP1
  LOOP1 :

break LOOP1;
입력 Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
String S = sc.nextLine();
val sc = Scanner(System.`in`)
var N = sc.nextInt()
var S = readLine()
N = int(input())

기본 자료형 : String
int N
std::cin >> N

기본 자료형 : 연결된 변수의 타입에 의해 결정
출력 System.out.println()
System.out.print()
System.out.printf()
println()
print()
printf()
print()
print(end='')

여러개의 요소를 ,로 구분하여 나열 가능 ( 공백으로 구분하여 출력됨)
std::cout << ""
배열 출력 Arrays.toString(배열) 배열.contentToString()
Arrays.toString(배열)
그냥 출력 반복문으로 출력
컨테이너 자료형의 길이 문자열 : .length()
배열 : length
컬렉션 : .size()
문자열 : length
배열 : size
컬렉션: size
len() 문자열(char[]) : strlen()
문자열(std::string) : .length(), .size()
배열(정적 배열) : sizeof(arr) / sizeof(arr[0])
STL 컨테이너 : .size()
배열 int[] array = {1, 2, 3};
int array[] = {1, 2, 3};
val array = arrayOf(1, 2, 3)
val array = intArrayOf(1, 2, 3)
val array = Array(3, {i → i + 1})
array = [1, 2, 3] 1. 정적 배열
int array[크기] = {};

2. 동적 배열
int* array = new int[크기];
배열 오름차순 정렬 Arrays.sort(array) array.sort()
Arrays.sort(array)
array.sort() std::sort(array, array + 크기);
배열 내림차순 정렬 Arrays.sort(array, Collections.reverseOrder()); array.sortDescending() array.sort(reverse=True) std::sort(array, array + 크기, greater<자료형>());
리스트 ArrayList arrayList = new ArrayList<>(); val arrayList = arrayListOf(1, 2, 3) list = [1, 2, 3] #include <vector>
std::vector<int> vec;

리스트 정렬 Collections.sort(arrayList) arrayList.sort() list.sort() #include <vector>
#include <algorithm>

std::sort(vec.begin(), vec.end());
리스트 뒤집기 Collections.reverse(arrayList); arrayList.reverse() list.reverse() #include <vector>
#include <algorithm>

std::reverse(vec.begin(), vec.end());
세트 HashSet hashSet = new HashSet<>(); val hashSet = HashSet<Any>() set = {} #include <set>

std::set<int> mySet;
std::multiset<int> myMultiset;

// multi : 중복된 값 포함
맵, 딕셔너리 HashMap hashMap = new HashMap<>(); al hashMap = java.util.HashMap<Any, Any>() dic = { ”name” : “hi” } #include <map>

std::map<stirng, int> myMap;
std::multimap<stirng, int> myMultiMap

// multi : 같은 키에 다른 값 저장 가능
튜플   Pair와 Triple이 존재하긴 하지만,
일반적으로 데이터 클래스를 대신 사용하는 편임.
tuple = ()

// 한 번 결정된 요소는 바꿀 수 없음 괄호 생략 가능
tuple<자료형1, ..., 자료형n> 튜플_이름;

// 크기가 고정되어 있으며, 여러가지 데이터 형식을 담을 수 있음.
불변형 / 가변형 컬렉션 구분   List / MutableList
Set / MutableSet
Map / MutableMap
   
함수 문법 제어자 반환타입 함수명(매개변수타입 매개변수명, … ) {
    문장
}
fun 함수명(매개변수명: 매개변수 타입, ... ): 반환타입 {
    문장
}
def 함수명 (매개변수명, … ):
    문장
1. 선언
반환타입 함수명( 매개변수 타입 매개변수명, ...) 

2. 정의
반환타입 네임스페이스or클래스::함수명( 매개변수 타입 매개변수명, ...) {
    문장
}
함수 선언, 정의와 호출 순서 무관 무관 호출 전에 정의되어야 함 호출 전에 선언되거나 정의되어야 함
반환값이 없을 때 반환타입 void
아무것도 반환하지 않음
Unit
Unit 객체를 반환함
None
None 객체를 반환함
void
아무것도 반환하지 않음
가변 매개변수 타입... 매개변수명

(타입[] 으로 처리됨)
vararg 매개변수명: 타입

(타입Array 로 처리됨)
*매개변수명  #include <cstdarg>
...

(va_list 로 처리됨)
람다식 ( 매개변수타입 매개변수) -> { 문장 } val(var) 변수명: (매개변수명: 매개변수타입)  -> 반환타입 = {매개변수: 매개변수타입 -> 문장 } lambda 매개변수 : 리턴값

- 반드시 리턴
- 한 줄만 가능
[선언부 변수 캡처] (매개변수) -> 반환타입 {
    문장
}
다양한 함수   익명 함수 : 람다식과 유사하나 제어문등을 사용하기 위함
인라인 함수 : 람다식 매개변수가 있을 때 사용, 함수 본문의 내용을 함수 호출 장소에 붙여 넣어 자원 사용량을 줄임
확장 함수 : 필요로 하는 대상(클래스 등)에 함수 추가
중위 함수 : 함수를 연산자처럼 사용할 수 있게 함
  프렌드 함수 : 접근이 제한된 멤버를 사용할 수 있도록 허용된 함수
가상 함수 : 오버라이딩 한 멤버가 다형성에 맞게 호출되도록 하는 함수
스코프 함수   let()
also()
apply()
run()
with()
use()
   
다양한 클래스 abstract class
instance class
static class
enum

: instance class 와 static class는 키워드 없이 클래스 안에 클래스 선언한 것을 지칭함
abstract class
inner class
nested class
enum class
data class
sealed class

: nested class 는 키워드 없이 클래스 안에 클래스 선언한 것을 지칭함
  friend class
상속 class 클래스 extends 상위클래스 {}

class 클래스 implements 인터페이스 {}
class 클래스 : 상위클래스() {}

class 클래스 : 인터페이스 {}
class 클래스(상위클래스): class 클래스 : 접근제어자 상위클래스 {};
다중 상속 가능 여부 X X O O
생성자 class 클래스명 {
    클래스명() {}
}
class 클래스명 (매개변수) { // 주 생성자

    constructor(매개변수) { // 부 생성자
    }

}
class 클래스명:
    def __init__(self, 매개변수):
class 클래스 {
    접근제어자:
        클래스명(매개변수) : 초기화목록 {
    }
};
초기화 블록 {}
static{}
init{}    
다양한 객체 <익명 객체>
new 상위클래스명() {...}
new 인터페이스명() {...}
<컴패니언 객체(이름 x, 싱글톤 o)>
companion object {
    프로퍼티
    메서드
}

: 자바의 static 멤버

<object 선언(이름 o, 싱글톤 o)>
object 객체이름 {
    프로퍼티
    메서드
}


<object 표현식(이름 x, 싱글톤 x)>
object: 상위클래스명(){…}
object: 인터페이스명 {…}
object {}
: 자바의 익명 객체
   
제어자 클래스)
기본 상속 가능
제한 : final

변수)
default : 같은 패키지 내에서 사용 가능

private
default
pretected
public
클래스)
기본 상속 불가
제한 해제 : open

변수) public : 어디에서나 사용 가능

private
protected
internal
public
  private
protected
public
예외 처리 try {
    …
} catch (예외클래스 참조변수) {      …
} finally {
    …
}
try {
    …
} catch (예외클래스 참조변수) {      …
} finally {
    …
}
try:
    …
except:
    …
else:
    …
finally:
    …
try {
    ...
} catch (예외형식 예외이름) {
    ...
}
코드 실행 시간 long start System.currentTimeMillis();
// 측정하고 싶은 코드
long end System.currentTimeMillis();

long duration end start;

ms단위 
import kotlin.system.measureTimeMillis

val time = measureTimeMillis {
    // 측정하고 싶은 코드
}

ms단위
import time

start = time.time()
# 측정하고 싶은 코드
end = time.time()

duration = end - start

s단위
#include <chrono>
using namespace chrono;


auto start = high_resolution_clock::now();
// 측정하고 싶은 코드
auto end = high_resolution_clock::now();
auto duration = duration_cast<milliseconds>(end - start);

ms단위