λ€μν νλ«νΌκ³Ό μν€ν μ²μμ κ²¬κ³ ν μ ν리μΌμ΄μ μ ꡬμΆνλ μννΈμ¨μ΄ κ°λ°μλ₯Ό μν λ©λͺ¨λ¦¬ νλ‘νμΌλ§ λ° λμ νμ§ κΈ°μ μ μ’ ν© κ°μ΄λ. λ©λͺ¨λ¦¬ λμλ₯Ό μλ³, μ§λ¨ λ° ν΄κ²°νμ¬ μ±λ₯κ³Ό μμ μ±μ μ΅μ ννλ λ°©λ²μ λ°°μλλ€.
λ©λͺ¨λ¦¬ νλ‘νμΌλ§: μ μ μ ν리μΌμ΄μ μ λμ νμ§λ₯Ό μν μ¬μΈ΅ λΆμ
λ©λͺ¨λ¦¬ λμλ μννΈμ¨μ΄ κ°λ°μμ μ ν리μΌμ΄μ μμ μ±, μ±λ₯ λ° νμ₯μ±μ μν₯μ λ―ΈμΉλ λ§μ°ν λ¬Έμ μ λλ€. μ ν리μΌμ΄μ μ΄ λ€μν νλ«νΌκ³Ό μν€ν μ²μ λ°°ν¬λλ μΈκ³νλ νκ²½μμ λ©λͺ¨λ¦¬ λμλ₯Ό μ΄ν΄νκ³ ν¨κ³Όμ μΌλ‘ ν΄κ²°νλ κ²μ λ§€μ° μ€μν©λλ€. μ΄ μ’ ν© κ°μ΄λλ λ©λͺ¨λ¦¬ νλ‘νμΌλ§ λ° λμ νμ§μ μΈκ³λ₯Ό μ¬μΈ΅μ μΌλ‘ λ€λ£¨λ©°, κ°λ°μμκ² κ²¬κ³ νκ³ ν¨μ¨μ μΈ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° νμν μ§μκ³Ό λꡬλ₯Ό μ 곡ν©λλ€.
λ©λͺ¨λ¦¬ νλ‘νμΌλ§μ΄λ?
λ©λͺ¨λ¦¬ νλ‘νμΌλ§μ μκ° κ²½κ³Όμ λ°λ₯Έ μ ν리μΌμ΄μ μ λ©λͺ¨λ¦¬ μ¬μ©λμ λͺ¨λν°λ§νκ³ λΆμνλ κ³Όμ μ λλ€. μ΄λ λ©λͺ¨λ¦¬ ν λΉ, ν λΉ ν΄μ λ° κ°λΉμ§ 컬λ μ νλμ μΆμ νμ¬ λ©λͺ¨λ¦¬ λμ, κ³Όλν λ©λͺ¨λ¦¬ μλΉ, λΉν¨μ¨μ μΈ λ©λͺ¨λ¦¬ κ΄λ¦¬ κ΄νκ³Ό κ°μ μ μ¬μ μΈ λ©λͺ¨λ¦¬ κ΄λ ¨ λ¬Έμ λ₯Ό μλ³νλ κ²μ ν¬ν¨ν©λλ€. λ©λͺ¨λ¦¬ νλ‘νμΌλ¬λ μ ν리μΌμ΄μ μ΄ λ©λͺ¨λ¦¬ 리μμ€λ₯Ό νμ©νλ λ°©λ²μ λν κ·μ€ν ν΅μ°°λ ₯μ μ 곡νμ¬ κ°λ°μκ° μ±λ₯μ μ΅μ ννκ³ λ©λͺ¨λ¦¬ κ΄λ ¨ λ¬Έμ λ₯Ό μλ°©ν μ μλλ‘ ν©λλ€.
λ©λͺ¨λ¦¬ νλ‘νμΌλ§μ ν΅μ¬ κ°λ
- ν (Heap): νμ νλ‘κ·Έλ¨ μ€ν μ€ λμ λ©λͺ¨λ¦¬ ν λΉμ μ¬μ©λλ λ©λͺ¨λ¦¬ μμμ λλ€. κ°μ²΄μ λ°μ΄ν° ꡬ쑰λ μΌλ°μ μΌλ‘ νμ ν λΉλ©λλ€.
- κ°λΉμ§ 컬λ μ (Garbage Collection): κ°λΉμ§ 컬λ μ μ λ μ΄μ μ¬μ©λμ§ μλ κ°μ²΄κ° μ°¨μ§νλ λ©λͺ¨λ¦¬λ₯Ό νμνκΈ° μν΄ λ§μ νλ‘κ·Έλλ° μΈμ΄(μ: Java, .NET, Python)μμ μ¬μ©λλ μλ λ©λͺ¨λ¦¬ κ΄λ¦¬ κΈ°μ μ λλ€.
- λ©λͺ¨λ¦¬ λμ (Memory Leak): λ©λͺ¨λ¦¬ λμλ μ ν리μΌμ΄μ μ΄ ν λΉλ λ©λͺ¨λ¦¬λ₯Ό ν΄μ νμ§ λͺ»νμ¬ μκ°μ΄ μ§λ¨μ λ°λΌ λ©λͺ¨λ¦¬ μλΉκ° μ μ§μ μΌλ‘ μ¦κ°νλ νμμ λλ€. μ΄λ κ²°κ΅ μ ν리μΌμ΄μ μΆ©λ λλ μλ΅ μμ μνλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- λ©λͺ¨λ¦¬ λ¨νΈν (Memory Fragmentation): λ©λͺ¨λ¦¬ λ¨νΈνλ νμ΄ μκ³ μ°μμ μ΄μ§ μμ μ¬μ© κ°λ₯ν λ©λͺ¨λ¦¬ λΈλ‘μΌλ‘ λΆν λμ΄ λ ν° λ©λͺ¨λ¦¬ λΈλ‘μ ν λΉνκΈ° μ΄λ ΅κ² λλ νμμ λλ€.
λ©λͺ¨λ¦¬ λμμ μν₯
λ©λͺ¨λ¦¬ λμλ μ ν리μΌμ΄μ μ±λ₯κ³Ό μμ μ±μ μ¬κ°ν κ²°κ³Όλ₯Ό μ΄λν μ μμ΅λλ€. μ£Όμ μν₯μ λ€μκ³Ό κ°μ΅λλ€.
- μ±λ₯ μ ν: λ©λͺ¨λ¦¬ λμλ μ ν리μΌμ΄μ μ΄ μ μ λ λ§μ λ©λͺ¨λ¦¬λ₯Ό μλΉν¨μ λ°λΌ μ μ§μ μΈ μλ μ νλ‘ μ΄μ΄μ§ μ μμ΅λλ€. μ΄λ μ¬μ©μ κ²½ν μ ν λ° ν¨μ¨μ± κ°μλ₯Ό μ΄λν μ μμ΅λλ€.
- μ ν리μΌμ΄μ μΆ©λ: λ©λͺ¨λ¦¬ λμκ° μ¬κ°ν κ²½μ°, μ¬μ© κ°λ₯ν λ©λͺ¨λ¦¬λ₯Ό κ³ κ°μμΌ μ ν리μΌμ΄μ μΆ©λμ μ λ°ν μ μμ΅λλ€.
- μμ€ν λΆμμ μ±: κ·Ήλ¨μ μΈ κ²½μ°, λ©λͺ¨λ¦¬ λμλ μ 체 μμ€ν μ λΆμμ νκ² λ§λ€κ³ μΆ©λ λ° κΈ°ν λ¬Έμ λ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- 리μμ€ μλΉ μ¦κ°: λ©λͺ¨λ¦¬ λμκ° μλ μ ν리μΌμ΄μ μ νμ μ΄μμΌλ‘ λ§μ λ©λͺ¨λ¦¬λ₯Ό μλΉνμ¬ λ¦¬μμ€ μλΉ μ¦κ° λ° μ΄μ λΉμ© μμΉμΌλ‘ μ΄μ΄μ§λλ€. μ΄λ 리μμ€κ° μ¬μ©λμ λ°λΌ μ²κ΅¬λλ ν΄λΌμ°λ κΈ°λ° νκ²½μμ νΉν μ€μν©λλ€.
- 보μ μ·¨μ½μ : νΉμ μ νμ λ©λͺ¨λ¦¬ λμλ λ²νΌ μ€λ²νλ‘μ κ°μ 보μ μ·¨μ½μ μ μμ±νμ¬ κ³΅κ²©μμκ² μ μ©λ μ μμ΅λλ€.
λ©λͺ¨λ¦¬ λμμ μΌλ°μ μΈ μμΈ
λ©λͺ¨λ¦¬ λμλ λ€μν νλ‘κ·Έλλ° μ€λ₯ λ° μ€κ³ κ²°ν¨μΌλ‘ μΈν΄ λ°μν μ μμ΅λλ€. λͺ κ°μ§ μΌλ°μ μΈ μμΈμ λ€μκ³Ό κ°μ΅λλ€.
- ν΄μ λμ§ μμ 리μμ€: λ μ΄μ νμνμ§ μμ λ ν λΉλ λ©λͺ¨λ¦¬λ₯Ό ν΄μ νμ§ λͺ»νλ κ²½μ°. μ΄λ λ©λͺ¨λ¦¬ κ΄λ¦¬κ° μλμΌλ‘ μ΄λ£¨μ΄μ§λ C λ° C++μ κ°μ μΈμ΄μμ νν λ¬Έμ μ λλ€.
- μν μ°Έμ‘°: κ°μ²΄ κ°μ μν μ°Έμ‘°λ₯Ό μμ±νμ¬ κ°λΉμ§ 컬λ ν°κ° μ΄λ₯Ό νμνμ§ λͺ»νκ² νλ κ²½μ°. μ΄λ Pythonκ³Ό κ°μ κ°λΉμ§ 컬λ μ μΈμ΄μμ νν©λλ€. μλ₯Ό λ€μ΄, κ°μ²΄ Aκ° κ°μ²΄ Bμ λν μ°Έμ‘°λ₯Ό κ°μ§κ³ μκ³ , κ°μ²΄ Bκ° κ°μ²΄ Aμ λν μ°Έμ‘°λ₯Ό κ°μ§κ³ μμΌλ©°, A λλ Bμ λν λ€λ₯Έ μ°Έμ‘°κ° μ‘΄μ¬νμ§ μλ κ²½μ°, μ΄λ€μ κ°λΉμ§ 컬λ μ λμ§ μμ΅λλ€.
- μ΄λ²€νΈ 리μ€λ: λ μ΄μ νμνμ§ μμ λ μ΄λ²€νΈ 리μ€λ λ±λ‘μ ν΄μ νλ κ²μ μλ κ²½μ°. μ΄λ‘ μΈν΄ κ°μ²΄κ° λ μ΄μ νλ°νκ² μ¬μ©λμ§ μλλΌλ κ³μ μ΄μ μμ μ μμ΅λλ€. JavaScript νλ μμν¬λ₯Ό μ¬μ©νλ μΉ μ ν리μΌμ΄μ μ μ’ μ’ μ΄ λ¬Έμ μ μ§λ©΄ν©λλ€.
- μΊμ±: μ μ ν λ§λ£ μ μ± μμ΄ μΊμ± λ©μ»€λμ¦μ ꡬννλ©΄ μΊμκ° λ¬΄νμ μ»€μ§ κ²½μ° λ©λͺ¨λ¦¬ λμλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- μ μ λ³μ: μ μ λ³μλ μ ν리μΌμ΄μ μ μλͺ μ£ΌκΈ° λμ μ§μλλ―λ‘, μ μ ν μ λ¦¬κ° μμ΄ λ§μ μμ λ°μ΄ν°λ₯Ό μ μ₯νλ λ° μ¬μ©νλ©΄ λ©λͺ¨λ¦¬ λμλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- λ°μ΄ν°λ² μ΄μ€ μ°κ²°: μ¬μ© ν λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ μ λλ‘ λ«μ§ λͺ»νλ©΄ λ©λͺ¨λ¦¬ λμλ₯Ό ν¬ν¨ν 리μμ€ λμλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
λ©λͺ¨λ¦¬ νλ‘νμΌλ§ λꡬ λ° κΈ°μ
κ°λ°μκ° λ©λͺ¨λ¦¬ λμλ₯Ό μλ³νκ³ μ§λ¨νλ λ° λμμ΄ λλ μ¬λ¬ λꡬμ κΈ°μ μ΄ μμ΅λλ€. λͺ κ°μ§ μΈκΈ° μλ μ΅μ μ λ€μκ³Ό κ°μ΅λλ€.
νλ«νΌλ³ λꡬ
- Java VisualVM: JVMμ λμ(λ©λͺ¨λ¦¬ μ¬μ©λ, κ°λΉμ§ 컬λ μ νλ, μ€λ λ νλ λ±)μ λν ν΅μ°°λ ₯μ μ 곡νλ μκ°μ λꡬμ λλ€. VisualVMμ Java μ ν리μΌμ΄μ μ λΆμνκ³ λ©λͺ¨λ¦¬ λμλ₯Ό μλ³νλ κ°λ ₯ν λꡬμ λλ€.
- .NET Memory Profiler: .NET μ ν리μΌμ΄μ μ μ© λ©λͺ¨λ¦¬ νλ‘νμΌλ¬μ λλ€. κ°λ°μκ° .NET νμ κ²μ¬νκ³ , κ°μ²΄ ν λΉμ μΆμ νλ©°, λ©λͺ¨λ¦¬ λμλ₯Ό μλ³ν μ μλλ‘ ν©λλ€. Red Gate ANTS Memory Profilerλ .NET λ©λͺ¨λ¦¬ νλ‘νμΌλ¬μ μμ μ μμμ λλ€.
- Valgrind (C/C++): C/C++ μ ν리μΌμ΄μ μ μν κ°λ ₯ν λ©λͺ¨λ¦¬ λλ²κΉ λ° νλ‘νμΌλ§ λꡬμ λλ€. Valgrindλ λ©λͺ¨λ¦¬ λμ, μλͺ»λ λ©λͺ¨λ¦¬ μ κ·Ό, μ΄κΈ°νλμ§ μμ λ©λͺ¨λ¦¬ μ¬μ©μ ν¬ν¨ν κ΄λ²μν λ©λͺ¨λ¦¬ μ€λ₯λ₯Ό νμ§ν μ μμ΅λλ€.
- Instruments (macOS/iOS): Xcodeμ ν¬ν¨λ μ±λ₯ λΆμ λꡬμ λλ€. Instrumentsλ macOS λ° iOS μ₯μΉμμ λ©λͺ¨λ¦¬ μ¬μ©λμ νλ‘νμΌλ§νκ³ , λ©λͺ¨λ¦¬ λμλ₯Ό μλ³νλ©°, μ ν리μΌμ΄μ μ±λ₯μ λΆμνλ λ° μ¬μ©λ μ μμ΅λλ€.
- Android Studio Profiler: Android μ ν리μΌμ΄μ μ CPU, λ©λͺ¨λ¦¬, λ€νΈμν¬ μ¬μ©λμ λͺ¨λν°λ§ν μ μλ Android Studio λ΄μ₯ νλ‘νμΌλ§ λꡬμ λλ€.
μΈμ΄λ³ λꡬ
- memory_profiler (Python): Python ν¨μ λ° μ½λ λΌμΈμ λ©λͺ¨λ¦¬ μ¬μ©λμ νλ‘νμΌλ§ν μ μλ Python λΌμ΄λΈλ¬λ¦¬μ λλ€. IPython λ° Jupyter λ ΈνΈλΆκ³Ό μ ν΅ν©λμ΄ λνν λΆμμ΄ κ°λ₯ν©λλ€.
- heaptrack (C++): κ°λ³ λ©λͺ¨λ¦¬ ν λΉ λ° ν λΉ ν΄μ μΆμ μ μ€μ μ λ C++ μ ν리μΌμ΄μ μ© ν λ©λͺ¨λ¦¬ νλ‘νμΌλ¬μ λλ€.
μΌλ°μ μΈ νλ‘νμΌλ§ κΈ°μ
- ν λ€ν (Heap Dumps): νΉμ μμ μ μ ν리μΌμ΄μ ν λ©λͺ¨λ¦¬ μ€λ μ·μ λλ€. ν λ€νλ₯Ό λΆμνμ¬ κ³Όλν λ©λͺ¨λ¦¬λ₯Ό μλΉνκ±°λ μ λλ‘ κ°λΉμ§ 컬λ μ λμ§ μλ κ°μ²΄λ₯Ό μλ³ν μ μμ΅λλ€.
- ν λΉ μΆμ (Allocation Tracking): μκ° κ²½κ³Όμ λ°λ₯Έ λ©λͺ¨λ¦¬ ν λΉ λ° ν λΉ ν΄μ λ₯Ό λͺ¨λν°λ§νμ¬ λ©λͺ¨λ¦¬ μ¬μ© ν¨ν΄ λ° μ μ¬μ μΈ λ©λͺ¨λ¦¬ λμλ₯Ό μλ³ν©λλ€.
- κ°λΉμ§ 컬λ μ λΆμ (Garbage Collection Analysis): κ°λΉμ§ 컬λ μ λ‘κ·Έλ₯Ό λΆμνμ¬ κΈ΄ κ°λΉμ§ 컬λ μ μΌμ μ μ§ λλ λΉν¨μ¨μ μΈ κ°λΉμ§ 컬λ μ μ£ΌκΈ°μ κ°μ λ¬Έμ λ₯Ό μλ³ν©λλ€.
- κ°μ²΄ μ μ§ λΆμ (Object Retention Analysis): κ°μ²΄κ° λ©λͺ¨λ¦¬μ μ μ§λμ΄ κ°λΉμ§ 컬λ μ λμ§ λͺ»νλ κ·Όλ³Έ μμΈμ μλ³ν©λλ€.
λ©λͺ¨λ¦¬ λμ νμ§μ μ€μ μμ
λ€μν νλ‘κ·Έλλ° μΈμ΄μ μμλ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬ λμ νμ§λ₯Ό μ€λͺ ν΄ λ³΄κ² μ΅λλ€.
μμ 1: C++ λ©λͺ¨λ¦¬ λμ
C++μμλ λ©λͺ¨λ¦¬ κ΄λ¦¬κ° μλμΌλ‘ μ΄λ£¨μ΄μ§λ―λ‘ λ©λͺ¨λ¦¬ λμμ μ·¨μ½ν©λλ€.
#include <iostream>
void leakyFunction() {
int* data = new int[1000]; // Allocate memory on the heap
// ... do some work with 'data' ...
// Missing: delete[] data; // Important: Release the allocated memory
}
int main() {
for (int i = 0; i < 10000; ++i) {
leakyFunction(); // Call the leaky function repeatedly
}
return 0;
}
μ΄ C++ μ½λ μμλ leakyFunction λ΄μμ new int[1000]μ μ¬μ©νμ¬ λ©λͺ¨λ¦¬λ₯Ό ν λΉνμ§λ§, delete[] dataλ₯Ό μ¬μ©νμ¬ λ©λͺ¨λ¦¬λ₯Ό ν λΉ ν΄μ νλ λ° μ€ν¨ν©λλ€. κ²°κ³Όμ μΌλ‘ leakyFunctionμ λν κ° νΈμΆμ λ©λͺ¨λ¦¬ λμλ₯Ό μ΄λν©λλ€. μ΄ νλ‘κ·Έλ¨μ λ°λ³΅μ μΌλ‘ μ€ννλ©΄ μκ°μ΄ μ§λ¨μ λ°λΌ λ©λͺ¨λ¦¬ μλΉλμ΄ μ¦κ°ν κ²μ
λλ€. Valgrindμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ μ΄ λ¬Έμ λ₯Ό μλ³ν μ μμ΅λλ€.
valgrind --leak-check=full ./leaky_program
Valgrindλ ν λΉλ λ©λͺ¨λ¦¬κ° ν΄μ λμ§ μμκΈ° λλ¬Έμ λ©λͺ¨λ¦¬ λμλ₯Ό λ³΄κ³ ν κ²μ λλ€.
μμ 2: Python μν μ°Έμ‘°
Pythonμ κ°λΉμ§ 컬λ μ μ μ¬μ©νμ§λ§, μν μ°Έμ‘°λ μ¬μ ν λ©λͺ¨λ¦¬ λμλ₯Ό μ λ°ν μ μμ΅λλ€.
import gc
class Node:
def __init__(self, data):
self.data = data
self.next = None
# Create a circular reference
node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1
# Delete the references
del node1
del node2
# Run garbage collection (may not always collect circular references immediately)
gc.collect()
μ΄ Python μμμμ node1κ³Ό node2λ μν μ°Έμ‘°λ₯Ό μμ±ν©λλ€. node1κ³Ό node2λ₯Ό μμ ν νμλ κ°λΉμ§ 컬λ ν°κ° μν μ°Έμ‘°λ₯Ό μ¦μ κ°μ§νμ§ λͺ»ν μ μμΌλ―λ‘ κ°μ²΄κ° μ¦μ κ°λΉμ§ 컬λ μ
λμ§ μμ μ μμ΅λλ€. objgraphμ κ°μ λꡬλ μ΄λ¬ν μν μ°Έμ‘°λ₯Ό μκ°ννλ λ° λμμ΄ λ μ μμ΅λλ€.
import objgraph
objgraph.show_backrefs([node1], filename='circular_reference.png') # This will raise an error as node1 is deleted, but demonstrate the usage
μ€μ μλ리μ€μμλ μμ¬μ€λ¬μ΄ μ½λλ₯Ό μ€ννκΈ° μ νμ objgraph.show_most_common_types()λ₯Ό μ€ννμ¬ Node κ°μ²΄ μκ° μμμΉ μκ² μ¦κ°νλμ§ νμΈν μ μμ΅λλ€.
μμ 3: JavaScript μ΄λ²€νΈ 리μ€λ λμ
JavaScript νλ μμν¬λ μ’ μ’ μ΄λ²€νΈ 리μ€λλ₯Ό μ¬μ©νλλ°, μ΄λ₯Ό μ λλ‘ μ κ±°νμ§ μμΌλ©΄ λ©λͺ¨λ¦¬ λμλ₯Ό μ λ°ν μ μμ΅λλ€.
<button id=\"myButton\">Click Me</button>
<script>
const button = document.getElementById('myButton');
let data = [];
function handleClick() {
data.push(new Array(1000000).fill(1)); // Allocate a large array
console.log('Clicked!');
}
button.addEventListener('click', handleClick);
// Missing: button.removeEventListener('click', handleClick); // Remove the listener when it's no longer needed
//Even if button is removed from the DOM, the event listener will keep handleClick and the 'data' array in memory if not removed.
</script>
μ΄ JavaScript μμμμ μ΄λ²€νΈ 리μ€λκ° λ²νΌ μμμ μΆκ°λμ§λ§, κ²°μ½ μ κ±°λμ§ μμ΅λλ€. λ²νΌμ ν΄λ¦ν λλ§λ€ λκ·λͺ¨ λ°°μ΄μ΄ ν λΉλμ΄ `data` λ°°μ΄μ νΈμλλ©°, `data` λ°°μ΄μ΄ κ³μ 컀μ§λ©΄μ λ©λͺ¨λ¦¬ λμκ° λ°μν©λλ€. Chrome κ°λ°μ λꡬ λλ λ€λ₯Έ λΈλΌμ°μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ λ©λͺ¨λ¦¬ μ¬μ©λμ λͺ¨λν°λ§νκ³ μ΄ λμλ₯Ό μλ³ν μ μμ΅λλ€. λ©λͺ¨λ¦¬ ν¨λμ "ν μ€λ μ· μ°κΈ°" κΈ°λ₯μ μ¬μ©νμ¬ κ°μ²΄ ν λΉμ μΆμ νμμμ€.
λ©λͺ¨λ¦¬ λμ λ°©μ§λ₯Ό μν λͺ¨λ² μ¬λ‘
λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ €λ©΄ μ¬μ μλ°©μ μΈ μ κ·Ό λ°©μκ³Ό λͺ¨λ² μ¬λ‘ μ€μκ° νμν©λλ€. λͺ κ°μ§ μ£Όμ κΆμ₯ μ¬νμ λ€μκ³Ό κ°μ΅λλ€.
- μ€λ§νΈ ν¬μΈν° μ¬μ© (C++): μ€λ§νΈ ν¬μΈν°λ λ©λͺ¨λ¦¬ ν λΉ λ° ν λΉ ν΄μ λ₯Ό μλμΌλ‘ κ΄λ¦¬νμ¬ λ©λͺ¨λ¦¬ λμ μνμ μ€μ λλ€.
- μν μ°Έμ‘° λ°©μ§: μν μ°Έμ‘°λ₯Ό νΌνλλ‘ λ°μ΄ν° ꡬ쑰λ₯Ό μ€κ³νκ±°λ, μ½ν μ°Έμ‘°λ₯Ό μ¬μ©νμ¬ μνμ λμΌμμμ€.
- μ΄λ²€νΈ 리μ€λ μ μ ν κ΄λ¦¬: λ μ΄μ νμνμ§ μμ λ μ΄λ²€νΈ 리μ€λ λ±λ‘μ ν΄μ νμ¬ κ°μ²΄κ° λΆνμνκ² μ μ§λλ κ²μ λ°©μ§ν©λλ€.
- λ§λ£ μ μ± μ΄ μλ μΊμ± ꡬν: μΊμκ° λ¬΄νμ 컀μ§λ κ²μ λ°©μ§νκΈ° μν΄ μ μ ν λ§λ£ μ μ± μ΄ μλ μΊμ± λ©μ»€λμ¦μ ꡬνν©λλ€.
- 리μμ€ μ¦μ λ«κΈ°: λ°μ΄ν°λ² μ΄μ€ μ°κ²°, νμΌ νΈλ€, λ€νΈμν¬ μμΌκ³Ό κ°μ 리μμ€κ° μ¬μ© ν μ¦μ λ«νλλ‘ ν©λλ€.
- λ©λͺ¨λ¦¬ νλ‘νμΌλ§ λꡬ μ κΈ°μ μΌλ‘ μ¬μ©: κ°λ° μν¬νλ‘μ°μ λ©λͺ¨λ¦¬ νλ‘νμΌλ§ λꡬλ₯Ό ν΅ν©νμ¬ λ©λͺ¨λ¦¬ λμλ₯Ό μ¬μ μ μλ³νκ³ ν΄κ²°ν©λλ€.
- μ½λ κ²ν : μ μ¬μ μΈ λ©λͺ¨λ¦¬ κ΄λ¦¬ λ¬Έμ λ₯Ό μλ³νκΈ° μν΄ μ² μ ν μ½λ κ²ν λ₯Ό μνν©λλ€.
- μλνλ ν μ€νΈ: κ°λ° μ£ΌκΈ° μ΄κΈ°μ λμλ₯Ό νμ§νκΈ° μν΄ λ©λͺ¨λ¦¬ μ¬μ©λμ νΉλ³ν λͺ©νλ‘ νλ μλνλ ν μ€νΈλ₯Ό μμ±ν©λλ€.
- μ μ λΆμ: μ½λμμ μ μ¬μ μΈ λ©λͺ¨λ¦¬ κ΄λ¦¬ μ€λ₯λ₯Ό μλ³νκΈ° μν΄ μ μ λΆμ λꡬλ₯Ό νμ©ν©λλ€.
μ μ νκ²½μμμ λ©λͺ¨λ¦¬ νλ‘νμΌλ§
μ μΈκ³ μ¬μ©μλ₯Ό μν μ ν리μΌμ΄μ μ κ°λ°ν λλ λ€μ λ©λͺ¨λ¦¬ κ΄λ ¨ μμλ₯Ό κ³ λ €νμμμ€.
- λ€μν μ₯μΉ: μ ν리μΌμ΄μ μ λ€μν λ©λͺ¨λ¦¬ μ©λμ κ°μ§ κ΄λ²μν μ₯μΉμ λ°°ν¬λ μ μμ΅λλ€. μ νλ 리μμ€λ₯Ό κ°μ§ μ₯μΉμμ μ΅μ μ μ±λ₯μ 보μ₯νκΈ° μν΄ λ©λͺ¨λ¦¬ μ¬μ©λμ μ΅μ ννμμμ€. μλ₯Ό λ€μ΄, μ ν₯ μμ₯μ λμμΌλ‘ νλ μ ν리μΌμ΄μ μ μ μ¬μ μ₯μΉμ λν΄ κ³ λλ‘ μ΅μ νλμ΄μΌ ν©λλ€.
- μ΄μ 체μ : λ€μν μ΄μ 체μ λ μλ‘ λ€λ₯Έ λ©λͺ¨λ¦¬ κ΄λ¦¬ μ λ΅κ³Ό μ νμ κ°μ§κ³ μμ΅λλ€. μ μ¬μ μΈ λ©λͺ¨λ¦¬ κ΄λ ¨ λ¬Έμ λ₯Ό μλ³νκΈ° μν΄ μ¬λ¬ μ΄μ 체μ μμ μ ν리μΌμ΄μ μ ν μ€νΈνμμμ€.
- κ°μν λ° μ»¨ν μ΄λν: κ°μν(μ: VMware, Hyper-V) λλ 컨ν μ΄λν(μ: Docker, Kubernetes)λ₯Ό μ¬μ©νλ ν΄λΌμ°λ λ°°ν¬λ 볡μ‘μ±μ ν μΈ΅ λν©λλ€. νλ«νΌμ΄ λΆκ³Όνλ 리μμ€ μ νμ μ΄ν΄νκ³ κ·Έμ λ°λΌ μ ν리μΌμ΄μ μ λ©λͺ¨λ¦¬ μ¬μ©λμ μ΅μ ννμμμ€.
- κ΅μ ν (i18n) λ° νμ§ν (l10n): λ€λ₯Έ λ¬Έμ μ§ν© λ° μΈμ΄λ₯Ό μ²λ¦¬νλ κ²μ΄ λ©λͺ¨λ¦¬ μ¬μ©λμ μν₯μ λ―ΈμΉ μ μμ΅λλ€. μ ν리μΌμ΄μ μ΄ κ΅μ νλ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ μ²λ¦¬νλλ‘ μ€κ³λμλμ§ νμΈνμμμ€. μλ₯Ό λ€μ΄, UTF-8 μΈμ½λ©μ νΉμ μΈμ΄μ κ²½μ° ASCIIλ³΄λ€ λ λ§μ λ©λͺ¨λ¦¬λ₯Ό μꡬν μ μμ΅λλ€.
κ²°λ‘
λ©λͺ¨λ¦¬ νλ‘νμΌλ§ λ° λμ νμ§λ μννΈμ¨μ΄ κ°λ°μ μ€μν μΈ‘λ©΄μ΄λ©°, νΉν μ ν리μΌμ΄μ μ΄ λ€μν νλ«νΌκ³Ό μν€ν μ²μ λ°°ν¬λλ μ€λλ μ μΈκ³νλ νκ²½μμλ λμ± κ·Έλ μ΅λλ€. λ©λͺ¨λ¦¬ λμμ μμΈμ μ΄ν΄νκ³ , μ μ ν λ©λͺ¨λ¦¬ νλ‘νμΌλ§ λꡬλ₯Ό νμ©νλ©°, λͺ¨λ² μ¬λ‘λ₯Ό μ€μν¨μΌλ‘μ¨ κ°λ°μλ μ μΈκ³ μ¬μ©μμκ² νλ₯ν μ¬μ©μ κ²½νμ μ 곡νλ κ²¬κ³ νκ³ ν¨μ¨μ μ΄λ©° νμ₯ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€.
λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μ°μ μνλ κ²μ μΆ©λ λ° μ±λ₯ μ νλ₯Ό λ°©μ§ν λΏλ§ μλλΌ μ μΈκ³ λ°μ΄ν° μΌν°μμ λΆνμν 리μμ€ μλΉλ₯Ό μ€μμΌλ‘μ¨ νμ λ°μκ΅μ μ€μ΄λ λ° κΈ°μ¬ν©λλ€. μννΈμ¨μ΄κ° μ°λ¦¬ μΆμ λͺ¨λ μΈ‘λ©΄μ κ³μν΄μ μ€λ©°λ€λ©΄μ, ν¨μ¨μ μΈ λ©λͺ¨λ¦¬ μ¬μ©μ μ§μ κ°λ₯νκ³ μ± μκ° μλ μ ν리μΌμ΄μ μ λ§λλ λ° μ μ λ μ€μν μμκ° λκ³ μμ΅λλ€.