본문 바로가기

study/java

자바/JAVA 자신을 호출(생성)하는 객체

생활코딩 강의를 보면서 의문이 들었다.

 

자기 자신을 호출하는 클래스(객체)

저렇게 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