μƒˆμ†Œμ‹

Java

[Java] 05. 클래슀의 멀버

  • -

πŸ“Œ. 클래슀의 멀버

물건을 직접 λ°°λ‹¬ν•΄μ£ΌλŠ” 것과 물건이 μ €μž₯된 μž₯μ†Œλ₯Ό μ•Œλ €μ£ΌλŠ” 것은 차이가 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜μ—κ²Œ 인자λ₯Ό μ „λ‹¬ν•΄μ£ΌλŠ” 방식도 이와 같이 λ‚˜λ‰©λ‹ˆλ‹€.

 


πŸ“Œ I. λ©”μ„œλ“œ 처리 방식

πŸ“š 1. λ©”μ„œλ“œ 호좜 λ©”μ»€λ‹ˆμ¦˜

  1. 각 인수의 ν‘œν˜„μ‹μ€ λ©”μ„œλ“œκ°€ 호좜되기 전에 λ¨Όμ € κ³„μ‚°λ©λ‹ˆλ‹€.
    κ³„μ‚°λœ 결과값은 μž„μ‹œ λ³€μˆ˜μ— μ €μž₯λ©λ‹ˆλ‹€.
  2. κ³„μ‚°λœ 각 μΈμˆ˜κ°’μ€ ν•΄λ‹Ήλ˜λŠ” ν˜•μ‹ λ§€κ°œλ³€μˆ˜μ— μœ„μΉ˜ μˆœμ„œλŒ€λ‘œ λ³΅μ‚¬λ©λ‹ˆλ‹€.
    λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μœΌλ‘œ 인수λ₯Ό νƒ€μž…λ³€ν™˜(μΊμŠ€νŒ…)ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. λ©”μ„œλ“œ 본체의 λ¬Έμž₯은 λ§ˆμ§€λ§‰ λ¬Έμž₯μ΄λ‚˜ return 문이 λ‚˜μ˜€κΈ° μ „κΉŒμ§€ μˆ˜ν–‰λ©λ‹ˆλ‹€.
  4. return 문의 ν‘œν˜„μ‹μ΄ κ³„μ‚°λ©λ‹ˆλ‹€.
    κ³„μ‚°μ˜ 결과값은 λ§ˆμ°¬κ°€μ§€λ‘œ μž„μ‹œλ³€μˆ˜μ— μ €μž₯되고 μž„μ‹œ λ³€μˆ˜μ˜ 값을 호좜츑으둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  5. λ©”μ„œλ“œ ν˜ΈμΆœμΈ‘μ€ λ©”μ„œλ“œ 호좜문 μžλ¦¬μ— return 문으둜 λ„˜κ²¨λ°›μ€ 결과값을 λŒ€μž…ν•©λ‹ˆλ‹€.

πŸ“š 2. λ©”μ„œλ“œ 인자 전달 방식

μΈμˆ˜κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜λŠ” 방식에 λŒ€ν•œ 관점은 두 가지가 μžˆμŠ΅λ‹ˆλ‹€. μΈμˆ˜κ°€ λ§€κ°œλ³€μˆ˜λ‘œ λ³΅μ‚¬λ˜λŠ” 것은 λͺ¨λ‘ λ™μΌν•©λ‹ˆλ‹€. 인수 κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜λŠ” κ°’ 호좜(call by value) 방식과 μ°Έμ‘° λ³€μˆ˜μ˜ 값이 λ³΅μ‚¬λ˜λŠ” μ°Έμ‘° 호좜(call by reference) 방식이 μžˆμŠ΅λ‹ˆλ‹ˆλ‹€. 이 두 방식은 λ§€κ°œλ³€μˆ˜μ˜ μžλ£Œν˜•μ— 따라 λ‚˜λ‰©λ‹ˆλ‹€.

(1) κ°’ 호좜 (call by value)

  • κΈ°λ³Έ μžλ£Œν˜•μ„ λ©”μ„œλ“œλ‘œ ν˜ΈμΆœν•  λ•Œ
  • μ‹€μΈμˆ˜μ˜ 값이 λ§€κ°œλ³€μˆ˜λ‘œ λ³΅μ‚¬λ˜μ–΄ 전달

(2) 참쑰 호좜 (call by reference)

  • λ©”μ„œλ“œ ν˜ΈμΆœμ—μ„œ μ°Έμ‘° μžλ£Œν˜•μ„ μ‹€μΈμˆ˜λ‘œ μ‚¬μš©ν•  λ•Œ
  • 객체의 κ°’ λŒ€μ‹  μ°Έμ‘° λ³€μˆ˜κ°€ 가진 객체에 λŒ€ν•œ 참쑰값을 λ§€κ°œλ³€μˆ˜λ‘œ 전달
  • λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 μ‹€μΈμˆ˜ μ˜μ—­μ„ 직접 μ°Έμ‘°ν•˜μ—¬ 값을 κ³΅μœ ν•  수 있음

