Inflearn brand logo image

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

인터럽트 - 시작1

정적내부클래스 new 로 생성에 관한 질문(인터럽트-시작1강 중...)

작성

·

82

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
인터럽트 시작1 부분 강사님 설명 예제중에서 갑자기 궁금해서 질문드립니다..
제가 궁금한부분은
public class ThreadStopMainV1 {
public static void main(String[] args){

MyTask task = new MyTask();
Thread thread = new Thread(task, "work");
thread.start();
}

static class MyTask implements Runnable {

......................................

}

}

여기서 질문 왜 정적내부클래스 MyTask()에 new를 써서 만드나요??
정적 내부 클래스는 외부 클래스의 정적 멤버처럼 동작하기 때문에, 외부 클래스의 이름을 통해 접근해야 하는거 아닌가요?. 따라서 newThreadStopMainV1.MyTask() 형태로 생성해야하는거 아닌가요?? 정적내부클래스도 바로 다이렉트로
new MyTask() 로 생성해도 되는건가요 ?? 너무궁금합니다..

답변 2

0

질문자님이 생각하신 것은 static 키워드를 사용하지 않은 일반적인 Inner class에 해당하는 규칙입니다.

  1. 다음과 같은 정적 중첩 클래스의 경우 OuterClass없이 NestedClass만 독립적으로 생성할 수 있으며, 따라서 다음 예시와 같이 중첩시키지 않고 두 클래스를 따로 만든 것과 동일합니다.
    따라서 OuterClass를 통해 접근하지 않고도 곧바로 new NestedClass()와 같이 인스턴스를 생성할 수 있습니다.

    // case 1. 파일1에 outer class와 static nested class
    public class OuterClass {
        ...
        static class NestedClass {
            ...
        }
    }
    
    // case 2. 파일 두개 각각에 outer class와 nested class
    // 이 경우 서로 다른 파일로 각 클래스를 유지하기에 outer와 nested 개념은 아니지만, case 1과의 비교를 쉽게 하기 위해 클래스 명을 그대로 사용.
    // <<파일1>>
    public class OuterClass {
        ...
    }
    // <<파일2>>
    public class NestedClass {
        ...
    }

     

  2. 다음과 같이 static 키워드를 사용하지 않은 InnerClass의 경우 질문자님께서 생각하신 부분처럼 동작합니다.

public class InnerOuter {
    ...
    class InnerClass {
        ...
    }
}
public class InnerOuterMain
    public static void main(String[] args) {
        InnerOuter outer = new InnerOuter();
        // 이 경우, outer 클래스의 인스턴스를 inner 클래스 인스턴스를 생성
        InnerOuter.InnerClass inner = outer.new InnerClass();

0

안녕하세요, 인프런 AI 인턴입니다. 김현종님.

정적 내부 클래스와 그 인스턴스 생성에 관한 질문을 이해하고 해결해 드리도록 하겠습니다.

정적 내부 클래스는 외부 클래스의 인스턴스와 독립적으로 존재하며, 외부 클래스의 이름을 통해 접근할 수 있습니다. 하지만 정적 내부 클래스의 인스턴스를 생성할 때는 외부 클래스의 인스턴스가 필요하지 않기 때문에 new 키워드로 직접 인스턴스를 생성할 수 있습니다. 따라서 외부 클래스의 이름을 사용하지 않고 new MyTask() 형태로 생성하는 것이 가능합니다.

정적 내부 클래스는 정적 클래스라는 특성상 외부 클래스의 인스턴스 없이도 독립적으로 동작할 수 있기 때문에, 외부 클래스의 이름을 명시하지 않고도 생성 및 사용이 가능합니다. 이는 외부 클래스에 대한 의존성을 줄이며 코드의 가독성과 재사용성을 높이는 데에 기여합니다.

김현종님의 궁금증은 이러한 특성을 이해하는 데에서 출발한 것 같습니다. 정적 내부 클래스는 외부 클래스의 이름을 명시하지 않아도 독립적으로 생성할 수 있으므로, new MyTask()로 바로 생성 가능한 것이 맞습니다.

더욱 자세한 내용과 예를 통한 실습은 강의에서 다루어질 수 있습니다. 다음과 같은 유사 질문과 답변을 통해서도 동일한 개념을 확인하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기