static 내부클래스의 인스턴스화에 대한 질문
저도 질문자님과 완전히 동일한 궁금증을 가지고 있었습니다.내부 클래스를 왜 굳이 static으로 정의하는가?static 내부 클래스인데, 왜 Hello 객체를 생성하지 않고 Hello.setName(name); 를 쓰면 빨간 밑줄이 뜨는가?내부 클래스를 static으로 정의했다면, 왜 Hello 객체를 굳이 생성하는건가?1번은 찾아보니 내부 클래스에서 외부 클래스의 인스턴스를 쓰지 않는다면, 내부클래스는 static으로 만들라고 다 그러더라고요. (현재 상황에 대입해보면, 내부 클래스인 Hello는 자신의 바깥 클래스인 HelloController 의 그 어떤 멤버도 쓰고있지 않습니다. -> 내부와 바깥 클래스가 서로 독립적으로 사용됨.)그 이유로 다들 '메모리 누수' 를 얘기하시던데, 저는 아래 링크에서 내부 클래스를 non-static으로 정의했을 때, 메모리 누수가 발생한다는 사실을 확실히 체감하게 되었습니다.https://tecoble.techcourse.co.kr/post/2020-11-05-nested-class/위 링크 내용을 요약하면, 컴파일 결과, static 내부 클래스는 '자신의 인스턴스'와 '자신의 기본 생성자'에 대한 정보만을 갖지만, non-static 내부 클래스는 이것에 더해 '바깥 클래스 참조'까지 하더라!여기서 '바깥 클래스 참조'가 메모리 누수의 원인입니다.-> 내부클래스와 외부클래스가 내용상 독립적이라면, 내부클래스에겐 바깥 클래스 참조가 필요없는 정보입니다.근데 만약 non-static 내부 클래스로 정의했다면, GC는 외부 클래스가 더 이상 사용되고 있지 않아도, 내부 클래스가 쓸데없이 참조하고 있기 때문에 삭제를 못합니다. 따라서 메모리 누수가 발생하는 것이죠.👉결론 : 내부 클래스가 바깥 클래스와 독립적으로 작동한다면 내부클래스를 static으로 정의하기. 2번은 클래스가 static 인 것이지, setName 메소드가 static인게 아니라서 발생하는 문제입니다. setName 메소드도 static으로 선언해주면, Hello.setName(name); 코드를 Hello 객체를 생성하지 않고도 쓸 수 있습니다.// @GetMapping("hello-api") // @ResponseBody // public Hello helloApi(@RequestParam("name") String name){ // Hello hello = new Hello(); // hello.setName(name); // return hello; // } //위의 코드 대신 // @GetMapping("hello-api") @ResponseBody public Hello helloApi(@RequestParam("name") String name){ Hello.setName(name); //이떄, Hello 클래스 안의 setName 메소드를 static으로 선언해줘야 밑줄이 안 생김. return Hello; }근데 이렇게 바꿔도 return Hello;에서 빨간 밑줄이 떠요.객체가 아니여서 리턴할 수 없는 것으로 저는 추측했고 3번 궁금증의 'static 클래스인데도 객체를 생성하는 이유'가 return 해야돼서 라고 저는 결론을 내렸는데 아직 명확한 원인은 찾지 못했습니다.혹시라도 그 원인을 찾으신 분이 계신다면 답글 달아주시면 감사할 것 같습니다.이것저것 많이 얘기했지만 결론은, 객체를 리턴해야되기 때문에 static 내부 클래스여도 객체를 생성해야된다. 따라서 강의에 나온 코드를 써야된다. 입니다.너무 궁금해서 여기저기 찾아다니고, 정리했는데 같은 궁금증을 가진 분들께 많은 도움이 됐으면 좋겠네요🙂