[Java] ๋ด๋ถ ํด๋์ค์ static์ด ๊ถ์ฅ๋๋ ์ด์ ์ ๋ํด
by rlaehddnd0422static ํด๋์ค๊ฐ ๋ค๋ฅธ static ๋ฉค๋ฒ์ ๋ค๋ฅธ ์
Java์์ "static ํค์๋๋ฅผ ์ฌ์ฉํ๋ค"๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๋จ ํ ๋ฒ ํ ๋น๋์ด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋ ๊น์ง ์ ์ง๋๋ฉฐ ์ข ๋ฃ๋๋ ์๊ฐ ํด์ ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ 'static' ํค์๋๋ฅผ ๋ถ์ธ ๋ฉค๋ฒ๋ JVM์ static ์์ญ์ ์์ฑ๋๋ฉฐ, new ์ฐ์ฐ์๋ก ๋ง๋ ์ธ์คํด์ค๋ Heap ์์ญ์ ํ ๋น๋ฉ๋๋ค.
์ธ์คํด์ค ์์ฑ์ ํ ๋น๋ Heap์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ํตํด ์์๋ก ์ ๋ฆฌ(*์ฐ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ ํด์ ํ๋ ์์ ์ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฒญ์)๋๋ฉฐ, GC์ ๊ด๋ฆฌ ์์ญ ๋ฐ์ ์กด์ฌํ๋ static์ ๋จ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ๊น์ง ์ ์ง๋๊ธฐ ๋๋ฌธ์ ์์ฃผ, ๋ง์ด ์ฌ์ฉํ๋ค๋ฉด ํผํฌ๋จผ์ค์ ์ ์ํฅ์ ๋ผ์น ์ ์์ต๋๋ค.
ํ์ง๋ง static 'class'๋ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค.
static class๋ํ static ์์ญ์ ํ ๋น๋๋ ๊ฒ์ ๋์ผํฉ๋๋ค๋ง, ๋ค๋ฅธ static ๋ฉค๋ฒ์ ๋ฌ๋ฆฌ static ํด๋์ค๋ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋ฒ๋ง ํ ๋นํ๋ ๊ฒ์ด ์๋, ์ธ๋ถ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค (static ํค์๋๊ฐ ๋ถ์๋๋ฐ๋) ์๋กญ๊ฒ static ์์ญ์ ํ ๋นํฉ๋๋ค.
public class StaticTest2 {
static class InnerStatic{}
public static void main(String[] args) {
InnerStatic a = new StaticTest2.InnerStatic();
InnerStatic b = new StaticTest2.InnerStatic();
System.out.println(a);
System.out.println(b);
System.out.println(a==b); // false
}
}
์คํ ๊ฒฐ๊ณผ aboutInnerClass.staticInner.StaticTest2$InnerStatic@5a39699c aboutInnerClass.staticInner.StaticTest2$InnerStatic@3cb5cdba false |
๊ทธ๋ ๋ค๋ฉด ์ธ๋ถ ์ธ์คํด์ค๋ฅผ ๋จผ์ ์์ฑํ๊ณ ์ด๊ธฐํ ํด์ผ ํ๋ ์์ ์ด ํ์ํ inner instance class์ ๋ฌ๋ฆฌ, ์ธ์คํด์ค๋ฅผ ๋ฐ๋ก ์์ฑํ ์ ์๋ static class์ ๋ฌด๋ถ๋ณํ ์ฌ์ฉ์ด ํผํฌ๋จผ์ค์ ์ ์ํฅ์ ๋ผ์น ์ ์์ง ์๋๊ฐ?
์คํ๋ ค static class์ ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
static class ์ฌ์ฉ์ด ๊ถ์ฅ๋๋ ์ด์
- static ์ผ๋ก ์ ์ธ๋์ง ์์ ๋ด๋ถ ํด๋์ค๋ ์ธ๋ถ ํด๋์ค์ ๋ํ ์จ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ํ ์๊ฐ/๊ณต๊ฐ์ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํด ์ฑ๋ฅ ์ ํ ๋ฐ์
static class๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ด๋ถ ์ธ์คํด์ค ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, '์จ์ ์ธ๋ถ ์ฐธ์กฐ'๋ผ๋ ๊ฒ์ด ๋ฐ์ํฉ๋๋ค.
inner instance class๋ฅผ ์๊ฐํด๋ด ์๋ค.
public static void main(String[] args) {
Bag b = new Bag("bagPack", 500000L); // ์ธ๋ถ ํด๋์ค ์ธ์คํด์ค ์์ฑ -> ์ธ๋ถ ํด๋์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ -> ๋ด๋ถ ํด๋์ค์ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ
Bag.Pouch p = b.new Pouch("pouch1", "white"); // ๋ด๋ถ ํด๋์ค์ ์ธ์คํด์ค ์์ฑ ๊ฐ๋ฅ
// ์ ๋์ค์ ํ ์ค๋ก ํํํ ์ ์์ต๋๋ค (๊ฐ๋
์ฑ์ ์ข์ง ์์)
Bag.Pouch p2 = new Bag("backPack2", 300000L).new Pouch("pouch2", "red");
}
์ธ๋ถ ํด๋์ค์ ์ธ์คํด์ค ์์ฑํ ์ดํ ๋ด๋ถ ํด๋์ค ํด๋์ค๋ฅผ ์ด๊ธฐํ ํ๋ ๊ณผ์ ์ ๊ฑฐ์ณค์ต๋๋ค.
์ด ๊ณผ์ ์์ inner ํด๋์ค๋ ์์ ์ ๋ง๋ค์ด์ค ์ธ์คํด์ค(=outer ํด๋์ค)์ ๋ํ '์ธ๋ถ ์ฐธ์กฐ'๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
์ธ๋ถ ์ฐธ์กฐ์ ๋ฌธ์
๊ทธ๋์ ๋ด๋ถ ํด๋์ค๊ฐ ์ธ๋ถ ํด๋์ค๋ฅผ ์ฐธ์กฐํ๋ฉด์ ์๊ธฐ๋ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ๊ฐ?
- Inner class๊ฐ Outer class๋ฅผ ์ธ๋ถ ์ฐธ์กฐ
- -> Outer ํด๋์ค๊ฐ ํ์์์ด์ก์ ๋, GC๊ฐ ์ ๋ฆฌ ๋์์ผ๋ก ์ผ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํด์ผ ํจ
- -> ํ์ง๋ง ์ธ๋ถ ์ฐธ์กฐ๋ก ๋ด๋ถ ํด๋์ค์ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ GC์ ๋์์ด ๋์ง ๋ชปํจ
- -> ๋ฉ๋ชจ๋ฆฌ์ ๋จ์ ์์ด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์
์คํ์ ํตํด ์์๋ด ์๋ค.
์ ์๋ฃ์์ ์ธ๋ถ ์ฐธ์กฐ์ ๋ฌธ์ ๋ฅผ ์ ์คํํ ์ฝ๋๊ฐ ์์ด ์ฐธ๊ณ ํ์์ต๋๋ค.
public class Outer {
// ์ธ๋ถ ํด๋์ค ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ถ๋ฆฌ๊ธฐ ์ํ ๋ฐฐ์ด ๋ณ์
private int[] data;
// ๋ด๋ถ instacne class
class Inner {}
// ์ธ๋ถ ํด๋์ค ์์ฑ์
public Outer(int size) {
data = new int[size];
}
// ๋ด๋ถ ํด๋์ค ์ธ์คํด์ค ์์ฑํ์ฌ ๋ฆฌํดํ๋ ๋ฉ์๋
Inner getInnerObject() {
return new Inner();
}
}
public class Main {
public static void main(String[] args) {
ArrayList<Object> l = new ArrayList<>();
for (int i = 0; i < 50; i++) {
l.add(new Outer(100000000).getInnerObject());
System.out.println(i);
}
}
}
์คํ ๊ณผ์
- Inner ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ด์ ๋ฆฌ์คํธ ์์ฑ
- ๋ด๋ถ ํด๋์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ธ๋ถ ํด๋์ค๋ฅผ ์ธ์คํด์คํ ํ๋ ๊ณผ์ ์ค size๊ฐ 100,000,000(400MB)์ธ ๋ฐฐ์ด์ ์์ฑํ์ฌ Heap์์ญ์ ํ ๋น.
- ํ ๋น์ด ๋๋๋ฉด ๋ด๋ถ ํด๋์ค ๋ฆฌํด.
์ 2, 3๋ฒ ๊ณผ์ ์ด 50๋ฒ ๋ฐ๋ณต๋๋ ๋์ ๋ฉ์๋ ํธ์ถ์ฉ๋๋ก ์ฌ์ฉ๋ 400MB์ Outer ํด๋์ค์ ์ธ์คํด์ค๋ GC์ ๋์์ด ๋์ด ํ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ๋์ด์ผ ํ๊ฒ ์ง๋ง, ์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์คํ ๋์ค ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ์ฌ ์์ธ๊ฐ ํฐ์ง๋ ๊ฒ ๋ณผ ์ ์์ต๋๋ค.
๋ฉ์๋ ํธ์ถ์ฉ์ผ๋ก ์ฌ์ฉ๋ Outer ํด๋์ค๋ฅผ Inner ํด๋์ค์์ ์ธ๋ถ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ GC ์๊ฑฐ ๋์์ผ๋ก ๊ฐ์ฃผํ์ง ์์, ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด static ํด๋์ค๋ ์ด๋จ๊น์
public class Outer {
private int[] data;
static class Inner {}
public Outer(int size) {
data = new int[size];
}
Inner getInnerObject() {
return new Inner();
}
}
public class Main {
public static void main(String[] args) {
ArrayList<Object> l = new ArrayList<>();
for (int i = 0; i < 50; i++) {
l.add(new Outer(100000000).getInnerObject());
System.out.println(i);
}
}
}
static ํด๋์ค๋ก ์คํํด๋ณด๋ฉด for๋ฌธ์ด ๋ชจ๋ ์ํํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ๊ฐ๋ฅํ ๊ฒ์ผ๊น?
static ํด๋์ค๋ ์ธ๋ถ ์ฐธ์กฐ๋ฅผ ํ์ง ์์ต๋๋ค.
์ด ์ ํฌ์คํ ์์ ๋งํ ์ธ๋ถ/๋ด๋ถ ํด๋์ค์์๋ ์ ๊ทํ๋ this๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๊นฅ ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ์ฐธ์กฐํ ์ ์์์ต๋๋ค.
static class๋ ์ธ๋ถ ์ฐธ์กฐ๋ฅผ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๊ทํ๋ this ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋นจ๊ฐ์ค๋ก ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฆ, ์คํ์์ ์ผํ์ฉ์ผ๋ก ์ฌ์ฉ๋ Outer ํด๋์ค ๊ฐ์ฒด๋ static Inner class์ ๊ฐ์ฒด์ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์๋๊ฒ ๋๋ฏ๋ก, ์ ์์ ์ผ๋ก GC ์๊ฑฐ ๋์์ด ๋์ด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ ๋ ๊ฒ์ ๋๋ค.
์ ๋ฆฌ
- inner ํด๋์ค๋ฅผ ์ ์ธํ ๋ static ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์ง ์์ผ๋ฉด '์ธ๋ถ ์ฐธ์กฐ' ํ์์ด ๋ฐ์ํฉ๋๋ค.
- inner ํด๋์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฐ์ ์ ์ผ๋ก ๋ง๋ค์๋ Outer ํด๋์ค ์ธ์คํด์ค๊ฐ ์ ์์ ์ผ๋ก GC ์๊ฑฐ๊ฐ ๋์ง ์์. ( Inner Class ๊ฐ Outer ํด๋์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ GC์ ๋์์ผ๋ก ์ผ์ง ์๊ธฐ ๋๋ฌธ์)
๋ฐ๋ผ์ ๋ด๋ถ ํด๋์ค๊ฐ ์ธ๋ถ ํด๋์ค์ ๋ฉค๋ฒ๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐ๋์ ๋ด๋ถ ํด๋์ค๋ฅผ ์ ์ธ ํ ๋๋ static ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํฉ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Collection Framework - List Interface (1) | 2023.10.04 |
---|---|
[Java] ์ปฌ๋ ์ ํ๋ ์์ํฌ์ Collection Interface์ ๋ํด (0) | 2023.10.04 |
[Java] ๋ด๋ถ ํด๋์ค(Inner class)์ ๋ํด (0) | 2023.10.03 |
[Java] ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ ๋คํ์ฑ๊ณผ ํ์ฉ (1) | 2023.10.02 |
[Java] ์ธํฐํ์ด์ค์ ์ฉ๋(usage)์ ๋ํด (0) | 2023.10.02 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422