가자미의 개발이야기

자바 네스티드 클래스 본문

Java/자바 기본 문법

자바 네스티드 클래스

가자미 2021. 2. 4. 09:10

-네스티드 클래스 : 클래스 안에 정의된 클래스

--static 여부에 따라 스태틱 네스티드 클래스/이너 클래스로 구분.

---이너 클래스도 멤버/로컬/익명 클래스로 구분

 

-스태틱 네스티드 클래스(Outer 클래스와 별 상관 없음)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Outer{
    private static int num =0;    //외부 접근이 불가능한 변수지만 nested1, nested2로는 접근 가능
    static class Nested1{
        void add(int n) {num+=n;}
    }
    static class Nested2{
        int get() {return num;}
    }
}
public class StaticNested {
    public static void main(String[] args) {
        Outer.Nested1 nst1 = new Outer.Nested1();    //인스턴스 생성 방법 유의
        nst1.add(5);
        Outer.Nested2 nst2 = new Outer.Nested2();    //인스턴스 생성 방법 유의
        System.out.println(nst2.get());
    }
}
 
cs

-멤버 클래스

--멤버 클래스는 아우터 클래스에 종속적인 관계에 있는 이너 클래스이다.

---아우터 인스턴스에 기반으로 멤버 클래스의 인스턴스가 생성된다.

---멤버 클래스를 아우터 클래스 안에 감춘다고 생각하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface Printable{
    void print();
}
public class Papers {
    private String con;
    public Papers(String s) {con=s;}
    
    public Printable getPrinter() {
        return new Printer();
    }
    
    private class Printer implements Printable{
        public void print() {
            System.out.println(con);
        }
    }
    public static void main(String[] args) {
        Papers p = new Papers("서류 내용 : 행복합니다.");
        Printable prn = p.getPrinter();
        prn.print();
    }
}
cs
 
-로컬 클래스
--멤버 클래스와 유사하나, 아우터 클래스의 메소드 안에 숨긴다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
interface Printable{
    void print();
}
public class Papers {
    private String con;
    public Papers(String s) {con=s;}
    
    public Printable getPrinter() {
        class Printer implements Printable{    //메소드 안에 정의
            public void print() {
                System.out.println(con);
            }
        }
        return new Printer();
    }
    public static void main(String[] args) {
        Papers p = new Papers("서류 내용 : 행복합니다.");
        Printable prn = p.getPrinter();
        prn.print();
    }
}
cs

-익명 클래스
--이너 클래스가 인터페이스의 구현 결과밖에 없다면,
--해당 클래스를 생략하고 인터페이스를 구현한 인스턴스를 정의한다.
---메소드를 전달해야 하는 경우, 클래스를  쓰지 않고 전달하는 방식이라고 이해하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface Printable{
    void print();
}
public class Papers {
    private String con;
    public Papers(String s) {con=s;}
    
    public Printable getPrinter() {
        return new Printable() {    //이름이 없는 클래스
            public void print() {    //추상메소드 구현
                System.out.println(con);
            }
        };
    }
    public static void main(String[] args) {
        Papers p = new Papers("서류 내용 : 행복합니다.");
        Printable prn = p.getPrinter();
        prn.print();
    }
}
cs
 

 

 

 

'Java > 자바 기본 문법' 카테고리의 다른 글

자바 다양한 람다식  (0) 2021.02.04
자바 람다의 기초  (0) 2021.02.04
자바 매개변수의 가변 인자 선언 & 어노테이션  (0) 2021.02.03
자바 열거형  (0) 2021.02.03
자바 컬렉션 기반 알고리즘  (0) 2021.02.03