-
210818_내부클래스JAVA 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