JAVA

210818_내부클래스

요옫 2021. 8. 18. 10:27

내부클래스

특정 클래스 내에 또 다른 클래스가 정의되는 것을 의미. 이런 내부 클래스가 필요한 이유는 지금까지 작업해왔던 클래스들과는 다르게 독립적이기는 않지만 하나의 멤버처럼 사용할 수 있다.

내부 클래스는 외부 클래스의 모든 멤버들을 마치 자신의 멤버처러 사용 가능. static 내부 클래스는 제외하고는 다른 내부 클래스는 항상 외부 클래스를 통해야 생성 가능.

 

 

(예제)

class OuterObj{

 

//내부클래스: 아웃클래스 안에서만 사용가능

//특정클래스에서만 사용하는 클래스가 필요한 경우 

//멤버내부클래스: 하나의 객체로 인식

class InnerObj{

public void write() {

System.out.println("내부클래스의 메서드");

}

}

 

//외부

public void disp() {

System.out.println("외부클래스의 메서드");

 

System.out.println("외부에서 내부클래스의 메서드 호출");

InnerObj inObj=new InnerObj();  //외부클래스에서 내부클래스 객체 생성

inObj.write();

}

}

 

 

public class InnerClassEx03 {

 

public static void main(String[] args) {

 

//외부클래스 생성

OuterObj outerObj=new OuterObj();

outerObj.disp();

 

//메인에서 내부클래스의 메서드 선언은 외부를 통해서만 가능

OuterObj.InnerObj obj=new OuterObj().new InnerObj();  //OuterObj.InnerObj obj=outerObj.new InnerObj();  이것도 가능

obj.write();

}

}

 

//결과

외부클래스의 메서드

외부에서 내부클래스의 메서드 호출

내부클래스의 메서드

 

내부클래스의 메서드

 

 

~~~~~~~~~~~~~~~~~~~~

 

 

(예제)

class Outer{

 

String name="홍길동";

int age=22;

String addr="Seoul";

int grade=3;

 

//내부클래스

class Inner1{

//내부클래스에선 외부클래스 멤버 변수 사용 가능

public void disp1() {

System.out.println("***Inner1***");

System.out.println("이름: "+name+", 나이: "+age);

}

}

 

//내부클래스2

class Inner2{

public void disp2() {

System.out.println("***Inner2***");

System.out.println("지역: "+addr+", 학년: "+grade);

}

}

 

 

//외부클래스의 메서드

public void disp() {

//외부클래스에서 내부클래스 선언

Inner1 in1=new Inner1();

in1.disp1();

 

Inner2 in2=new Inner2();

in2.disp2();

}

}

 

public class InnerClassEx04 {

 

public static void main(String[] args) {

 

Outer out=new Outer();

out.disp();

 

System.out.println("---------------");

 

System.out.println("다른 클래스 외부 안 통하고 직접 내부 호출");

Outer.Inner1 in1=new Outer().new Inner1();

in1.disp1();

 

Outer.Inner2 in2=new Outer().new Inner2();

in2.disp2();

}

}

 

//결과

***Inner1***

이름: 홍길동, 나이: 22

***Inner2***

지역: Seoul, 학년: 3

---------------

다른 클래스 외부 안 통하고 직접 내부 호출

***Inner1***

이름: 홍길동, 나이: 22

***Inner2***

지역: Seoul, 학년: 3

 

 

~~~~~~~~~~~~~~~~~~~~

 

 

(예제)

class Outer1{

int a=10;

static int b=20;

 

class Inner1{

int c=30;

//static int d=40;  내부클래스에서는 static 변수 선언 불가능

 

public void write() {  //내부클래스 메서드

System.out.println("외부인스턴스 변수 a= "+a);

System.out.println("외부정적변수 b= "+b);

System.out.println("외부변수 c= "+c);

}

}

}

 

public class InnerMemberEx07 {

 

public static void main(String[] args) {

//내부메서드 바로 접근.. 외부클래스 통해서만 생성가능

Outer1.Inner1 in1=new Outer1().new Inner1();

in1.write();

}

}

 

//결과

외부인스턴스 변수 a= 10

외부정적변수 b= 20

외부변수 c= 30

 

 

~~~~~~~~~~~~~~~~~~~~

 

 

(예제)

class Server2{

//외부클래스

int a=10;

static int b=20;

 

static class Client2{

//내부클래스

int c=30;

static int d=40;  //내부클래스에 static 변수를 넣고 싶으면 클래스 앞에 static 붙이기

 

public void write() {

//System.out.println("외부일반변수 a="+a);

//정적변수클래스 내에서는 일반변수 불가능

System.out.println("외부static변수 b="+b);

System.out.println("내부일반변수 c="+c);

System.out.println("내부static변수 d="+d);

}

}

}

 

 

public class InnerMemberEx08 {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

Server2.Client2 client=new Server2.Client2();

client.write();

}

}

 

//결과

외부static변수 b=20

내부일반변수 c=30

내부static변수 d=40

'JAVA' 카테고리의 다른 글

210818_익명내부클래스+상속  (0) 2021.08.18
210818_익명내부클래스  (0) 2021.08.18
210817_스캐너+다향성+switch  (0) 2021.08.17
210817_Abstract+배열  (0) 2021.08.17
210817_인터페이스+다형성  (0) 2021.08.17