๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

6-5ํด๋ž˜์Šค(์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„์™€ ์ •์  ๋ฉค๋ฒ„)

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2023. 10. 2.

์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„ : ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๋ž€ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งํ•˜๋Š”๋ฐ, ์ด๋“ค์„ ๊ฐ๊ฐ ์ธ์Šคํ„ด์Šค ํ•„๋“œ, ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ธ์Šคํ„ด์Šค ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์— ์†Œ์†๋œ ๋ฉค๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ์—†์ด๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

this : ๊ฐ์ฒด ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ๋„ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด this๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž์‹ ์  '๋‚˜'๋ผ๊ณ  ๊ฐ€๋ฆฌํ‚ค๋“ฏ์ด ๊ฐ์ฒด๋Š” ์ž์‹ ์„ this๋ผ๊ณ  ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ this.model์€ ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” model ํ•„๋“œ๋ผ๋Š” ๋œป์ด๋‹ค. this๋Š” ์ฃผ๋กœ ์ƒ์„ฑ์ž์™€ ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ํ•„๋“œ์™€ ๋™์ผํ•œ ๊ฒฝ์šฐ, ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„์ธ ํ•„๋“œ์ž„์„ ๋ช…์‹œํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

ex)

Car(String model) {

  this.model = model;

}

void setModel(String model){

  this.model = model;

}

 

์ •์  ๋ฉค๋ฒ„(static) : ์ •์ ์€ '๊ณ ์ •๋œ'์ด๋ž€ ์˜๋ฏธ์ด๋‹ค. ์ •์  ๋ฉค๋ฒ„๋Š” ํด๋ž˜์Šค์— ๊ณ ์ •๋œ ๋ฉค๋ฒ„๋กœ์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งํ•œ๋‹ค. ์ด๋“ค์„ ๊ฐ๊ฐ ์ •์  ํ•„๋“œ, ์ •์  ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

์ •์  ๋ฉค๋ฒ„ ์„ ์–ธ: ์ •์  ํ•„๋“œ์™€ ์ •์  ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋ ค๋ฉด ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ ์„ ์–ธ ์‹œ static ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ถ™์ด๋ฉด ๋œ๋‹ค.

 

์ •์  ๋ฉค๋ฒ„ ์‚ฌ์šฉ

ex)

public class Calculator {

  static double pi = 3.14159;

  static int plus(int x, int y) {...}

  static int minus(int x, int y) {...}

}

 

์ •์  ํ•„๋“œ pi์™€ ์ •์  ๋ฉ”์†Œ๋“œ plus(), minus()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

double result1 = 10 * 10 * Calcultor.pi;

int result2 = Calculator.plus(10, 5);

int result3 = Calculator.minus(10, 5);

 

์ •์  ํ•„๋“œ์™€ ์ •์  ๋ฉ”์†Œ๋“œ๋Š” ์›์น™์ ์œผ๋กœ ์œ„์ฒ˜๋Ÿผ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ๊ฒฃ ์ฐธ์กฐ ๋ณ€์ˆ˜๋กœ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Calculator myCalcu = new Calculator();

double result1 = 10 * 10 * myCalcu.pi;

int result2 = myCalcu.plus(10, 5);

int result3 = myCalcu.minus(10, 5);

 

ํ•˜์ง€๋งŒ, ์ •์  ์š”์†Œ๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

์ •์  ๋ฉ”์†Œ๋“œ ์„ ์–ธ ์‹œ ์ฃผ์˜ํ•  ์ 

๊ฐ์ฒด๊ฐ€ ์—†์–ด๋„ ์‹คํ–‰๋œ๋‹ค๋Š” ํŠน์ง• ๋•Œ๋ฌธ์— ์ •์  ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” ์ด๋“ค ๋‚ด๋ถ€์— ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋‚˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ ๊ฐ์ฒด ์ž์‹ ์˜ ์ฐธ์กฐ์ธ this ํ‚ค์›Œ๋“œ๋„ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

public class ClassName {

  //์ธ์Šคํ„ด์Šค ํ•„๋“œ์™€ ๋ฉ”์†“

  int field1;

  void method1() {...}

 

//์ •์  ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ

  static int field2;

  static void method2() {...}

 

  //์ •์  ๋ฉ”์†Œ๋“œ

  static void method3() {

    this.field1 = 10; //(x)

    this.method1() //(x)

    field2 = 10;//(o) --> ๊ฐ™์€ static์€ ๊ฐ™์€ class์ผ ๊ฒฝ์šฐ ๋ฐ”๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅ

    method2();//(o)

    }

}

 

 

์ •์  ๋ฉ”์†Œ๋“œ์—์„œ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ์ฒด๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•˜๊ณ  ์ฐธ์กฐ ๋ณ€์ˆ˜๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