πŸ“š 3. 값에 μ˜ν•œ 인수 전달

class Point {
  int x, y;
}

public class Swap1 {
  static void swap(int n1, int n2) {
    int tmp; 
    tmp = n1;
    n1 = n2;
    n2 = tmp;
  }

  public static void main(String[] a){
    Point p = new Point(); // Point νƒ€μž…μ˜ 객체 생성
    p.x = 20; // p의 멀버 λ³€μˆ˜ μ΄ˆκΈ°ν™”
    p.y = 50;
    
    swap(p.x, p.y); //κ°’ λ³€ν™˜μ„ μœ„ν•œ ν•¨μˆ˜ 호좜
		
    System.out.println(p.x + "," + p.y);
  }		
}

λ‹€μŒκ³Ό 같이 κΈ°λ³Έ μžλ£Œν˜•μœΌλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ•„ Point의 두 점의 μ’Œν‘œκ°’μ„ λ°”κΎΈλ €λŠ” ν”„λ‘œκ·Έλž¨μ΄ μžˆλ‹€κ³  μƒκ°ν•΄λ΄…μ‹œλ‹€. 이 ν”„λ‘œκ·Έλž¨μ„ κ°„λ‹¨νžˆ μ€‘μš”ν•œ μ½”λ“œλ§Œ 적어 흐름을 λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

 

  1. λ©”λͺ¨λ¦¬ μ˜μ—­μ— x, y 값을 μ €μž₯ν•˜λŠ” Point 객체 pλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 
    객체의 각 λ©”λͺ¨λ¦¬ κ°’μ—λŠ” . μ—°μ‚°μžλ‘œ μ ‘κ·Όν•©λ‹ˆλ‹€.

  2. main( ) ν•¨μˆ˜ μ˜μ—­μ—μ„œ swap( ) ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. 
    main( ) ν•¨μˆ˜μ—μ„œ swap( ) ν•¨μˆ˜λ‘œ μ œμ–΄ 흐름이 λ„˜μ–΄κ°‘λ‹ˆλ‹€.

  3. swap( ) ν•¨μˆ˜λŠ” 인수둜 객체의 각 값을 볡사 λ°›μ•„, λ§€κ°œλ³€μˆ˜λ‘œ λ³΅μ‚¬ν•©λ‹ˆλ‹€.

  4. swap( ) ν•¨μˆ˜λŠ” λ°˜ν™˜κ°’μ΄ μ—†κΈ° λ•Œλ¬Έμ— λ³€ν™”λ˜λŠ” 깂이 μ—†μŠ΅λ‹ˆλ‹€.
    swap( ) ν•¨μˆ˜κ°€ μ’…λ£Œλ˜κ³  호좜츑으둜 λŒμ•„κ°ˆ λ•Œ ν•¨μˆ˜ μ•ˆμ—μ„œ μ„ μ–Έλœ λ©”λͺ¨λ¦¬λŠ” 사라지기 λ•Œλ¬Έμ— 값은 λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ“š 4. 참쑰에 μ˜ν•œ 인수 전달

class Point {
  int x, y;
}

public class Swap1 {
  static void swap(Point swp) {
    int tmp; 
    tmp = swp.x;
    swp.x = swp.y;
    swp.y = tmp;
  }

  public static void main(String[] a){
    Point p = new Point(); // Point νƒ€μž…μ˜ 객체 생성
    p.x = 20; // p의 멀버 λ³€μˆ˜ μ΄ˆκΈ°ν™”
    p.y = 50;
    
    swap(p); //κ°’ λ³€ν™˜μ„ μœ„ν•œ ν•¨μˆ˜ 호좜
		
    System.out.println(p.x + "," + p.y);
  }		
}

 

