๐ ์ปดํฌ์ง์ ์ด๋?
class A{
static class C { }
static void method() {
C c = new C();
}
}
์์์ ํ์ฅ ๊ฐ๋ ์ด์ง๋ง ์์ ์ฑ์ด ๋จ์ด์ง๋ค. ์ปดํฌ์ง์ (๋ด๋ถํด๋์ค) ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์ด๋ค ํน์ ํ ํด๋์ค์ ํน์ ํ ๊ด๊ณ๋ฅผ ๋งบ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
ํด๋์ค๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๋งบ์ ๊ฒฝ์ฐ์๋ ์์ฆ์๋ ํด๋์ค ๋ด๋ถ์ ์ ์ธํ๋ ๊ฒ์ด ์ข๋ค.
์ค์ฒฉ ํด๋์ค -> ๋ก์ปฌ ํด๋์ค(์ง์ญํด๋์ค), ๋ฉค๋ฒ ํด๋์ค
๋ฉค๋ฒ = ํ๋ + ๋ฉ์๋
// ์ค์ฒฉ ํด๋์ค
class ClassName{
class ClassName1{
}
}
// ์ค์ฒฉ ์ธํฐํ์ด์ค
class ClassName{
interface ClassName1{
}
}
ํ์ด์ฌ => ๋๋ค
// ๋์ผ ํจํค์ง๋ผ๋ ๊ฐ์ ํ์
public class C1{
public int x;
protected int y;
int z;
private int u;
protected void m() { }
}
public class C2{
C1 o = new C1();
can access o.x;
can access o.y;
can access o.z;
cannot access o.u;
can access o.m();
}
public class C3 extends C1{
can access x;
can access y;
can access z;
cannot access u;
can invoke m();
}
// ๋ค๋ฅธ ํจํค์ง
public class C4{
C1 o = new C1();
can access o.x;
cannot access o.y;
cannot access o.z;
cannot access o.u;
cannot access o.m();
}
public class C5 extends C1{
can access x;
can access y;
cannot access z;
cannot access u;
can invoke m();
}
// invoke ๋ ํธ์ถํ๋ค๋ผ๋ ๋ป์ด๋ค.
์ธ์คํด์ค ๋งด๋ฒ ํด๋์ค
class A { class B { } }A๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ๋ง Bํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ ์ ๋งด๋ฒ ํด๋์คclass A { static class B { } }A ํด๋์ค๋ก ๋ฐ๋ก ์ ๊ทผ ํ ์ B ํด๋์ค
๋ก์ปฌ ํด๋์ค
// ์ค์ฒฉ ํด๋์ค class A { void method() { class B{ } } }method๊ฐ ์คํ๋ ๋๋ง ์ฌ์ฉํ ์ ์๋ Bํด๋์ค
์ค์ฒฉ ํด๋์ค๋ฅผ ์ปดํ์ผ ํ๋ฉด : ๋ฉค๋ฒ ํด๋์ค์ธ ๊ฒฝ์ฐ์๋ A $ B.class ($ ํ์๋ ์ค์ฒฉ ํด๋์ค๋ฅผ ์๋ฏธ)
: ๋ก์ปฌ ํด๋์ค์ธ ๊ฒฝ์ฐ์๋ A $1 B.class
ClassName cs;
cs = new ClassName();
๋ณ์ == ์ธ์คํด์ค
์ธ์คํด์ค ๋ฉค๋ฒ ํด๋์ค => static ํค์๋ ์์ด ์ค์ฒฉ ์ ์ธ๋ ํด๋์ค๋ฅผ ์ด์ผ๊ธฐํ๋ค.
=> ์ธ์คํด์ค ํ๋์ ๋ฉ์๋๋ง ์ ์ธ ๊ฐ๋ฅํ๊ณ ์ ์ ํ๋์ ๋ฉ์๋ ์ ์ธํ ์ ์๋ค.
class A {
class B {
B() { }
int field;
static int field2;
void method() { }
static void method2() { }
}
}
A ํด๋์ค ์ธ๋ถ์์ Bํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๋ฉด ๋จผ์ Aํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ B๊ฐ์ฒด๋ฅผ ์์ฑ
A a = new A();
A.B b = a.new B();
b.field = 5;
b.method();
// ์ด๊ฑธ ๋ง์ด ์ฌ์ฉํ๋ค!!!
class A {
class B { }
void method() { //A class์ ๋ฉ์๋
B b = new B();
b.field = 5;
b.method();
}
}
class A {
static class C {
C();
int field;
static int field2;
void method();
static void method2() { }
}
}
Aํด๋์ค ์ธ๋ถ์์ ์ ์ ๋ฉค๋ฒ ํด๋์ค C์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ค๊ณ ํ๋ฉด
(Aํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๊ฐ ์๊ณ , ๋ฐ๋ก C ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋๋ค.)
A.C c = new A.C();
c.field = 5; // ์ธ์คํด์ค ํ๋
c.method(); // ์ธ์คํด์ค ๋ฉ์๋ ํธ์ถ
c.field2 = 5; // ์ ์ ํ๋ ์ฌ์ฉ
c.method2(); // ์ ์ ๋ฉ์๋ ํธ์ถ
A.C.field2 = 5;
A.C.method2();
๋ฉ์๋ ๋ด์์ ์ ์ธ๋ ํด๋์ค๋ฅผ ๋ก์ปฌ ํด๋์ค๋ผ๊ณ ํ๋ค.
์ ๊ทผ ์ ์ด ์ง์์ ๋ฐ static์ ๋ถ์ฌ์ ์ฌ์ฉํ ์ ์๋ค.
(๋ก์ปฌ ํด๋์ค๋ ๋ฉ์๋ ๋ด๋ถ์์๋ง ์ฌ์ฉ๋๋ฏ๋ก ์ ๊ทผ์ ์ ํํ ํ์๊ฐ ์๋ค)
void method(){
class D {
D();
int field;
static int field1; // ์์ฉ ๋ชปํจ
void method() { }
static void method1() { } // ์์ฉ ๋ชปํจ
}
D d = new D();
d.field = 5;
d.method();
}
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด์ ์ค๋ ๋ ๊ฐ์ฒด ๋ง๋ค๋ ๋ก์ปฌ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
class A {
A() {
System.out.println("A ๊ฐ์ฒด๊ฐ ์์ฑ");
class B{
B(){
System.out.println("B ๊ฐ์ฒด๊ฐ ์์ฑ");
}
int field1;
void method1() { }
}
static class C {
C() {
System.out.println("C ๊ฐ์ฒด๊ฐ ์์ฑ");
}
int field1;
static int field2;
void method1() { }
static void method2() { }
}
void method() {
class D {
D() {
System.out.println("D ๊ฐ์ฒด๊ฐ ์์ฑ");
}
int field1;
void method1() { }
}
D d = new D();
d.field1 = 5;
d.method1();
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
A.B = a.new B();
b.field1 = 5;
b.method1();
A.C c = new A.C();
c.field1 = 5;
c.method1();
A.C.field1 = 5;
A.C.method1();
a.method();
}
}
}
// errorCode๊ฐ ์๋ค
public class A {
B field1 = new B();
C field2 = new C();
void method() {
B var1 = new B();
C var2 = new C();
}
static B field3 = new B();
static C field4 = new C();
static void method() {
B var1 = new B();
C var2 = new C();
}
class B { }
static class C { }
}
// errorCode๊ฐ ์๋ค
public class A {
int field1;
void method1() { }
static int field2;
static void method2() { }
class B {
void method() {
field1 = 10;
method1();
field2 = 10;
method2();
}
}
static class C {
void method() {
field2 = 10;
method2();
}
}
}
// => ๋๊ฐ์ ์ฝ๋ ๊ฒฐ๊ณผ๋ Test Code์ด๋ค
pubic class Parcel2 {
class Contents {
private int i = 10;
public int value() {
return i;
}
}
class Destination {
private String label;
Destination(String where To) [
label = where To;
}
String readLabel(){
return label;
}
}
public Destion to(String s) {
return new Destination(s);
}
public Contents contents() {
return new Contents();
}
public void ship(String dest){
Contents c = new Contents();
Destination ds = to(dext);
Destination d = new Destination(dest);
System.out.println(d.readLabel());
}
public static void main(String[] args) {
Parcle2 P = new PArcel2();
p.ship("Test Code");
Parcel2 q = new Parcel2();
Parcel2.Contents c = q.contents();
Parcel2.Destination d = q.to("Testing Code");
}
}
์ธ๊ณฝ ํด๋์ค ๋ฉค๋ฒ ๋ฉ์๋์์ ๋ด๋ถ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ์ฐธ์กฐ ํ ์ ์๋์ง? ํน์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋์ง์??
โ
๊ฒฐ๋ก ์์ฝ
์ธ์คํด์ค ๋ด๋ถ ํด๋์ค(Non-static inner class):
์ธ๋ถ ํด๋์ค์ ์ธ์คํด์ค ๋ฉ์๋์์๋ ๊ฐ์ฒด ์์ฑ ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ง new ํค์๋๋ก ์์ฑํ ๋ ์ธ๋ถ ํด๋์ค์ ์ฐธ์กฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค.
์ ์ ๋ด๋ถ ํด๋์ค(Static nested class):
์ธ๋ถ ํด๋์ค์ ๋ฉ์๋์์ ์ ์ ์ด๋ฏ๋ก ๋ฐ๋ก ๊ฐ์ฒด ์์ฑ ๊ฐ๋ฅํฉ๋๋ค.