티스토리 뷰

IT/JAVA 및 Spring

[Java] static class(inner class)를 알아보자

주인장 진빼이

클래스 안에 클래스를 정의할 수 있으며, 중첩 클래스(Nested class)라 한다.

내부 클래스의 멤버에 접근하기 위해서는 가장 밖에 있는 outer class에 대한 인스턴스 생성이 반드시 필요하다.

inner class란 ? 중첩 클래스에서 안에 있는 클래스를 말한다.

그 반대가 outer class이다. 코드 예시를 살펴보자

 

아래에서 MemberBaseDto가 outer class(외부 클래스) MemberCreateDto가 inner class(내부 클래스)이다.

public class MemberBaseDto {

    public MemberCreateDto
    {

    }
}

 

inner class의 특징을 나열해보자

  1. 내부 클래스의 객체를 생성하기 위해서는 외부 클래스의 객체 생성이 필수이다.
  2. 중첩 클래스에서만 사용할 수 있다.
  3. outer class 객체를 접근하는 허용범위는 오직 inner class의 객체이다. (캡슐화 도움)

 

static 이 붙으면 뭐가 달라질까 ?

외부 클래스의 instance를 별도로 생성하지 않고 내부 클래스의 객체를 생성할 수 있다.

클래스와 클래스간에 메모리 공유는 존재하지 않는다.

 

인스턴스 생성방법

inner class에 대한 인스턴스 생성 방법을 살펴보자.

 

첫번째 케이스는 outer -> inner 순서로 총 2개의 생성자를 호출한다.

두번째 케이스는 static이 붙어 outer class의 객체 생성을 생략하여 생성자가 호출되지 않으며

MemberStaticDto에 대한 생성자를 호출한다.

 

타입 같은 경우 중첩 클래스를 나타내는 의미로 클래스와 클래스간에 .을 두어 연결한다.

// inner class 인스턴스 생성
MemberDto.MemberCreateDto instance = new MemberDto(200).new MemberCreateDto(10));


// inner static class 인스턴스 생성
MemberDto.MemberStaticDto = new MemberDto.MemberStaticDto(20));

 

만약 static class에 대한 인스턴스가 2개 이상 생성되면 모두 같은 메모리를 참조하고 있을까?

두 객체는 완전히 서로 다른 객체이다.

 

 

처음부터 static class를 정의할 수 있을까 ? 이 역시 불가능하다.

static class는 중첩 클래스에서만 사용할 수 있다.

 

상속 케이스 같은 경우

BaseMemberDto가 가지고 있는 getCode()를 자식 인스턴스(resDto)에서 접근할 수 있다.

반대로 inner class의 객체에서 outer class가 가지고 있는 getCode()로는 접근할 수 없다.

 

 

만약 inner static class에서 상속을 받게 되면 어떻게 될까?

상속은 가능하며, 상속받은 자식 객체 생성 시 부모 생성자가 반드시 호출되는 일반적인 상속 흐름과 동일하다.

 

inner static class에게 상속을 시킨다고 생각해보자.

inner static class의 객체 생성자 호출이 되기 전에 상속한 부모 생성자의 호출이 우선 호출된다.

outer class 생성자 호출 -> 상속받은 부모 클래스 생성자 호출 -> inner class 생성자 호출 순으로 이루어진다.

 

 

어쩔 때 사용할까 ?

클래스와 클래스간에 긴밀한 관계를 가지고 있을 때, 상속이 아니라 확장 용도로 사용된다.

외부 클래스에서만 내부 클래스를 접근할 수 있기에 캡슐화에 한층 더 깊이있는 도움을 주기도 한다.

 

Dto의 여러가지 유형에 대비하여 사용하고 있다.

상속과 거의 비슷하지만 약간의 다른 점이 존재하는 것을 잊지말도록 하자.

pulibc class 공통 {
	public static class 세부 { }
}

pulibc class 차량 {
	public static class 부품 { }
}

 

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함