728x90
Inner Class : 클래스 내부에 선언된 클래스
- 내부 클래스는 클래스 내에 선언되므로 인스턴스 속성 변수처럼 활용된다
즉 메소드 { } 안에서만 유효하다. - 인스턴스 변수는 클래스 내에서 선언되지만 메소드 밖에서, 생성자 밖에서, 다른블록 밖에서 선언된다.
이 경우 반드시 초기화가 필요하다 - 내부 클래스는 외부 클래스의 멤버를 활용할 수 있지만
외부 클래스는 내부 클래스의 멤버 변수를 활용할 수 없다. - static이 붙은 메소드 내에서는 내부 클래스의 객체 선언을 할 수 없다.
- 정적 클래스 static이 아닌 경우(static선언이 없으면) 내부 클래스라고 부른다.
- 일반적으로 AWT, Swing 등의 GUI 이벤트 처리 외에는 잘 사용되지 않는다.
ex)
class A{
class B{
}
}
B는 A의 내부 클래스이고, A는 B의 외부 클래스이다.
※ 내부 클래스 B는 외부 클래스인 A가 아닌 클래스에서 잘 사용되지 않아야 한다.
외부 클래스가 아닌 다른 클래스에서 내부 클래스에 접근해야 한다면 내부 클래스로 선언해서는 안 되는 클래스를 내부 클래스로 선언했다는 의미이기 때문이다.
내부 클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들에게 쉽게 접근 가능하다.
- 코드의 복잡성을 줄여준다. (캡슐화)
내부 클래스(Inner Class)의 종류와 특징
1. 스태틱 클래스 (Static Class)
- 외부 클래스의 멤버 변수 위치에 선언된다.
- class 앞에 static이 붙어있다.
- static이 붙어있기 때문에 객체 생성없이 사용 가능하다.
- 외부 클래스의 static변수처럼 사용된다.
- 외부 클래스와 내부 클래스는 다르게 동작한다.
- 외부 클래스와 내부 클래스의 멤버가 private라도 상호 접근 가능하다
- 경로만 지정된다면 단독으로 직접 사용할 수 있다.
- 주로 외부 클래스의 static멤버, 특히 static메소드에서 사용된다.
public class StaticClass01 {
private int num = 1; //객체 생성, 외부X
int sc = num; //객체 생성. 외부O
private static int outterSI = 0; //클래스명. 객체X, 외부X
public static void outterMethod() {
System.out.println(SInner.innerSM);
}
public static class SInner{
private int innerMember = 200;
private static int innerSM = 300;
final int LV = 100;
public static void innerMethod() {
System.out.println("static 클래스 내부 static 메소드");
}
public void innerM() {
System.out.println("static 클래스 내부 클래스");
System.out.println("this.innerSM " + this.innerSM);
//System.out.println("sc " + sc); 호출 불가
System.out.println("outterSI" + outterSI);
}
}
public static void main(String[] args) {
StaticClass01 staticClass01 = new StaticClass01();
StaticClass01.SInner si = new SInner();
StaticClass01.SInner si2 = new StaticClass01.SInner();
si.innerMethod();
si.innerM();
StaticClass01.SInner.innerMethod();
//StaticClass01.SInner.innerM();객체 생성 후 호출
//AAA객체 생성
AAA aaa = new AAA();
//System.out.println(aaa.BBB..); //불가
//System.out.println(AAA.BBB.); //안보임
AAA.BBB bbb = new AAA.BBB();
}
}
//private : 같은 클래스에서만 접근 가능
//내부 클래스 - 외부 클래스 서로 접근 가능
class AAA{
private static int innerNum = BBB.number; //내부 클래스의 private 접근 가능
private static int outternum = 100;
static class BBB{
private static int number = 10;
int number2 = outternum; //외부 클래스의 private도 접근 가능
}
}
[실행결과]
static 클래스 내부 static 메소드
static 클래스 내부 클래스
this.innerSM 300
outterSI0
static 클래스 내부 static 메소드
2. 멤버 클래스 (Member Class)
- 외부 클래스의 멤버 변수 위치에 선언된다.
- 외부 클래스의 인스턴스 멤버처럼 사용된다.
- 멤버 변수와 같은 성질을 가진다.
- 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에서 사용된다.
public class MemberClass01 {
private int outerDf = 10;
private static int osi = 55;
int number = 777;
void outerMethod() {
System.out.println(number);
System.out.println(osi);
System.out.println(this.osi);
}
static void outterSM() {
System.out.println(osi);
//System.out.println(number); //X
}
public class InnerClass{
private int x = 100;
int innerDf = 100;
static final int ISI = 123;
public void innerMethod() {
int imnum = osi; //외부 클래스 private static int osi = 55;
System.out.println(x);
System.out.println(innerDf);
System.out.println(ISI);
System.out.println(number);
System.out.println(outerDf);
}
}
public static void main(String[] args) {
MemberClass01 memberClass01 = new MemberClass01();
//MemberClass01.InnerClass in = new MemberClass01.InnerClass();
MemberClass01.InnerClass in = memberClass01.new InnerClass();
in.innerMethod();
//내부 클래스 -> 입출력 -> 쓰레드 -> 네트워킹 -> 그래픽
}
[실행결과]
100
100
123
777
10
3. 지역 클래스 (Local Class)
- 외부 클래스의 메소드나 초기화 블럭 안에서 선언된다.
- 메소드 안에서만 지역변수처럼 클래스를 활용하므로 메소드의 실행이 끝나면 지역 클래스는 제거된다.
- 외부에서 인스턴스를 생성할 수 없다.
- static을 사용할 수 없다.
- 인스턴스 변수 또는 메소드는 사용 가능하다.
- final이 붙은 지역변수(상수)나 매개변수는 지역 클래스의 메소드에서 접근 가능하다.
- 객체를 생성해서 활용해야 한다.
- 컴파일 하면 외부 클래스$숫자+로컬 클래스명.class로 만들어진다.
(숫자는 서로 다른 메소드인 경우 같은 이름의 클래스가 존재할 수 있어서 구분하기 위해서 붙인다.) - 선언된 영역 내부에서만 사용된다.
public class LocalClass01 {
private int a = 10;
final int LV = 100;
void method() {
int in = 100;
final int inD = 1000;
class LocalClass{
int no = 99;
void msg() {
no = no + 10;
System.out.println("외부 a " + a);
System.out.println(LocalClass01.this.a);
System.out.println(in);
System.out.println(inD);
}
} //LocalCalass 끝
//지역 클래스가 선언된 메소드 안에서 객체를 만든다.
LocalClass local = new LocalClass();
local.msg(); //객체 생성 후에 호출해서 사용한다.
} //메소드 끝
public static void main(String[] args) {
LocalClass01 localClass01 = new LocalClass01();
localClass01.method();
}
[실행결과]
외부 a 10
10
100
1000
4. 익명 클래스 (Anonymous Class)
- 클래스 이름이 없는 클래스
- new 슈퍼클래스 또는 인터페이스명( ){ };
- 선언과 동시에 인스턴스 생성을 하나로 통합한다.
- 클래스를 인수의 값으로 활용한다.
- 클래스의 선언부가 없기 때문에 이름이 없으므로 생성자를 가질 수 없다.
- 슈퍼 클래스의 이름이나 구현할 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.
(오직 하나의 클래스를 상속받거나 하나의 인스턴스만 구현 가능) - 코드 블럭에 클래스 선언을 하는 점만 제외하고는 생성자를 호출하는 것과 동일하다.
- 객체를 구성하는 new문장 뒤에 클래스의 블럭{ }을 첨부하여 몸통을 닫는 형식으로 구성된다.
- 객체를 생성한 후에 { }; 즉 메소드를 구현한 블록이 있고 블록 끝에는 세미콜론이 붙는다.
- new 뒤에 오는 생성자명이 기존 클래스명이면 익명 클래스가 자동으로 클래스의 하위 클래스가 된다.
- 인터페이스인 경우에는 인터페이스를 상속하는 부모 클래스가 Object가 된다.
- 객체를 한번만 사용할 경우 사용된다. (일회성)
interface Sound{
abstract void sound();//불완전 요소
}
abstract class Animal{
String name;
int age;
}
class Cat extends Animal implements Sound{
@Override
public void sound() {
}
}
class Dog{
}
class Mouse{
}
class AMClass{
public void method() {
System.out.println("method");
}
}
public class Anonymous {
public static void main(String[] args) {
//상속 -> 추상화 -> 인터페이스 -> 다형성
//List<String> list = new List<String>();
//이렇게 만들 수 없다. = 미구현된 메소드 완벽 X
//인터페이스는 상속받는 자식 클래스로 생성
AMClass amc = new AMClass() {
@Override
public void method() {
System.out.println("오버라이드 했습니다.");
}
};
amc.method();
}
}
[실행결과]
오버라이드 했습니다.
'JAVA' 카테고리의 다른 글
VirtualBox 설치방법 (0) | 2021.07.27 |
---|---|
입출력 스트림 (IO Stream) (0) | 2021.07.27 |
이진 트리 (Binary Tree) (0) | 2021.07.26 |
예외처리 (Exception) (0) | 2021.07.26 |
스택 (Stack)과 큐(Queue) (0) | 2021.07.26 |