개발 지식, 슀크립트/Java 문법

6-5클래슀(μΈμŠ€ν„΄μŠ€ 멀버와 정적 멀버)

μ‹œνλ¦¬ν‹°μ§€ν˜Έ 2023. 10. 2. 15:31

μΈμŠ€ν„΄μŠ€ 멀버 : μΈμŠ€ν„΄μŠ€ λ©€λ²„λž€ 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•œ ν›„ μ‚¬μš©ν•  수 μžˆλŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό λ§ν•˜λŠ”λ°, 이듀을 각각 μΈμŠ€ν„΄μŠ€ ν•„λ“œ, μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œλΌκ³  λΆ€λ₯Έλ‹€. μΈμŠ€ν„΄μŠ€ ν•„λ“œμ™€ λ©”μ†Œλ“œλŠ” 객체에 μ†Œμ†λœ 멀버이기 λ•Œλ¬Έμ— 객체 μ—†μ΄λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

 

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 ν•„λ“œλŠ” κ°μ²΄λ§ˆλ‹€ μ‘΄μž¬ν•˜μ§€ μ•Šκ³  ν΄λž˜μŠ€μ—λ§Œ μ‘΄μž¬ν•œλ‹€. 그리고 ν•œ 번 μ΄ˆκΈ°κ°’μ΄ μ €μž₯되면 λ³€κ²½ν•  수 μ—†λ‹€.

 

*μƒμˆ˜ 이름은 λͺ¨λ‘ λŒ€λ¬Έμžλ‘œ μž‘μ„±ν•˜λŠ” 것이 관둀이닀. λ§Œμ•½ μ„œλ‘œ λ‹€λ₯Έ 단어가 ν˜Όν•©λœ 이름이라면 언더바(_)둜 단어듀을 μ—°κ²°ν•΄μ€€λ‹€.