-
์ฐธ์กฐ์๋ฃํ - static ๋ฉ์๋์ ์ผ๋ฐ ๋ฉ์๋์ ์ฐจ์ด, static ๋ธ๋ก, Pass by value, Pass by reference, ํน์ดํ ๋งค๊ฐ ๋ณ์์นดํ ๊ณ ๋ฆฌ ์์ 2022. 3. 22. 00:00
์๋ ํ์ธ์,
์ด๋ฒ ์๊ฐ์๋ ์ฐธ์กฐ์๋ฃํ์ ๋ํด ์ด์ด์ ๊ณ์ ์์๋ณด๊ฒ ์ต๋๋ค.
โก ๊ธฐ๋ณธ์์ฑ์
โก ๋ฉ์๋ overloading
โก return (๋ฉ์๋์์ ๊ฐ ๋๊ฒจ์ฃผ๊ธฐ)
โฃ static ๋ฉ์๋์ ์ผ๋ฐ ๋ฉ์๋์ ์ฐจ์ด
โฃ static ๋ธ๋ก
โฃ Pass by value, Pass by reference
โฃ ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ๋ ํน์ดํ ๋ฐฉ๋ฒ์ง๋ ์๊ฐ๊น์ง๋ ์ ์ฒด ํญ๋ชฉ ์ค์์ ์์ 3๊ฐ์ง๋ฅผ ๋ณด์๊ณ , ์ง๊ธ๋ถํฐ๋ ์๋์ 4๊ฐ์ง ์ฒดํฌ ๋ ์ฃผ์ ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค. :)
์ง๋ ๊ฒ์๊ธ์ ์๋๋ฅผ ํด๋ฆญํด ์ฃผ์ธ์!
https://mong-dev.tistory.com/12
static ๋ฉ์๋์ ์ผ๋ฐ ๋ฉ์๋์ ์ฐจ์ด
๊ฐ๋จํ๊ฒ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ํต์ฌ๋ง ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
public class ReferenceStatic { //static ๋ฉ์๋๋ ํด๋์ค ๋ณ์๋ง ์ฌ์ฉํ ์ ์๋ค. static String name = "Name"; //String name = "Min"; //--> ์ปดํ์ผ ์๋ฌ(non-static variable name cannot be referenced from static context) public static void main(String args[]) { ReferenceStatic.staticMethod1(); //๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ๋ฐ๋ก ๋ฉ์๋๋ฅผ ํธ์ถ } //์์น : ๋ฆฌํดํ์ ์์ static ์ ์ธ public static void staticMethod1() { System.out.println("This is a staticMethod."); } public static void staticMethod2() { System.out.println(name); } }
์์ ์ฝ๋๋ฅผ ์ ๋ฆฌํ์๋ฉด,
1. static ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. (main ์ฐธ๊ณ )
2. static ๋ฉ์๋๋ ํด๋์ค ๋ณ์๋ง ์ฌ์ฉํ ์ ์๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. (StaticMethod2 ์ฐธ๊ณ : ์ธ์คํด์ค ๋ณ์๋ก ์ ์ธํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค --> ๋ฉ์๋์์ static ์ ์ธ์ ์ ๊ฑฐํ๋์ง, (๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ ํธ์ถํด์ผํ๋ค.) ์ธ์คํด์ค ๋ณ์์ static์ ๋ถ์ฌ ํด๋์ค ๋ณ์๋ก ๋ฐ๊ฟ์ค์ผํ๋ค.)
๊ทธ๋ฐ๋ฐ, ๊ทธ๋ ๋ค๊ณ ํด์ ์๋ฌด๋๋ ํด๋์ค ๋ณ์๋ฅผ ์ ์ธํด์ ์ฌ์ฉํ๋ฉด ์์์น ๋ชปํ ์ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ํด๋น ๋ด์ฉ์ ๋ง๋ฌด๋ฆฌํ๊ฒ ์ต๋๋ค :)
public class ReferenceStaticVariable { static String name; public ReferenceStaticVariable() {} public ReferenceStaticVariable(String name) { this.name = name; } public static void main(String args[]) { ReferenceStaticVariable reference = new ReferenceStaticVariable(); reference.checkName(); } public void checkName() { ReferenceStaticVariable reference1 = new ReferenceStaticVariable("Sangmin"); System.out.println(reference1.name); ReferenceStaticVariable reference2 = new ReferenceStaticVariable("Sungchoon"); System.out.println(reference1.name); } }
๋จผ์ ์์ ์ฝ๋๋ฅผ ์ญ ๋ณด์๋ฉด, name์ ํ์ฌ ํด๋์ค ๋ณ์๋ก ์ ์ธ๋์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๊ฐ์ง ์์ฑ์์ ๋ฉ์ธ ๋ฉ์๋๋ฅผ ์ง๋๊ณ ๋ณด๋ฉด checkName() ์ด๋ผ๋ ๋ฉ์๋๊ฐ ์์ต๋๋ค. ํด๋น ๋ฉ์๋๋ฅผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ reference1๊ณผ reference2๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์๋๊ฒ์ ๋ณผ ์ ์๊ณ , ๊ฐ์ ๋ค๋ฅธ Sangmin๊ณผ Sungchoon์ด๋ผ๋ name๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ํ์ฌ ์์ฑ์๋ฅผ ํธ์ถํ๊ณ ์์ต๋๋ค. ํด๋น ์์ฑ์๋ฅผ ๋ณด์๋ฉด, ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ name์ ํด๋์ค ๋ณ์์ธ name์ ์ ์ฅ์ ํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ this๋ "์ด ๊ฐ์ฒด"๋ผ๋ ์๋ฏธ๋ก ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ๋งค๊ฐ๋ณ์์ ์ธ์คํด์ค ๋ณ์ ํน์ ํด๋์ค ๋ณ์๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด์ ์ฐ๋ ํํ์ ๋๋ค. ์ฆ ๋งค๊ฐ๋ณ์์ name์ด ์๋ ์ด ๊ฐ์ฒด์ name์ด๋ผ๊ณ ๋งํด์ฃผ๊ณ ์๋ ๊ฒ์ ๋๋ค. ๋ค์ checkName()์ผ๋ก ๋์์์ ๋ณด์๋ฉด, ์ถ๋ ฅ๋ถ๋ถ์์ ์ฒ์์ reference1์ name์ ํธ์ถํ์ต๋๋ค. ๊ทธ๋ฌ๊ณ ๋์, reference2๋ฅผ ์์ฑ ํ, ๋ค์ reference1์ name์ ์ถ๋ ฅํ์ต๋๋ค. ๊ธฐ์กด์๋ ์ด ๋ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ reference2๊ฐ ์์ฑ๋๋๋ผ๋, reference1์ name์ ๊ทธ๋๋ก Sangmin์ด์ด์ผ๊ฒ ์ง์. ๊ทธ๋ฐ๋ฐ ํด๋น ํธ์ถ์ ๊ฒฐ๊ณผ๋ Sangmin๊ณผ Sungchoon์ด ๋ฉ๋๋ค.
์๊ทธ๋ด๊น์?
์๋ํ๋ฉด ReferenceStaticVariable์ name์ด๋ผ๋ ๋ณ์๊ฐ ์ธ์คํด์ค ๋ณ์๊ฐ ์๋ static์ผ๋ก ์ ์ธํ ํด๋์ค ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ, ํด๋์ค ๋ณ์๊ฐ ๋๋ฉด, ๋ชจ๋ ๊ฐ์ฒด์์ ํ๋์ ๊ฐ์ ๋ฐ๋ผ๋ณด๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ static์ ์๋ฌด๋๋ ๋ถ์ด๋ฉด ์ํํ ์ ๋ ์๊ฒ ์ต๋๋ค. ReferenceStaticVariable์ name ์ ์ธ๋ถ์์ static์ ์ ๊ฑฐํ๊ณ ์ปดํ์ผ ํ ์คํํด๋ณด๋ฉด Sangmin Sangmin์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์๋ ์๊ฐํ๋ ๋ต์ด ๋์ฌ ๊ฒ์ ๋๋ค.
static ๋ธ๋ก
static์ ํน์ดํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ํ๊ฐ์ง ์์ต๋๋ค.
์๋์ ๊ฐ์ด static { ... } ์ด๋ ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ธ๋ฐ์, ์๋ ์ฝ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉฐ static ๋ธ๋ก์ ๋ํด ์งง๊ฒ ์์ฝํ๊ฒ ์ต๋๋ค.
public class StaticBlock { //ํด๋์ค ๋ณ์ static int data=1; //์์ฑ์ public StaticBlock() { System.out.println("StaticBlock Constructor."); } //static๋ธ๋ก static { System.out.println("*** First static block. ***"); data = 3; } //static๋ธ๋ก static { System.out.println("*** Second static block. ***"); data = 5; } //static ๋ฉ์๋ public static int getData() { return data; } }
public class StaticBlockCheck{ public static void main (String[] args) { StaticBlockCheck check = new StaticBlockCheck(); //check.makeStaticBlockObject(); check.makeStaticBlockObjectWithData(); } public void makeStaticBlockObject() { System.out.println("Creating block1"); StaticBlock block1 = new StaticBlock(); System.out.println("Created block1"); System.out.println("--------------------"); System.out.println("Creating block2"); StaticBlock block2 = new StaticBlock(); System.out.println("Created block2"); } public void makeStaticBlockObjectWithData() { System.out.println("data=" + StaticBlock.getData()); StaticBlock block1 = new StaticBlock(); block1.data = 1; System.out.println("---------------------"); StaticBlock block2 = new StaticBlock(); block2.data = 2; System.out.println("data=" + StaticBlock.getData()); } }
makeStaticBlockObject()๋ฅผ ์ถ๋ ฅํ ๊ฒฐ๊ณผ :
Creating block1
*** First static block. ***
*** Second static block.
*** StaticBlock Constructor.
Created block1
--------------------
Creating block2
StaticBlock Constructor.
Created block2makeStaticBlockObjectWithData()๋ฅผ ์ถ๋ ฅํ ๊ฒฐ๊ณผ :
*** First static block. ***
*** Second static block. ***
data=5
StaticBlock Constructor.
---------------------
StaticBlock Constructor.
data=2์ ๋ฆฌ ์์ฝ์ ์ํ ๊ธ์ด๋ผ ์ฝ๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ๋จํ๊ฒ ํต์ฌ๋ง ์์ฝํ๊ฒ ์ต๋๋ค.
ํด๋น ์ฝ๋๋ฅผ ์ง์ ์ ๋ ฅํด๋ณด์๊ณ , ์คํํด๋ณด์๋ฉด ์ดํด๊ฐ ์ฌ์ธ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค :)
1. static ๋ธ๋ก์ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ ์ธํ ์ ์๋ค.
2. static ๋ธ๋ก์ ์ ์ธํ ์์๋๋ก ๋ธ๋ก๋ค์ด ์ฐจ๋ก๋๋ก ํธ์ถ ๋๋ค.
3. static ๋ธ๋ก์ ๋ฑ ํ ๋ฒ์ฉ๋ง ํธ์ถ๋๋ค.
4. static ๋ธ๋ก์ ์์ฑ์๊ฐ ํธ์ถ ๋๊ธฐ ์ ์ ํธ์ถ๋๋ค.
5. static ๋ธ๋ก ์์์๋ staticํ ๊ฒ๋ค๋ง ํธ์ถํ ์ ์๋ค. (์ธ์คํด์ค ๋ณ์X, ํด๋์ค ๋ณ์O)
6. static ๋ธ๋ก์ ํด๋์ค ๋ด, ๋ฉ์๋ ๋ฐ์์ ์ ์ธํ๋ค.3๋ฒ์ ๊ฒฐ๊ณผ์ฒ๋ผ static ๋ธ๋ก์ ๊ฐ์ฒด๋ ์ฌ๋ฌ ๊ฐ ์์ฑํ์ง๋ง, ํ ๋ฒ๋ง ํธ์ถ๋์ด์ผ ํ๋ ์ฝ๋๊ฐ ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
Pass by Value, Pass by reference
๋ ๊ฐ์ง ๊ฐ๋ ์ ํต์ฌ ์ฐจ์ด๋ฅผ ํ๋ก ๊ฐ๋จํ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
Pass by Value Pass by reference ๋๊ฐ ๊ธฐ๋ณธ ์๋ฃํ ์ฐธ์กฐ ์๋ฃํ ๋ฌด์์ ์ ๋ฌ ๊ฐ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ ํธ์ถ ์ดํ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ ๋์ง ์๋๋ค. ๋ง์ฝ ๋งค๊ฐ ๋ณ์๋ก ๋ฐ์ ์ฐธ์กฐ ์๋ฃํ ์์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ, ํธ์ถํ ์ฐธ์กฐ ์๋ฃํ ์์ ์๋ ๊ฐ์ฒด๋ ํธ์ถ๋ ๋ฉ์๋์์ ๋ณ๊ฒฝํ ๋๋ก ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ค. ์์๋ก ๋ณด๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ํด, ์๋์ ์ฝ๋์ ์ฃผ์์ ์ฐธ๊ณ ํ์ธ์ :)
public class ReferencePass { public static void main(String args[]) { ReferencePass reference = new ReferencePass(); //reference.callPassByValue(); reference.callPassByReference(); } public void callPassByValue() { int a = 10; String b = "b"; System.out.println("before passByValue"); System.out.println("a=" + a); System.out.println("b=" + b); //pass by value : ๊ฐ๋ง ์ ๋ฌํ๋ค. --> ๊ธฐ๋ณธ์ฐธ์กฐํ! //์๋์ a,b๋ ๊ทธ๋๋ก ๋๊ณ , ํด๋นํ๋ ๊ฐ๋ง ์ ๋ฌํ๋ค. passByValue(a,b); System.out.println("after passByValue"); System.out.println("a=" + a); System.out.println("b=" + b); } public void passByValue(int a, String b) { a=20; b="z"; System.out.println("in passByValue"); System.out.println("a=" + a); System.out.println("b=" + b); } public void callPassByReference() { MemberDTO member = new MemberDTO("Sangmin"); System.out.println("before passByReference"); System.out.println("member.name=" + member.name); passByReference(member); System.out.println("after passByReference"); System.out.println("member.name=" + member.name); } public void passByReference(MemberDTO member) { //๋งค๊ฐ ๋ณ์๋ก ๋ฐ์ ์ฐธ์กฐ ์๋ฃํ ์์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ, //ํธ์ถํ ์ฐธ์กฐ ์๋ฃํ ์์ ์๋ ๊ฐ์ฒด๋ ํธ์ถ๋ ๋ฉ์๋์์ ๋ณ๊ฒฝํ ๋๋ก ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ค. member.name = "SungChoon"; System.out.println("in passByReference"); System.out.println("member.name=" + member.name); } }
์ฐธ๊ณ ๋ก, String์ b="z"; ์ด๋ฐ์์ผ๋ก ๋ฐ์ดํ๋ก ๊ฐ์ ํ ๋นํ๋ฉด b=new String("z"); ์ด๋ ๊ฒ new๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. String์ด ์๋ ๋ค๋ฅธ ์ฐธ์กฐ ์๋ฃํ๋ค๋ ์ด์ฒ๋ผ ํธ์ถ๋ ๋ฉ์๋์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋์ฒดํ์ฌ ์ฒ๋ฆฌํ๋ฉด ๊ธฐ์กด ๊ฐ์ ๋ฐ๋์ง ์์ต๋๋ค.
์ ๋ฆฌ๋ฅผ ํ์๋ฉด,
- ๋ชจ๋ ๊ธฐ๋ณธ ์๋ฃํ์ Pass by Value์ด๋ค.
- ์ฐธ์กฐ ์๋ฃํ์ ๊ฐ์ด ์๋ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋๋ Pass by Reference์ด๋ค.๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ๋ ํน์ดํ ๋ฐฉ๋ฒ
์ ๋ชฉ์์ ํน์ดํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ๋๋ฐ, ์ฌ๊ธฐ์๋ "๋งค๊ฐ ๋ณ์๊ฐ ๋ช ๊ฐ๊ฐ ๋ ์ง, ํธ์ถํ ๋๋ง๋ค ๋ฐ๋๋ ๊ฒฝ์ฐ"์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํฉ๋๋ค.
์๋ฐ์์๋ ์์ ๊ฐ์์ ๋งค๊ฐ ๋ณ์๋ฅผ ๋๊ฒจ์ค ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋๋ฐ, "ํ์ ...๋ณ์๋ช "์ผ๋ก ์ ์ธํด์ฃผ๋ฉด๋ฉ๋๋ค.
public void calculateNumbers(int...numbers) { int total=0; //numbers๋ฅผ ๋ฐฐ์ด๋ก ์ธ์ for(int number:numbers) { total+=number; } System.out.println("Total=" + total); }
์์ ์ฝ๋ ์ฒ๋ผ, ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํด์ฃผ๋ฉด numbers๋ฅผ ๋ฐฐ์ด๋ก ์ธ์ํฉ๋๋ค. ํธ์ถ์ calculateNumbers(1,2,3,4,5); ์ด๋ฐ์์ผ๋ก ํ๋ฉด ๋ฉ๋๋ค. ๋ฌผ๋ก calculateNumbers(1); calculateNumbers(1,2,3,4,5,6,7,8); ์ด๋ ๊ฒ๋ ๋ค ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ฆ, ํ์์ ๋ฐ๋ผ์ ๋งค๊ฐ ๋ณ์ ์๋ฅผ ์ ํ๊ธฐ ์ ๋งคํ ๊ฒฝ์ฐ ํ์ ๊ณผ ๋ณ์๋ช ์ฌ์ด์ ์ ์ธ๊ฐ๋ฅผ ์ฐ๋ฌ์ ์ ๋ ฅํด์ฃผ๋ฉด ๋๋๋ฐ, ์ด๋ ์ฃผ์ํด์ผํ ๊ฒ์ ์ ์ ์ค๊ฐ์ ๊ณต๋ฐฑ์ด ๋ค์ด๊ฐ๋ฉด ์๋ฉ๋๋ค. ๋ํ ํ๋์ ๋ฉ์๋์์๋ ํ ๋ฒ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ , ์ฌ๋ฌ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ค๋ฉด, ๊ฐ์ฅ ๋ง์ง๋ง์ ์ ์ธํด์ผ๋ง ํฉ๋๋ค.
์ด ๊ฒ์ ๊ฐ์ฅ ์ฌ์ด ์๋ printf() ๋ฉ์๋๊ฐ ์์ต๋๋ค. ๋ฌด์์ธ์ง ์์๊ฒ ์ฃ ?
printf(String format, Object... args)
๊ฐ์ฅ ์์๋ ์ถ๋ ฅํ๋ ํฌ๋งท์ ์ ์ธํ๊ณ , ๊ทธ๋ค์๋ Object๋ผ๋ ํ์ ์ args๋ผ๋ ๊ฒ์ ์์ ๊ฐ์๋งํผ ๋ฐ์ต๋๋ค.
์ด๋ ๊ฒ ์ฐธ์กฐ ์๋ฃํ์ ์ค์ฌ์ ์ด๋ฃจ๋ ์์ฑ์์ ๋ฉ์๋์ ๋ํด ์์๋ณด์์ต๋๋ค.
์ ๋ ๊ณต๋ถํ๋ฉด์, ์ ๋ชจ๋ฅด๊ฑฐ๋ ์ ๋งคํ ๋ถ๋ถ๋ค์ด ์์๋๊ฒ ๊ฐ์๋ฐ, ์ด๋ฒ ๊ธฐํ๋ฅผ ํตํด ์ข๋ ๊ธฐ์ด๋ฅผ ํํํ ํ๋ ๊ณ๊ธฐ๊ฐ ๋์๋๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ผ ๋ค์์ ๋ ๋ค๋ฅธ ๋ด์ฉ์ผ๋ก ๋ต๊ฒ ์ต๋๋ค,
๊ฐ์ฌํฉ๋๋ค :)