[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item10 ์™„๋ฒฝ๊ณต๋žต. StackOverflowError

2023. 1. 30. 08:39ใ†JAVA/Effective JAVA

728x90
item10. equals๋Š” ๊ธฐ๋ณธ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ. 

" p58. StackoverflowError"

 

 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item10. equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ. (์ถ”์ด์„ฑ, ์ผ๊ด€์„ฑ, null-์•„๋‹˜) (tistory.com)

 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item10. equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ. (์ถ”์ด์„ฑ, ์ผ๊ด€์„ฑ, null-์•„๋‹˜)

item10. equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ. equals ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค. [์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item10. equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ. (๋Œ€์นญ์„ฑ, ๋ฐ˜์‚ฌ์„ฑ, ์ถ”์ด

hyejin.tistory.com

์œ„์— ๊ฒŒ์‹œ๊ธ€์—์„œ ์ถ”์ด์„ฑ ์œ„๋ฐ˜์— ๋Œ€ํ•œ ์˜ˆ์ œ๋กœ ColorPoint ํด๋ž˜์Šค์˜ equals๋ฅผ ์ž˜๋ชป ์žฌ์ •์˜ํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค. 

@Override
public boolean equals(Object obj)
{
   if (!(obj instanceof Point)) {
      return false;
   }
   
   // obj๊ฐ€ ์ผ๋ฐ˜ Point์ด๋ฉด color๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋น„๊ตํ•œ๋‹ค.
   if (!(obj instanceof ColorPoint)) {
      return obj.equals(this);
   }
   
   // obj๊ฐ€ ColorPoint์ด๋ฉด ์ƒ‰์ƒ๊นŒ์ง€ ๋น„๊ตํ•œ๋‹ค.
   return super.equals(obj) && ((ColorPoint) obj).color == color;
   
}

์ด ๋ฐฉ์‹์€ ์ถ”์ด์„ฑ ์œ„๋ฐฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Stackoverflow๋ฅผ ์ผ์œผํ‚ค๋Š”๋ฐ ๊ทธ ์ด์œ ๊ฐ€ Point์˜ ๋˜ ๋‹ค๋ฅธ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  equals๋ฅผ ์œ„์™€ ๊ฐ™์ด ์žฌ์ •์˜ ํ•œ๋‹ค๋ฉด ๋ฌดํ•œ ์žฌ๊ท€์— ๋น ์ง„๋‹ค. 

 

public class SmellPoint extends Point
{
   private String smell;
   public SmellPoint(int x, int y, String smell)
   {
      super(x, y);
      this.smell = smell;
   }
   
   @Override
   public boolean equals(Object obj)
   {
      if (!(obj instanceof Point)) {
         return false;
      }
      
      if (!(obj instanceof SmellPoint)) {
         return obj.equals(this);
      }
      
      return super.equals(obj) && ((SmellPoint) obj).smell == smell;
      
   }
}

Point์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ SmellPoint๋ฅผ ์ •์˜ํ•˜๊ณ ,equals๋ฅผ ์œ„์— ColorPoint์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ๋‹ค. 

 

public static void main(String[] args)
{
   SmellPoint smellPoint = new SmellPoint(0, 1, "sweat");
   ColorPoint colorPoint = new ColorPoint(0, 1, Color.RED);
   smellPoint.equals(colorPoint); // stackoverflowError ๋ฐœ์ƒ
}

๊ทธ๋ฆฌ๊ณ  ์ด ๋‘˜์„ equals๋กœ ๋น„๊ตํ•˜๋ฉด ์ด๋•Œ StackOverflowError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

smellPoint์—์„œ equals๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ๋Ÿผ ์ด colorPoint๋„ equals๋ฅผ ํ˜ธ์ถœํ•˜๊ณ ... 

๋ฌดํ•œ ์žฌ๊ท€์— ๋น ์ ธ 

์ด๋Ÿฐ ์—๋Ÿฌ๋ฅผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. 

 

 

๋จผ์ € StackOverflowErorr๋ฅผ ๋ณด๊ธฐ ์ „์— ์Šคํƒ stack๊ณผ ํž™ heap ์ด ๋ญ”์ง€๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ•œ๋‹ค. 

[JAVA] 11. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ2. return๋ฌธ, JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ (tistory.com)

 

[JAVA] 11. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ2. return๋ฌธ, JVM ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

1๏ธโƒฃ return ๋ฌธ return๋ฌธ์€ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ๋ฉ”์„œ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ๋กœ ๋˜๋Œ์•„๊ฐ„๋‹ค. ๋ชจ๋“  ๋ฉ”์„œ๋“œ์—๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ return๋ฌธ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด void์ธ ๊ฒฝ์šฐ์—๋Š” return๋ฌธ์ด ์—†

hyejin.tistory.com

 

์Šคํƒ stack 

- ๋ฉ”์„œ๋“œ์˜ ์ž‘์—…์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ œ๊ณต

- ์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ์—ฐ์‚ฐ์— ํ•„์š”ํ•œ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ ๋“ฑ์„ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ 

- ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ •์˜๋œ ๋ธ”๋ก์„ ๋ฒ—์–ด๋‚  ๋•Œ ์†Œ๋ฉธ 

- ํ•จ์ˆ˜์˜ ํ˜ธ์ถœํ•˜๋Š” ์œ„์น˜๋„ ์ €์žฅ 

 

 

ํž™ heap 

- ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ณต๊ฐ„ 

- ์Šคํƒ๋ณด๋‹ค ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ 

- ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (new) 

 

 

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ, ์Šคํƒ์— ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์Œ“์ด๊ฒŒ ๋˜๊ณ , ์Šคํƒ ํ”„๋ ˆ์ž„์—๋Š” ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ ์‹คํ–‰ ๋๋‚ด๊ณ  ๋Œ์•„๊ฐˆ ๊ณณ, ํž™์— ๋“ค์–ด์žˆ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. 

 

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ๋”์ด์ƒ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์Œ“์„ ์ˆ˜ ์—†์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๊ฐ€ StackOverflowError์ด๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90