μ΄λ²ˆμ—λŠ” μ°Έμ‘° μžλ£Œν˜•μœΌλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ•„ Point의 두 점의 μ’Œν‘œκ°’μ„ λ°”κΎΈλ €λŠ” ν”„λ‘œκ·Έλž¨μ΄ μžˆμŠ΅λ‹ˆλ‹€. 이 ν”„λ‘œκ·Έλž¨μ˜ κ°„λ‹¨ν•œ μ½”λ“œμ™€ 흐름은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

 

  1. λ©”λͺ¨λ¦¬ μ˜μ—­μ— x, y 값을 μ €μž₯ν•˜λŠ” Point 객체 pλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 
    객체의 각 λ©”λͺ¨λ¦¬ κ°’μ—λŠ” .μ—°μ‚°μžλ‘œ μ ‘κ·Όν•©λ‹ˆλ‹€.

  2. main( ) ν•¨μˆ˜ μ˜μ—­μ—μ„œ swap( ) ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. 
    main( ) ν•¨μˆ˜μ—μ„œ swap( ) ν•¨μˆ˜λ‘œ μ œμ–΄ 흐름이 λ„˜μ–΄κ°‘λ‹ˆλ‹€.

  3. swap( ) ν•¨μˆ˜λŠ” 인수둜 μ°Έμ‘°λ³€μˆ˜μ˜ 값을 λ°›μ•„ μ‹€μΈμˆ˜ 값을 μ°Έμ‘°ν•  수 있게 ν•©λ‹ˆλ‹€.

  4. swap( ) ν•¨μˆ˜λ‘œ μ‹€μΈμˆ˜ μ˜μ—­μ„ 직접 μ ‘κ·Όν–ˆκΈ°μ—  return 값이 없어도 μ‹€μ œ 값이 λ°”λ€λ‹ˆλ‹€.

πŸ“š 5. λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©(Overloading)

  • ν•˜λ‚˜μ˜ 클래슀 λ‚΄μ—μ„œ 같은 이름을 가진 λ©”μ„œλ“œκ°€ μ—¬λŸ¬κ°œ μ •μ˜
  • λΉ„μŠ·ν•œ λ™μž‘μ„ ν•˜λŠ” λ‹€μ–‘ν•œ λ©”μ„œλ“œλ“€μ„ μΌκ΄€λ˜κ²Œ μ‘°μž‘
  • ν•¨μˆ˜ ν˜ΈμΆœλ¬Έμ„ λ§Œλ‚˜λ©΄ ν•¨μˆ˜μ˜ 이름, 인수 λͺ©λ‘, 인수 νƒ€μž…μœΌλ‘œ ν•¨μˆ˜ ν˜ΈμΆœμ„ ꡬ뢄
  • 같은 클래슀 λ‚΄μ—μ„œ 같은 이름을 κ°€μ§€λŠ” λ©”μ„œλ“œλ“€λ§Œμ„ 의미, λ‹€λ₯Έ ν΄λž˜μŠ€λŠ” 관계 μ—†μŒ


πŸ“Œ II. this μ°Έμ‘° λ³€μˆ˜

πŸ“š 1. this μ°Έμ‘° λ³€μˆ˜

  • λ©”μ„œλ“œ 호좜 μ‹œ λ©”μ„œλ“œ μžμ‹ μ„ ν˜ΈμΆœν•œ 객체에 λŒ€ν•œ 참쑰값을 λ°›λŠ” λ³€μˆ˜, 즉 객체 μžμ‹ μ— λŒ€ν•œ 레퍼런슀
  • λ©”μ„œλ“œ μ•ˆμ—μ„œ μžμ‹ μ˜ λ‹€λ₯Έ 멀버듀을 μ‘°μž‘ν•˜κ³ μžν•  λ•Œ μ‚¬μš©
  • ν•¨μˆ˜ λ‚΄λΆ€μ μœΌλ‘œ μ „λ‹¬λ˜λŠ” μ°Έμ‘°κ°’μœΌλ‘œ μžλ™μ μœΌλ‘œ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ κΈ°μž…λ¨
  • λͺ…μ‹œμ μœΌλ‘œ μ‚¬μš©ν•΄ 데이터 멀버와 맀개 λ³€μˆ˜μ˜ ꡬ뢄을 함

πŸ“š 2. μ‹€μ œ this의 μ‚¬μš©

 

this μ°Έμ‘° λ³€μˆ˜λŠ” λ‹€μŒκ³Ό 같이 λ§€κ°œλ³€μˆ˜μ™€ 멀버 λ³€μˆ˜μ˜ 이름이 같을 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. this.radius = radius;의 μ™Όμͺ½ this.radiusλŠ” 멀버 λ³€μˆ˜ radiusλ₯Ό 였λ₯Έμͺ½μ˜ radiusλŠ” λ§€κ°œλ³€μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. κ²°κ΅­ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ₯Ό λ§Žμ€ μΈμŠ€ν„΄μŠ€ 객체가 κ³΅μœ ν•˜κ²Œ λœλ‹€λ©΄ λ©”μ„œλ“œ μ•ˆμ—μ„œ μ‹λ³„ν•˜λŠ” 속성값에 λͺ…λ£Œν•˜κ²Œ μ ‘κ·Όν•˜κΈ° μœ„ν•œ 것이 this μ°Έμ‘°λ³€μˆ˜μž…λ‹ˆλ‹€.


