생활코딩 강의를 보면서 의문이 들었다.
저렇게 Fruit라는 객체에서 Fruit 타입의 static 객체를 생성한다.
여기서 생긴 의문 : APPLE 변수가 초기화 되면서 Fruit 객체가 생성이 되는데 그렇다면 그렇게 생긴 Fruit 객체가 또 APPLE, PEACH, BANANA 라는 변수가 생기고 각각 또 객체를 만들텐데 그렇다면 오버플로우가 발생해야 되는 거 아닌가? 재귀함수처럼 끝없이 생겨나니까
Java class instance recursive calling
I have a very basic java theory question. Why the Employee class calls its self recursively in the following example? class Employee { Employee emp = new Employee(); } public class Manager exte...
stackoverflow.com
(이름과 걸맞는 사이트) 스택오버플로우에 비슷한 질문이 있었다. 하지만 코드가 조금 다르다.
Employee 클래스의 변수 emp는 static이 아니다. 그래서 이 코드는 스택오버플로우 예외가 발생한다. 처음에 예상한 문제다. 그렇다면 생활코딩 강의에서는 왜 예외가 발생하지 않는가? 차이점을 보면 static 키워드가 답이다. 그럼 왜 그런가?
static 키워드가 붙었기 때문에 APPLE 변수가 한 번 생성이 되면 JVM의 메모리 영역으로 올라갈 것이다. 나머지 PEACH, BANANA도. 그 후 또 Fruit 객체가 생겨 APPLE, PEACH, BANANA 변수가 생겨도 처음에 만들어진 변수를 참조할 것이다.
class Fruit{
public static final Fruit APPLE = new Fruit();
public static final Fruit PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
}
public class Exam extends Fruit{
public static void main(String[] args) {
Fruit exam = new Fruit();
System.out.println(exam.APPLE);
System.out.println(exam.APPLE.APPLE);
System.out.println(exam.APPLE.APPLE.APPLE);
System.out.println(exam.PEACH);
System.out.println(exam.BANANA);
}
}
결과를 보면 알 수 있듯이 같은 주소를 참조한다.
왜 오버플로우가 발생하지 않는가?? --> static 키워드가 붙어 있어 같은 주소를 참조한다. 계속 객체가 생성되지 않는다.
프로그래머 카톡방에서 도움 주신 분들께 감사합니다
------------------------------------------------------------------------------------------
이 글에 추가적인 질문이 생겼다. 다음 코드를 보면 AnimalTest의 메인 메소드에서 AnimalTest 인스턴스를 생성한다. 그렇다면 원래 있던 AnimalTest가 새로운 AnimalTest를 생성하면 그 AnimalTest가 또 다른 AnimalTest를 생성하고 스택오버플로우가 발생하는 것 아닌가? ---> 메소드가 선언된다고 해서 메소드가 호출되는 것은 아니다. 따라서 AnimalTest 인스턴스를 생성했다 하더라도 main 메소드는 사용하지 않고 moveAnimal 메소드만 사용해서 오버플로우는 발생하지 않는다.
public class AnimalTest {
public static void main(String[] args) {
Animal hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Eagle();
AnimalTest test = new AnimalTest();
test.moveAnimal(hAnimal);
test.moveAnimal(tAnimal);
test.moveAnimal(eAnimal);
}
public void moveAnimal(Animal animal) {
animal.move();
}
}
'study > java' 카테고리의 다른 글
자바/JAVA Collection Framework (0) | 2021.02.05 |
---|---|
자바/JAVA enum 열거 (0) | 2021.01.29 |
자바/JAVA 클래스 패스(Class Path) (0) | 2021.01.27 |
자바/JAVA 제네릭 (0) | 2021.01.26 |
자바/Java 논리, 비트 연산자, 이름을 갖는 반복문 (0) | 2021.01.22 |