< ์ด์ ํฌ์คํ - ์ธ์คํด์ค, ์์ฑ์ ๊ทธ๋ฆฌ๊ณ ๋งค๊ฐ๋ณ์์ ์ธ์์ ์ฐจ์ด์ >
๐ชฝ
"ํ๋ฆฐ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค."
โบ static
- static์ ์ ์ ์ธ, ๊ณ ์ ๋ ์ด๋ผ๋ ๋ป์ ์ง๋ ๋ค.
- ์ฃผ๋ก ๋ณ์๋ ๋ฉ์๋์ ๋ถ์ธ๋ค.
- ๊ฐ์ฒด ์์ฑ ์์ด ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋๋ฉด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ด์ผ ํด์ ๋๋ค.
- static์ ๋ง์ด ์ฌ์ฉํ๊ฒ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๊ณผ๋ถํ๊ฐ ์ฌ ์ ์๋ค.
- static์ ๋ถ์ด๋ฉด static ์์ญ์(๋ฉ๋ชจ๋ฆฌ) ํ ๋น๋๋ค. โบ ๊ฐ์ด ๊ณ ์ ์ ์ผ๋ก ์ ์ง๋๋ค.
Q. static์ด ๋ถ์์ ๋์ ๋ถ์ง ์์์ ๋ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ?
A. ์ฒซ๋ฒ์งธ ์์ ๋ ๋ณ์์ static์ ๋ถ์์๋์ ์๋๋๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋ค.
<static ์์ญ์ ์ฌ๋ผ๊ฐ ๊ฐ์ด ๊ณ ์ ์ ์ผ๋ก ์ ์ง๋๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์์ >
class Counter {
// static์ ๋ถ์ธ ๋ณ์ count
// ๋ณ์ count๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
static int count = 0;
// ๋ฉ์๋ Counter
// ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ๋ณ์ count๋ ++์ฆ๊ฐํ๋ค.
Counter() {
count++;
System.out.println("Count : " + count);
}
}
public class Main {
public static void main(String[] args) {
// ์ธ์คํด์ค c1๊ณผ c2, c3๊ฐ ์์ฑ๋์๋ค.
// Counter ๋ฉ์๋๊ฐ ์คํ๋๊ณ , ๋ฉ์๋ ๋ด count++;๋ ์คํ๋๋ค.
Counter c1 = new Counter(); // Count: 1
Counter c2 = new Counter(); // Count: 2
Counter c3 = new Counter(); // Count: 3
}
}
์์ ์์ ์์๋ static์ด ๋ถ์ ๋ณ์์ ๋ํด ๋ณด์ฌ์ฃผ๊ณ ์๋ค. static์ static ์์ญ์ ํ ๋น๋์ด ๊ฐ์ด ๊ณ ์ ์ ์ผ๋ก ์ ์ง๋๋ค๊ณ ํ๋ค. ๊ทธ ๋ง์ ์์ ์์ ์ฒ๋ผ c1๊ณผ c2, c3๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ฒ์ด ์๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ count ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ ๊ฑธ ์๋ ค์ค๋ค.
class Counter {
// static์ด ์ ๊ฑฐ๋ ๋ณ์
// ์ธ์คํด์ค ๋ณ์๊ฐ ๋์๋ค.
int count = 0;
// ๋ฉ์๋ Counter
// ๋ฉ์๋๊ฐ ์คํ๋๋ฉด ๋ณ์ count๊ฐ ์ฆ๊ฐํ๋ค.
Counter() {
count++;
System.out.println("Count: " + count);
}
}
public class Main {
public static void main(String[] args) {
// ์ธ์คํด์ค c1, c2, c3๊ฐ ์์ฑ๋๋ฉฐ Counter ๋ฉ์๋๊ฐ ์คํ๋๋ค.
Counter c1 = new Counter(); // Count: 1
Counter c2 = new Counter(); // Count: 1
Counter c3 = new Counter(); // Count: 1
}
}
๋ณ์์์ static์ด ์ฌ๋ผ์ง ์์ ๋ค. ๋ณ์์ static์ด ์๊ธฐ ๋๋ฌธ์ ๋ณ์ ๊ฐ์ด ๊ณต์ ๋์ง ์๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ธ์คํด์ค c1๊ณผ c2, c3๋ ๊ฐ๋ณ์ ์ผ๋ก ์์ง์ด๊ฒ ๋๊ณ count๋ ๊ฐ๋ณ์ ์ผ๋ก ์ฌ๋ผ๊ฐ์ 1์ด๋ผ๋ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
๋๋ฒ์งธ ์์ ๋ ๋ฉ์๋์ static์ด ์ฌ๋ผ๊ฐ ๊ฒฝ์ฐ ์ด๋ค์์ผ๋ก ์ฐจ์ด๊ฐ ์๋์ง ์ดํด๋ณด๊ฒ ๋ค.
< ๊ฐ์ฒด ์์ฑ ์์ด ์ฌ์ฉํ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์์ >
class Add {
// ๋ฉ์๋ add์ static์ด ๋ถ์๋ค.
static int add(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
// ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์๋ ๋ฉ์๋ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
int sum = Add.add(10, 20);
System.out.println(sum); // 30
}
}
๋ฉ์๋์ static์ ๋ถ์ด๋ Add.add(10,30)์ผ๋ก ๊ฐ์ฒด ์์ฑ ์์ด ๊ฒฐ๊ณผ๊ฐ์ด ์ถ๋ ฅ๋์๋ค.
Add num = new Add();
int sum = num.add(10, 20);
System.out.println("Sum : " + sum);
๋ง์ฝ ๋ฉ์๋์ static์ด ์์ด์ง๋ฉด์ ์ธ์คํด์ค ๋ฉ์๋๋ก ๋ณ๊ฒฝ๋์๋ค. ๊ทธ๋ ๊ธฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผํ๊ณ ๊ทธ ํ ๊ฐ์ฒด๋ฅผ ํตํด ํธ์ถํด์ผ ์ค๋ฅ ์์ด ๊ฒฐ๊ณผ๊ฐ ์ ๋๋ก ์ถ๋ ฅ๋ ์ ์๋ค.
Q. ์ static์ด ๋ถ์ ๋ณ์๋ ๋ฉ์๋๊ฐ ๋ง์์ง๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ณผ๋ถํ๋ฅผ ์ ๋ฐํ ๊น?
A. ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ๊น ์ดํด๋ณด์๋ฉด [ heap ์์ญ / stack ์์ญ / static ์์ญ ] ์ด๋ ๊ฒ ์ธ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค. heap ์์ญ์ ์ธ์คํด์ค๋ฅผ ์ฃผ๋ก ๊ด๋ฆฌํ๋ค๊ณ ๋ณด๋ฉด ๋๊ณ , stack ์์ญ์ ๋งค๊ฐ๋ณ์ ํน์ ์ง์ญ๋ณ์๋ฅผ ๊ด๋ฆฌํ๊ณ ์๊ณ , static ์์ญ์ static์ด ๋ถ์ ๋ณ์๋ ๋ฉ์๋๋ฅผ ๊ด๋ฆฌํ๋ค.
heap ์์ญ์ Garbage Collector๊ฐ ์์ด์ ์ฐ์ง ์๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ์์์ ์ ๋ฆฌํด์ค๋ค. ํ์ง๋ง static์ Garbage Collector๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋๋ฉด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๊ธฐ ์ ๊น์ง ํด์ ๋์ง ์๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ static์ ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ๊ฒ๋๋ฉด ๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ณผ๋ถํ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒ์ด๋ค.
โบ final
- ๋ณ์, ๋ฉ์๋, ํด๋์ค์ ์ฌ์ฉ๋๋ค.
- final๊ณผ ํจ๊ป ์ ์ธ๋๋ฉด ๊ทธ ๋์์ ๋ณ๊ฒฝ์ ๊ธ์งํ๋ค.
- final๊ณผ ํจ๊ป ์ ์ธ๋ ๋ณ์๋ ์์๊ฐ ๋๋ค.
- final๊ณผ ํจ๊ป ์ ์ธ๋ ๋ฉ์๋๋ ์ค๋ฒ๋ผ์ด๋๋ฅผ ๊ธ์งํ๋ค.
- final๊ณผ ํจ๊ป ์ ์ธ๋ ํด๋์ค๋ ์์์ ๊ธ์งํ๋ค.
Q. final๊ณผ ํจ๊ป ์ฌ์ฉ๋ ๋ณ์์ ๊ฒฝ์ฐ๋?
A. final์ด ๋ถ์ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ค ํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ์์ ๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ๋ค.
ํ์ฌ ์์ ๋ final์ด ๋ถ์ง ์์ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ด๋ค.
public class Main {
public static void main(String[] args) {
// final์ด ๋ถ์ ๋ณ์
final int a = 10;
// ํ๋ฒํ ๋ณ์
int b = 20;
System.out.println("a : " + a); // a : 10
System.out.println("b : " + b); // b : 20
// ๋ณ์ b์ ๊ฐ๋ง ๋ฐ๊ฟ๋ณด์๋ค.
b = 2;
// final์ด ๋ถ์ง ์์ ๋ณ์ b๋ ์ ์ถ๋ ฅ๋์๋ค.
System.out.println("update b : " + b); // update b : 2
}
}
๊ฒฐ๊ณผ๊ฐ ์ ์ถ๋ ฅ๋์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ์ final์ด ๋ถ์ ๋ณ์๋ฅผ ๋ฐ๊ฟ๋ณด๋๋ก ํ๊ฒ ๋ค.
public class Main {
public static void main(String[] args) {
// final์ด ๋ถ์ ๋ณ์
final int a = 10;
// ํ๋ฒํ ๋ณ์
int b = 20;
System.out.println("a : " + a); // a : 10
System.out.println("b : " + b); // b : 20
a = 1;
b = 2;
System.out.println("update a : " + a);
System.out.println("update b : " + b);
}
}
fianl ๋ณ์(variable) a์๋ ๊ฐ์ ํ ๋นํ ์ ์๋ค๋ ๋ฌธ๊ตฌ์ ํจ๊ป ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
Q. final๊ณผ ํจ๊ป ์ฌ์ฉ๋ ๋ฉ์๋์ ๊ฒฝ์ฐ๋?
A. ์ค๋ฒ๋ผ์ด๋๊ฐ ๋ถ๊ฐํ๋ค. ์ค๋ฒ๋ผ์ด๋๋ ์ฝ๊ฒ ๋งํด ์์๋ฐ์ ๋ฉ์๋๋ฅผ ์ธ์คํด์ค ๋ฉ์๋๋ก ์ฌ์ ์ํ๋ ๊ฒ์ด๋ค. ์ฝ๊ฒ ์ค๋ช ํ์๋ฉด ๋ฉ์๋์ ์ฐ์ธ ์ด๋ฆ์ ๋์ผํ๊ฒ ๊ฐ์ ธ๊ฐ์ ๊ฐ๋ง ๋ฐ๊ฟ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ๋ฌด์์ ์ด๋ฆ์ ๋๊ฐ์ด ์ ์ํ ์ ์๋ ๊ฒ์ ์๋๋ค. ๋งค๊ฐ๋ณ์ ํ์ ํน์ ๊ฐฏ์๊ฐ ๋์ผํ์ง ์์์ผํ๋ค๋ ์กฐ๊ฑด์ด ์๋ค. (๊ทธ ์ธ์๋ ์์)
class Parent {
// final ๋ฉ์๋์ธ fail
public final void fail() {
System.out.println("๊ณผ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊น?");
}
}
// ์์ ํด๋์ค
class Child extends Parent {
// fail ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ๋ค.
@Override
public void fail() {
System.out.println("์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.fail();
}
}
์ด๋ ๊ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ค๋ฅ ๋ฉ์ธ์ง๋ฅผ ์ดํด๋ณด๋ฉด Child ํด๋์ค ์์ ์๋ fail( )์ Parent ํด๋์ค ์์ ์๋ fail ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ ์ ์์ต๋๋ค, ์ฌ์ ์๋ ๋ฉ์๋๋ final์ ๋๋ค. ๋ผ๊ณ ๋์ด์๋ค. ํด๋์ค์ final์ด ๋ถ์ ๊ฒฝ์ฐ๋ ์์์ด ๋ถ๊ฐํ ๊ฒฝ์ฐ๋ ๋์ด๊ฐ๋๋ก ํ๊ฒ ๋ค.
Q. ๊ทธ๋ ๋ค๋ฉด ์ฃผ๋ก final๊ณผ static์ ํจ๊ป ์ฐ๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น?
A. final๊ณผ static์ด ๋ณ์์ ์ ์ธ๋์ด์๋ค๋ฉด ๊ทธ ์๋ฏธ๋ ์ด ๊ฐ์ ํด๋์ค ๋ด์ ๋ค ๊ณต์ ๋๊ณ ์์ผ๋ฉฐ, ์ด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ด ๋ผ๋ ์๋ฏธ๊ฐ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฃผ๋ก ์ด๋์ ์ฌ์ฉ์ด๋ ๊น? ๋ค์ํ ๊ณณ์ ํ์ฉ๋๊ฒ ์ง๋ง, ๋ช ๊ฐ์ง ์๋ฅผ ์๊ฐํด๋ณด๋ฉด ์์ฃผ์จ๊ณผ ๊ฐ์ ์ํ์ ์ธ ๋ถ๋ถ๋ ์๊ณ ํ๋ก๊ทธ๋จ ์ต๋ ์ฌ์ฉ์์ ์๋ฅผ ์ง์ ํด์ผํ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค.
final๊ณผ static์ด ๋ฉ์๋์ ์ ์ธ๋์๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ง๋ค ํ์์์ด ํด๋์ค ์ด๋ฆ์ ์จ์ ๋ฐ๋ก ํธ์ถํ๋ฉด์ ์ด ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉํ๊ฑฐ๋ ๋ฐ๊ฟ ์ ์๋ค๋ ์๋ฏธ๊ฐ ๋๋ค. ์ฝ๊ฒ ๋งํด ๊ฐ์ฒด ์์ด ํธ์ถํ๊ณ ์ฌ์ ์ํ ํ์๊ฐ ์์ ๋ ์ด๋ค๋ ๊ฒ์ด๋ค. ํ์ฉ๋๋ ๊ณณ์ ๋ํด ์๊ฐํด๋ณด๋ฉด ํ์๊ฐ์
์, ์ด๋ฉ์ผ์ ์ ์ผ๋ผ๊ณ ํ์ ๊ฒฝ์ฐ ๊ทธ ์ด๋ฉ์ผ์ ํ์์ด ๋ง๋์ง ๊ฒ์ฆํ ๋ ์ฐ์ผ ์ ์๊ฒ ๋ค.
๊ฒฐ๋ก , ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ์ผ๊ด๋ ๊ฐ์ ์ ์งํ ๋ ์ฌ์ฉํ๋ค.
ํผ์ ๊ณต๋ถํ๋ฉด์ ์ดํดํ๊ณ ์ด ๋ด์ฉ์ด๋ผ ํ๋ฆฐ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค.
๋๊ธ๋ก ์ ์ด๋์๋ฉด ์์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ๐
[ ๋ธ๋ก๊ทธ์ ์ด ๋ด์ฉ๋ค์ ์ถ์ฒ๋ ์๋์ ์ ์ด๋ํ ๋
๋ค์ด๊ฐ์ ์ฝ์ด๋ณด์๋ฉด ๋์ฑ ๋์์ด ๋์ค ๋ฏ ํฉ๋๋ค ]
- static๊ณผ final์ ๊ฐ์ด ์ฌ์ฉํ๋ ์ด์ ์ถ์ฒ
'๐ Java > ์ฉ์ด์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Java ๊ธฐ๋ณธ ์ฉ์ด ์ ๋ฆฌ - ๐ง ์ธ์คํด์ค, ์์ฑ์ ๊ทธ๋ฆฌ๊ณ ๋งค๊ฐ๋ณ์(Parameter)์ ์ธ์(Argument)์ ์ฐจ์ด (1) | 2024.10.07 |
---|---|
๊ธฐ๋ณธ ์ฉ์ด ์ ๋ฆฌ - ๐ง ๋ณ์๋? (0) | 2024.10.05 |