내부 클래스

hyun9_9 2024. 1. 6. 00:12

내부 클래스 

내부 클래스는 클래스안에 만들어진 또 다른 클래스로 중첩 클래스라고도 부릅니다 클래스에 다른 클래스를 선언하는 이유는 두 개의 클래스가 서로 긴밀한 관계를 맺고 있기 때문입니다 

 

두 클래스 멤버들 간에 손쉽게 접근할 수 있습니다

불필요한 클래스를 감춰서 코드의 복잡성을 줄일 수 있습니다

 

보통 바깥쪽의 클래스를 외부 클래스 안쪽의 클래스를 내부끌래스라고 합니다

외부 클래스를 한 대의 자동차로 가정한다면 내부 클래스는 그 자동차를 구성하는 엔진 기어 방향지시등처럼 독립적으로 존재 하지만 자동차를 완성하는데 반드시 필요한 부품에 속합니다

 

public class OuterClass{

  class InnerCalss{

 

  }

}

 

OuterClass가 외부 클래스가 되고 클래스 안에 선언된 InnerCalss가 내부 클래스가 됩니다 내부클래스는 클래스 간의 긴밀한 관계가 필요할 때 사용합니다

내부 클래스는 외부 클래스 안에 선언된다는 점만 제회하면 일반클래스와 같은 성격과 모습을 지니고 있습니다

 

 

 

내부 클래스의종류

내부 클래스는 클래스 안에서 선언된 위치에 따라 인스턴스 클래스, 정적 클래스, 지역 클래스, 익명 클래스로 구분됩니다

메서드 설명
인스턴스 클래스 외부 클래스의 멤버 변수와 같은 위치에 선언
주로 외부 클래스의 멤버 변수와 관련된 작업에 사용될 목적으로 선언
정적 클래스  외부 클래스의 클래스 변수와 같이 static키워드 부여
지역 클래스  외부 클래스의 메서드 내부에서 선언하여 사용
메서드 영역에서 선언되기 때문에 메서드 내부에서만 사용가능

 

 

인스턴스 클래스

인스턴스 크래스는 외부 클래스 내부에서 생성하고 선언되어 사용하는 클래스를 의미합니다 인스턴스 변수와 같은 위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어집니다 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언됩니다

 

인스턴스 클래스 생성

public class Outer {

private String name;//인스턴스 멤버

 

public class Inner{//인스턴스 클래스

    private String name;

}

 

}

 

내부 클래스도 외부 클래스안에 생성되는 것외에는 별도의 클래스이기때문에 파일이 컴파일 되면 별도로 생성됩니다

 

인스턴스 클래스 선언

인스턴스 클래스는 기본적인 내부 클래스입니다

외부 클래스 안에 생성 되기 때문에 클래스를 사용하려면 외부 클래스 객체가 생성된 상태에서 객체 생성을 할 수있습니다

인스턴스 클래스 객체를 선언하는 방법은 다음과 같습니다

Outer outer =new Outer();

Outer.Inner in =outer.new Inner();

 

 

정적 내부 클래스 

클래스 안에 정적 변수를 선언할 수 있는 것처럼 클랫도 정적 클래스를 만들 수 있습니다 인스턴스 변수와 마찬가지로 static키워드를 사용해 클래스를 선언한 후 정적 내부 클래스를 생성합니다

 

정적 내부 클래스 생성

정적 내부 클래스는 인스턴스 멤버와 동일한 위치에 선언합니다

public class Outer {

private String name;//인스턴스 멤버

 

public static class Inner{//정적 내부 클래스

    private String name;

}

 

}

 

 

클래스 앞에 static 키워드를 사용해 정적 내부 클래스를 선언했습니다 정적 변수와 마찬가지로 클래스에 속하지만 독립적으로 존재합니다 또한 외부 클래스의 존재와 상관없이 정적 변수를 사용할 수 있습니다 크러나 외부 클래스의 인스턴스 변수 또는 메서드를 정적 내부 클래스 안에서는 사용할 수 없습니다

 

정적 내부 클래스 선언

정적 내부 클래스는 인스턴스 클래스와 다르게 외부 클래스 객체를 생성하지 않아도 선언할 수 있습니다

Outer.Inner in =new Oute.Inner();

 

 

지역 클래스

지역 클래스는 외부 클래스의 메서드 내에서 선언되어 사용하는 클래스입니다 메서드 내에서 선언되기 때문에 해당 클래스는 메서드 내에서만 사용할 수 있습니다 또한 메서드 실행이 끝나면 해당 클래스도 사용이 종료됩니다

 

지역 클래스 생성

public class LocalClass{

public void print(){

class A{

 

}

A a=new A();

}

 

}

메서드 내에서 선언하여 사용하기 때문에 접근제한자와 정적 키워드를 붙일 수없습니다

 

내부 클래스의 접근제한

 

1. 접근 제한자

내부 클래스도 클래스이기 때문에 접근 제한자를 붙여서 사용할 수 있습니다

 

 

2. 지역 클래스의 접근제한

지역 클래스는 메서드 내에서 선언되어 사용합니다 보통메서드가 종료되면 클래스도 함께 종료되지만 메서드와 실행되는 위치가 다르기 때문에 종료되지 않고 남아 있을 수도 있습니다 그래서 지역 클래스에서 메서드 내의 변수를 사용할 때는 변수를 복사해 사용합니다

 

익명 클래스

익명 클래스는 다른내부 클래스와는 달리 이름이 없는 클래스를 의미합니다 익명 클래스는 클래스의 선언과 객체의 생성을 동시에 하므로 단 한 번만 사용할 수 있으며 오직 하나의 객체만을 생성할 수 있는 일회용 클래스입니다

따라서 생성자를 선언할 수도 없으며 둘 이상의 인터페이스를 구현할 수도 없습니다

오직 단 하나의 크래스를 상속 받거나 단 하나의 인터 페이스를 구현해야만 합니다

 

Person p = new Person(){

@Override

void method(){

}

}

 

클래스 생성자 뒤에 코드 블록이 추가 되고 해당 클래스가 가진 메서드들 을 override 하여 구현하는 방식 입니다 

해당 클래스 자체를 재정의하여 구현합니다 구현된 문법 마지막에는 세미콜론(;)을 붙입니다

익명 클래스는 보통 인터페이스의 기능을 구현할 때 사용합니다