static void method3() {

  ClassName obj = new ClassName();

  obj.field1 = 10;

  obj.method1();

}

 

์‹ฑ๊ธ€ํ†ค

๊ฐ€๋” ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ๋งŒ๋“ค๋„๋ก ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋œ๋‹ค๊ณ  ํ•ด์„œ ์ด ๊ฐ์ฒด๋ฅผ ์‹ฑํดํ†ค์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์‹ฑ๊ธ€ํ†ค์„ ๋งŒ๋“ค๋ ค๋ฉด ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋„๋ก ๋ง‰์•„์•ผ ํ•œ๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋ ค๋ฉด ์ƒ์„ฑ์ž ์•ž์— private ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ž์‹ ์˜ ํƒ€์ž…์ธ ์ •์  ํ•„๋“œ๋ฅผ ํ•˜๋‚˜ ์„ ์–ธํ•˜๊ณ  ์ž์‹ ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋Š” new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ •์  ํ•„๋“œ๋„ private ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ๋ถ™์—ฌ ์™ธ๋ถ€์—์„œ ํ•„๋“œ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๋Š”๋‹ค. ๋Œ€์‹  ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  ๋ฉ”์†Œ๋“œ์ธ getInstance()๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ •์ ํ•„๋“œ์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ž์‹ ์˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

 

ex)

//์ •์  ํ•„๋“œ

private static ํด๋ž˜์Šค singleton = new ํด๋ž˜์Šค();

 

//์ƒ์„ฑ์ž

pirvate ํด๋ž˜์Šค() {}

 

//์ •์  ๋ฉ”์†Œ๋“œ

static ํด๋ž˜์Šค getInstance() {

  return singleton;

}

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด

 

ํด๋ž˜์Šค ๋ณ€์ˆ˜1 = ํด๋ž˜์Šค.getInstance();

ํด๋ž˜์Šค ๋ณ€์ˆ˜2 = ํด๋ž˜์Šค.getInstance();

 

์—์„œ, ๋ณ€์ˆ˜1 ์ด๋ž‘ ๋ณ€์ˆ˜2 ๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

 

final ํ•„๋“œ์™€ ์ƒ์ˆ˜

final ํ•„๋“œ : final์€ '์ตœ์ข…์ '์ด๋ž€ ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด final ํ•„๋“œ๋Š” ์ตœ์ข…์ ์ธ ํ•„๋“œ๋ž€ ๋œป์ธ๋ฐ, final ํ•„๋“œ๋Š” ์ดˆ๊ธฐ๊ฐ’์ด ์ €์žฅ๋˜๋ฉด ์ด๊ฒƒ์ด ์ตœ์ข…์ ์ธ ๊ฐ’์ด ๋˜์–ด์„œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๋„์ค‘์— ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ƒ์ˆ˜: ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆ๋ณ€์˜ ๊ฐ’์„ ์ƒ์ˆ˜(static final)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋ถˆ๋ณ€์˜ ๊ฐ’์€ ์ˆ˜ํ•™์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์›์ฃผ์œจ ํŒŒ์ด๋‚˜ ์ง€๊ตฌ์˜ ๋ฌด๊ฒŒ ๋ฐ ๋‘˜๋ ˆ ๋“ฑ์ด ํ•ด๋‹น๋œ๋‹ค. ์ด๋Ÿฐ ๋ถˆ๋ณ€์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํ•„๋“œ๋ฅผ ์ž๋ฐ”์—์„œ๋Š” ์ƒ์ˆ˜(constant)๋ผ๊ณ  ํ•œ๋‹ค.

 

final ํ•„๋“œ๋Š” ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™” ๋˜๋ฉด ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ํ•„๋“œ์ด์ง€๋งŒ, ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ด์œ ๋Š” ์ƒ์ˆ˜๋Š” ๋ถˆ๋ณ€์˜ ๊ฐ’์ด๋ฉฐ, ๊ฐ์ฒด๋งˆ๋‹ค ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ณต์šฉ์„ฑ์„ ๋ ๊ณ  ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ์ƒ์ˆ˜๋Š” static์ด๋ฉด์„œ final์ด์–ด์•ผ ํ•œ๋‹ค. static final ํ•„๋“œ๋Š” ๊ฐ์ฒด๋งˆ๋‹ค ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค์—๋งŒ ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋ฒˆ ์ดˆ๊ธฐ๊ฐ’์ด ์ €์žฅ๋˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

 

*์ƒ์ˆ˜ ์ด๋ฆ„์€ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ด๋‹ค. ๋งŒ์•ฝ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ์–ด๊ฐ€ ํ˜ผํ•ฉ๋œ ์ด๋ฆ„์ด๋ผ๋ฉด ์–ธ๋”๋ฐ”(_)๋กœ ๋‹จ์–ด๋“ค์„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

๋Œ“๊ธ€