πΎ [CS] μ€ν μ€λ²νλ‘μ°(Stack Overflow)λ 무μμΌκΉμ?
- μ€ν μ€λ²νλ‘μ°(Stack Overflow)λ νλ‘κ·Έλ¨μ΄ μ¬μ© κ°λ₯ν μ€ν λ©λͺ¨λ¦¬(Stack Memory) μμμ μ΄κ³Όνμ¬ λ μ΄μ λ°μ΄ν°λ₯Ό μμ μ μκ² λλ νμμ λ§ν©λλ€.
- μ΄λ‘ μΈν΄ νλ‘κ·Έλ¨μ΄ λΉμ μμ μΌλ‘ μ’ λ£λκ±°λ μμ€ν μλ¬κ° λ°μνκ² λ©λλ€.
1οΈβ£ μ€ν(Stack)μ΄λ?
-
μ€ν(Stack)μ νλ‘κ·Έλ¨ μ€ν μ ν¨μ νΈμΆ, λ‘컬 λ³μ λ±μ μ μ₯νλ λ©λͺ¨λ¦¬ μμμ
λλ€.
- μ€ν(Stack)μ νμ μ μΆ(LIFO: Last In, First Out) λ°©μμΌλ‘ μλνλ©°, ν¨μκ° νΈμΆλ λλ§λ€ ν΄λΉ ν¨μμ μ 보(μ: 맀κ°λ³μ, λ‘컬 λ³μ, λ°ν μ£Όμ λ±)κ° μ€ν(Stack)μ βμμ΄κ³ (push)β, ν¨μκ° μ‘Έμλλ©΄ μ€ν(Stack)μμ βμ κ±°(pop)βλ©λλ€.
2οΈβ£ μ€ν μ€λ²νλ‘μ°(Stack Overflow)μ μμΈ.
1οΈβ£ 무ν μ¬κ· νΈμΆ(Recursive Call)
- μ€ν μ€λ²νλ‘μ°(Stack Overflow)κ° κ°μ₯ νν λ°μνλ κ²½μ°λ μ¬κ· ν¨μκ° μ’ λ£λμ§ μκ³ λ¬΄νν νΈμΆλ λμ λλ€.
- μ¬κ· ν¨μλ μκΈ° μμ μ νΈμΆνλ©΄μ λ§€λ² μλ‘μ΄ μ€ν νλ μ(Stack frame)μ μκ² λλλ°, μ’ λ£ μ‘°κ±΄ μμ΄ κ³μ νΈμΆλλ©΄ μ€νμ κ³μ μμ΄κ² λμ΄ μ€ν λ©λͺ¨λ¦¬(Stack Memory)λ₯Ό μ΄κ³Όνκ² λ©λλ€.
π μμ
public class StackOverflowExample {
public static void recursiveMethod() {
// μ¬κ· νΈμΆ - μ’
λ£ μ‘°κ±΄μ΄ μμ΄ λ¬΄ν νΈμΆλ¨
recursiveMethod();
}
public static void main(String[] args) {
recursiveMethod();
}
}
- μ μ½λμμλ
recursiveMethod()
κ° μκΈ° μμ μ κ³μν΄μ νΈμΆνκΈ° λλ¬Έμ μ€ν μ€λ²νλ‘μ°(Stack Overflow)κ° λ°μνκ² λ©λλ€.
2οΈβ£ μ§λμΉκ² κΉμ ν¨μ νΈμΆ 체μΈ.
- μ¬λ¬ ν¨μκ° μλ‘λ₯Ό νΈμΆνλ μν©μμλ μ€ν μ€λ²νλ‘μ°(Stack Overflow)κ° λ°μν μ μμ΅λλ€.
- μλ₯Ό λ€μ΄,
A()
ν¨μκ°B()
λ₯Ό νΈμΆνκ³ ,B()
κ°C()
λ₯Ό νΈμΆνκ³ , β¦ μ΄ κ³Όμ μ λ§€μ° κΉκ² λ°λ³΅νλ©΄ μ€ν λ©λͺ¨λ¦¬(Stack Memory)κ° μ΄κ³Όλ μ μμ΅λλ€.
π μ€ν λ©λͺ¨λ¦¬(Stack Memory)
νλ‘κ·Έλ¨ μ€ν μ€μ ν¨μ νΈμΆκ³Ό κ΄λ ¨λ μμ λ°μ΄ν°λ₯Ό μ μ₯νλ λ©λͺ¨λ¦¬ μμμ λλ€.
μ£Όλ‘ μ§μ λ³μ, ν¨μ 맀κ°λ³μ, λ¦¬ν΄ μ£Όμ λ±μ λ°μ΄ν°λ₯Ό μ μ₯νλ©°, ν¨μκ° νΈμΆλ λλ§λ€ μλ‘μ΄ μ€ν νλ μ(Stack Frame)μ΄ μμ±λκ³ , ν¨μκ° μ’ λ£λλ©΄ ν΄λΉ μ€ν νλ μμ΄ μ κ±°λ©λλ€.μ€ν λ©λͺ¨λ¦¬(Stack Memory)λ LIFO(Last In, First Out, νμ μ μΆ) κ΅¬μ‘°λ‘ μλν©λλ€.
μ¦, λ§μ§λ§μ μ μ₯λ λ°μ΄ν°κ° λ¨Όμ μ κ±°λλ©°, ν¨μ νΈμΆμ΄ μ€μ²©λ μλ‘ μ€ν(Stack)μ κΉμ΄κ° κΉμ΄μ§λλ€
3οΈβ£ λ무 ν° λ‘컬 λ³μ ν λΉ.
- ν¨μ λ΄λΆμμ λ무 ν° ν¬κΈ°μ λ°°μ΄μ΄λ κ°μ²΄λ₯Ό λ‘컬 λ³μλ‘ μ μΈν λλ μ€ν μ€λ²νλ‘μ°(Stack Overflow)κ° λ°μν μ μμ΅λλ€.
- μ€ν(Stack)μ λ³΄ν΅ ν¬κΈ°κ° μ νλ λ©λͺ¨λ¦¬ μμμ΄κΈ° λλ¬Έμ, λ무 λ§μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ λ‘컬 λ³μλ₯Ό μ μΈνλ©΄ μ€ν λ©λͺ¨λ¦¬(Stack Memory)λ₯Ό μ΄κ³Όνκ² λ©λλ€.
3οΈβ£ μ€ν μ€λ²νλ‘μ°μ κ²°κ³Ό.
- μ€ν μ€λ²νλ‘μ°(Stack Overflow)κ° λ°μνλ©΄ νλ‘κ·Έλ¨μ΄ λΉμ μμ μΌλ‘ μ’
λ£λκ±°λ, JVM(Java Virtual Machine)μμ
StackOverflowError
μ κ°μ μλ¬κ° λ°μν©λλ€. - μ¬κ· ν¨μ νΈμΆμ΄λ κ³Όλν ν¨μ νΈμΆ 체μΈμ μ¬μ©ν λ, μ΄λ° λ¬Έμ κ° λ°μ ν μ μμμ μΈμ§νκ³ μλ°©νλ κ²μ΄ μ€μν©λλ€.
4οΈβ£ μ€ν μ€λ²νλ‘μ°(StackOverflow)λ₯Ό λ°©μ§νλ λ°©λ².
1οΈβ£ μ¬κ· ν¨μμ μ’ λ£ μ‘°κ±΄ νμΈ.
- μ¬κ· ν¨μλ₯Ό μ¬μ©ν λλ λ°λμ μ’
λ£ μ‘°κ±΄(Base case, λ² μ΄μ€ μΌμ΄μ€)μ λͺ
νν μ μν΄μΌ ν©λλ€.
- μ’ λ£ μ‘°κ±΄(Base case, λ² μ΄μ€ μΌμ΄μ€)μ΄ μλ€λ©΄ 무νν νΈμΆλκΈ° λλ¬Έμ μ€ν μ€λ²νλ‘μ°(StackOverflow)λ₯Ό μ λ°ν μ μμ΅λλ€.
π μμ
public class FactorialExample {
public static int factorial(int n) {
if (n <= 1) {
return 1; // μ’
λ£ μ‘°κ±΄: nμ΄ 1 μ΄νμΌ λ μ¬κ· νΈμΆ μ’
λ£
}
return n * factorial(n - 1);
}
public static void main(String[] args) {
System.out.println(factorial(5)); // μ μμ μΌλ‘ 120 μΆλ ₯
}
}
2οΈβ£ μ¬κ· λμ λ°λ³΅λ¬Έ μ¬μ©.
- κ°λ₯ν κ²½μ° μ¬κ· ν¨μ λμ λ°λ³΅λ¬Έ(loop)μ μ¬μ©νμ¬ μ€ν λ©λͺ¨λ¦¬(Stack Memory) μ¬μ©μ μ€μΌ μ μμ΅λλ€.
- λ°λ³΅λ¬Έ(loop)μ μ€ν λ©λͺ¨λ¦¬(Stack Memory) λμ ν λ©λͺ¨λ¦¬(Heap Memory)λ CPU λ μ§μ€ν°(CPU Register)λ₯Ό μ¬μ©νλ―λ‘, κΉμ μ¬κ· νΈμΆμ λ°λ³΅λ¬ΈμΌλ‘ λ³κ²½νλ©΄ μ€ν μ€λ²νλ‘μ°(StackOverflow)λ₯Ό λ°©μ§ν μ μμ΅λλ€.
3οΈβ£ 꼬리 μ¬κ· μ΅μ ν(Tail Recursion Optimization)
- μΌλΆ μΈμ΄λ 꼬리 μ¬κ·(tail recursion)λ₯Ό μ΅μ ννμ¬ μ¬κ· νΈμΆμ λ°λ³΅λ¬Έμ²λΌ μ²λ¦¬ν μ μμ΅λλ€.
- νμ§λ§ Javaλ κΈ°λ³Έμ μΌλ‘ 꼬리 μ¬κ·(tail recursion) μ΅μ νλ₯Ό μ§μνμ§ μκΈ° λλ¬Έμ, μ£Όμκ° νμν©λλ€.
- 꼬리 μ¬κ·(Tail Recursion)λ μ¬κ· νΈμΆμ΄ ν¨μμ λ§μ§λ§ μμ μΌλ‘ μ€νλ λ, μ»΄νμΌλ¬κ° μ€ν λ©λͺ¨λ¦¬(Stack Memory)λ₯Ό μ¬μ¬μ©νμ¬ μ€ν μ€λ²νλ‘μ°(Stack Overflow)λ₯Ό λ°©μ§νλ λ°©μμ λλ€.
π 꼬리 μ¬κ·(Tail Recursion)
μ¬κ· ν¨μμ ν ννλ‘, ν¨μμ λ§μ§λ§(꼬리) λμμ΄ μκΈ° μμ μ νΈμΆνλ κ²μ λ§ν©λλ€.
μ¦, μ¬κ· νΈμΆ λ€μ μΆκ°μ μΈ μ°μ°μ μννμ§ μλ μ¬κ· λ°©μμ λλ€.
꼬리 μ¬κ·(Tail Recursion)λ μ¬κ· νΈμΆμ΄ λλ λ λ μ΄μ μ²λ¦¬ν μμ μ΄ λ¨μ μμ§ μμ κ²½μ°μ ν΄λΉν©λλ€.
4οΈβ£ μ μ ν μ€ν ν¬κΈ° μ€μ .
- Javaμμλ JVM(Java Virtual Machine)μ μ€ν ν¬κΈ°λ₯Ό μ€μ νμ¬ μ€ν μ€λ² νλ‘μ°(Stack Overflow)λ₯Ό μλ°©ν μ μμ΅λλ€.
-
-Xss
μ΅μ μ μ¬μ©νμ¬ μ€ν ν¬κΈ°λ₯Ό μ‘°μ ν μ μμ΅λλ€.
-
- κ·Έλ¬λ, μ€ν ν¬κΈ°λ₯Ό 무μμ λ리λ κ²μ κ·Όλ³Έμ μΈ ν΄κ²°μ± μ΄ μλκΈ° λλ¬Έμ μ¬κ· νΈμΆμ΄λ ν¨μ μ€κ³λ₯Ό κ°μ νλ κ²μ΄ λ μ’μ΅λλ€.
π μμ
java -Xss2m MyProgram
- μ λͺ λ Ήμ Java νλ‘κ·Έλ¨μ μ€ν ν¬κΈ°λ₯Ό 2MBλ‘ μ€μ ν©λλ€.
5οΈβ£ μμ½
- μ€ν μ€λ² νλ‘μ°(Stack Overflow)λ ν¨μ νΈμΆμ΄ μ€ν λ©λͺ¨λ¦¬(Stack Memory)μ νκ³λ₯Ό μ΄κ³Όνμ λ λ°μνλ©°, μ£Όλ‘ μ¬κ· ν¨μμ 무ν νΈμΆμ΄λ κΉμ ν¨μ νΈμΆ 체μΈμμ λ°μν©λλ€.
- μ΄λ₯Ό λ°©μ§νκΈ° μν΄ μ¬κ· ν¨μμ μ’ λ£ μ‘°κ±΄μ λͺ νν μ€μ νκ³ , νμν κ²½μ° λ°λ³΅λ¬Έμ μ¬μ©νκ±°λ JVM(Java Virtual Machine)μ μ€ν ν¬κΈ°λ₯Ό μ‘°μ ν μ μμ΅λλ€.
- μ€ν μ€λ²νλ‘μ°(Stack Overflow)λ₯Ό νΌνκΈ° μν΄μλ νλ‘κ·Έλ¨μ λ©λͺ¨λ¦¬ μ¬μ©κ³Ό ν¨μ νΈμΆ ꡬ쑰μ λν μ² μ ν μ΄ν΄μ κ΄λ¦¬κ° νμν©λλ€.