πŸ“ŒIII. 정적 멀버

πŸ“š 1. 멀버 ν•„λ“œ

[μ ‘κ·Ό μ œν•œ] [static] <μžλ£Œν˜•> <μ‹λ³„μž>;

λ©€λ²„ν•„λ“œμ˜ static μ˜μ—­μ€ "값을 κ³΅μœ ν•œλ‹€"λŠ” 것이 μ€‘μš”ν•œ μ—­ν• μž…λ‹ˆλ‹€.

(1) instance 멀버 ν•„λ“œ

  • 각 객체 μƒμ„±μ‹œ λ³„λ„μ˜ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ή
  • 객체 μ†Œλ©Έμ‹œ λ©”λͺ¨λ¦¬κ°€ μžλ™ ν• λ‹Ή ν•΄μ œ
  • 멀버 λ³€μˆ˜μ˜ 경우 각 κ°μ²΄λ§ˆλ‹€ 고유의 속성값을 μ €μž₯ κ°€λŠ₯

(2) static 멀버 ν•„λ“œ

  • ν”„λ‘œκ·Έλž¨ μ‹œμž‘μ‹œ λ©”λͺ¨λ¦¬ ν• λ‹Ή
  • μƒμ„±λœ 객체의 μˆ˜μ™€ 상관없이 단 ν•˜λ‚˜λ§Œ μƒμ„±λ˜μ–΄ λͺ¨λ“  객체듀이 이 μ˜μ—­μ„ 곡유
  • 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš© κ°€λŠ₯
  • static 이 μ νžˆμ§€ μ•ŠμœΌλ©΄ 일반적으둜 instance 멀버가 μƒκΈ°λ―€λ‘œ [static] ν‚€μ›Œλ“œλ‘œ λ§Œλ“€ 수 있음

πŸ“š 2. static 멀버 ν•„λ“œμ˜ μ‚¬μš© 예

 

static으둜 μ„ μ–Έλœ 멀버 λ³€μˆ˜λŠ” 클래슀 λ‚΄μ—μ„œ κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ˜λ„λ‘ λͺ¨λ“  λ©€λ²„μ—κ²Œ "곡유"λ©λ‹ˆλ‹€. λ³€μˆ˜λ„ static으둜 μ„ μ–Έν•  수 μžˆμ§€λ§Œ λͺ¨λ“  κ°’μ—μ„œ μ°Έμ‘°λ˜κΈ°μ— μƒμˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것이 더 μ’‹μŠ΅λ‹ˆλ‹€. λ˜ν•œ 각 객체 μ°Έμ‘° λ³€μˆ˜λ‘œ μ ‘κ·Όν•˜κΈ° λ³΄λ‹€λŠ” 클래슀 μ΄λ¦„μœΌλ‘œ μ ‘κ·Όν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.


πŸ“š 3. λ©”μ„œλ“œμ˜ μ’…λ₯˜

λ©”μ„œλ“œμ˜ static μ˜μ—­μ€ "객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  ν–‰μœ„λ₯Ό ν•  수 μžˆλ‹€"λŠ” 것이 μ£Όμš”ν•œ μ—­ν• μž…λ‹ˆλ‹€.

(1) instance λ©”μ„œλ“œ

  • 객체가 μˆ˜ν–‰ν•˜λŠ” 일반적인 ν–‰μœ„
  • μžμ‹ μ˜ λͺ¨λ“  멀버λ₯Ό 직접 μ°Έμ‘° κ°€λŠ₯

(2) static λ©”μ„œλ“œ

  • 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  ν–‰μœ„λ₯Ό μˆ˜ν–‰
  • 객체 μ™ΈλΆ€μ—μ„œ μ ‘κ·Όλ˜μ§€ μ•Šλ„λ‘ static 멀버 ν•„λ“œμ˜ μ•ˆμ „ν•œ μ ‘κ·Ό μ œκ³΅μ„ μœ„ν•œ λ©”μ„œλ“œ
  • 객체 생성과 κ΄€λ ¨μ—†λŠ” 일반적 κΈ°λŠ₯의 κ°„νŽΈν•œ μ‚¬μš© 제곡
  • static이 μ•„λ‹Œ 멀버 (instance 멀버)λŠ” 직접 μ°Έμ‘° λΆˆκ°€
  • this μ°Έμ‘° λ³€μˆ˜λŠ” 객체가 λ§Œλ“€μ–΄μ Έμ•Ό μ‚¬μš© κ°€λŠ₯ν•˜λ―€λ‘œ μ‚¬μš© λΆˆκ°€
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.