관리 메뉴

Partially Committed

[CH06] 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°1 (OOP) λ³Έλ¬Έ

πŸ’» Study !/JAVA

[CH06] 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°1 (OOP)

WonderJay 2022. 7. 7. 23:59
728x90
λ°˜μ‘ν˜•
SMALL

λ³Έ ν¬μŠ€νŒ…μ€ μžλ°”μ˜ 정석 ꡐ재λ₯Ό κ³΅λΆ€ν•˜λ©°, κ°„λ‹¨νžˆ 정리/기둝 μš©λ„λ‘œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν˜Ήμ—¬, 잘λͺ»λœ λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ§€μ ν•΄μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

  기술이 λ°œμ „ν•  수둝 ν”„λ‘œκ·Έλž¨μ˜ 규λͺ¨κ°€ 컀지고 μ‚¬μš©μžλ“€μ˜ μš”κ΅¬κ°€ λΉ λ₯΄κ²Œ λ³€ν™”ν•΄λ‚˜κ°€λŠ” 상황을 절차적 μ–Έμ–΄λ‘œλŠ” ν•΄κ²°ν•˜κΈ° μ–΄λ €μ› μœΌλ©°, 이에 λŒ€ν•œ λŒ€μ•ˆμœΌλ‘œ 객체지ν–₯μ–Έμ–΄λ₯Ό μ΄μš©ν•œ κ°œλ°œλ°©λ²•λ‘ μ΄ λŒ€λ‘λ˜μ—ˆλ‹€. 객체 지ν–₯ μ–Έμ–΄λŠ” μ½”λ“œ κ°„ μ„œλ‘œ 관계λ₯Ό λ§Ίμ–΄μ£Όμ–΄ 유기적으둜 ν”„λ‘œκ·Έλž¨μ„ ꡬ성할 수 μžˆλ‹€. 객체 지ν–₯ μ–Έμ–΄μ˜ νŠΉμ§•μ€ μ•„λž˜μ™€ κ°™λ‹€.

 

  ●  μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ λ†’λ‹€.

      :  μƒˆλ‘œμš΄ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ κΈ°μ‘΄ μ½”λ“œλ₯Ό μ΄μš©ν•˜μ—¬ μ‰½κ²Œ μž‘μ„±ν•  수 μžˆλ‹€.

  ●  μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•˜λ‹€.

      :  μ½”λ“œ κ°„μ˜ 관계λ₯Ό μ΄μš©ν•˜μ—¬ 적은 λ…Έλ ₯μœΌλ‘œλ„ μ‰½κ²Œ μ½”λ“œλ₯Ό μˆ˜μ •ν•  수 μžˆλ‹€.

  ●  신뒰성이 높은 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯ν•˜λ‹€.

      :  μ œμ–΄μž/λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ 데이터λ₯Ό λ³΄ν˜Έν•˜κ³  μ˜¬λ°”λ₯Έ 값을 μœ μ§€ν•˜λ„λ‘ ν•΄μ„œ μ½”λ“œμ˜ 쀑볡을 μ œκ±°ν•˜μ—¬ μ½”λ“œμ˜ λΆˆμΌμΉ˜λ‘œλΆ€ν„° λ°œμƒν•˜λŠ” μ˜€λ™μž‘μ„ 방지할 수 μžˆλ‹€.

 

  상속, λ‹€ν˜•μ„±κ³Ό 같은 객체지ν–₯κ°œλ…μ„ 받아듀일 λ•Œ,  μ½”λ“œμ˜ μž¬μ‚¬μš©μ„± / μœ μ§€λ³΄μˆ˜ / μ€‘λ³΅λœ μ½”λ“œμ˜ μ œκ±°μ™€ 같이 3 가지 κ΄€μ μ—μ„œ 바라보면 보닀 μ‰½κ²Œ 이해할 수 μžˆλ‹€. 


ν΄λž˜μŠ€μ™€ 객체

  ν΄λž˜μŠ€λž€ 객체의 섀계도/틀이라고 μ •μ˜ν•  수 있으며 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. κ°μ²΄λŠ” 가지고 μžˆλŠ” κΈ°λŠ₯/속성에 λ”°λΌμ„œ μš©λ„κ°€ λ‹€λ₯΄λ©°, ν΄λž˜μŠ€μ— μ •μ˜λœ λ‚΄μš©λŒ€λ‘œ λ©”λͺ¨λ¦¬μ— μƒμ„±λœ 것이라고 μƒκ°ν•˜μž. ν΄λž˜μŠ€μ™€ 객체의 κ΄€κ³„λŠ” 섀계도와 μ œν’ˆ κ°„μ˜ 관계λ₯Ό μƒκ°ν•˜λ©΄ λœλ‹€. 잘 λ§Œλ“€μ–΄λ†“μ€ 섀계도가 있으면 μ œν’ˆμ˜ ν’ˆμ§ˆμ€ μƒλ‹Ήνžˆ 보μž₯되기 λ§ˆλ ¨μ΄λ‹€. JDK μ—μ„œλŠ” ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•΄ λ§Žμ€ JAVA API λ₯Ό μ œκ³΅ν•˜κ³  있으며 이λ₯Ό μ΄μš©ν•˜μ—¬ μ›ν•˜λŠ” κΈ°λŠ₯을 섀계할 수 μžˆλ‹€.

 

객체와 μΈμŠ€ν„΄μŠ€

  ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό λ§Œλ“œλŠ” 과정은 클래슀의 μΈμŠ€ν„΄μŠ€ν™”(instantidate)라고 ν•œλ‹€. μ΄λŸ¬ν•œ ν΄λž˜μŠ€λ‘œλΆ€ν„° λ§Œλ“€μ–΄μ§„ 객체λ₯Ό 클래슀의 μΈμŠ€ν„΄μŠ€(instance)라고 ν•œλ‹€. μΈμŠ€ν„΄μŠ€μ™€ κ°μ²΄λŠ” 같은 의미이기 λ•Œλ¬Έμ— μ—„κ²©νžˆ ꡬ뢄할 ν•„μš”λŠ” μ—†μ§€λ§Œ ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€ν™” μ‹œν‚¨ 객체λ₯Ό 보톡 μΈμŠ€ν„΄μŠ€λΌκ³  ν•œλ‹€.

 

객체의 ꡬ성 μš”μ†Œ - 속성과 κΈ°λŠ₯

  κ°μ²΄λŠ” 일반적으둜 λ‹€μˆ˜μ˜ 속성과 λ‹€μˆ˜μ˜ κΈ°λŠ₯을 가진닀. κ°μ²΄λŠ” 속성과 κΈ°λŠ₯의 집합이며 객체가 가지고 μžˆλŠ” 속성 및 κΈ°λŠ₯을 객체의 λ©€λ²„(member)라고 ν•œλ‹€. ν΄λž˜μŠ€λŠ” 객체의 μ„€κ³„λ„μ΄λ―€λ‘œ 객체의 λͺ¨λ“  속성 및 κΈ°λŠ₯이 μ •μ˜λ˜μ–΄ 있으며 ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ„±ν•œ κ°μ²΄λŠ” ν΄λž˜μŠ€λ‘œλΆ€ν„° κΈ°λŠ₯κ³Ό 속성을 λΆ€μ—¬λ°›λŠ” 것이닀. 속성과 κΈ°λŠ₯을 λ‚˜νƒ€λ‚΄λŠ” μš©μ–΄λŠ” μ•„λž˜μ™€ 같이 λ‹€μ–‘ν•˜κ²Œ μ‘΄μž¬ν•œλ‹€.

 

속성(property) : λ©€λ²„λ³€μˆ˜(member variable), νŠΉμ„±(attribute), ν•„λ“œ(field), μƒνƒœ(state)

κΈ°λŠ₯(function) : λ©”μ„œλ“œ(method), ν•¨μˆ˜(function), ν–‰μœ„(behavior)

 

classs TV{
///////////////////////////////////  속성
  String color;
  boolean power;
  int channnel;

///////////////////////////////////  κΈ°λŠ₯
  void power()  { power = !power; }
  void channelUp()  { channel ++; }
  void channelDown() { channel -- ; }

}

μΈμŠ€ν„΄μŠ€μ˜ 생성 및 μ‚¬μš©

  클래슀λ₯Ό μ„ μ–Έν•œ 것은 μ œν’ˆμ˜ 섀계도λ₯Ό μž‘μ„±ν•œ 것에 λΆˆκ³Όν•˜λ©°, μΈμŠ€ν„΄μŠ€λ₯Ό 생성해야 μ œν’ˆμ„ μ‚¬μš©ν•  수 μžˆλ‹€. ν΄λž˜μŠ€λ‘œλΆ€ν„° μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” 방법은 μ—¬λŸ¬ 가지가 μžˆμ§€λ§Œ μ•„λž˜μ˜ 방식이 λŒ€ν‘œμ μ΄λ‹€.

클래슀λͺ… λ³€μˆ˜λͺ…;
// 클래슀의 객체λ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•΄μ„œ μ°Έμ‘° λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ 것
λ³€μˆ˜λͺ… = new 클래슀λͺ…();
// 클래슀의 객체λ₯Ό μƒμ„±ν•œ 뒀에 객체의 μ£Όμ†Œλ₯Ό μ°Έμ‘° λ³€μˆ˜μ— μ €μž₯ν•œ 것
class Tv{
    String color;
    boolean power;
    int channel;
    
    void power() { power = !power;}
    void channelUp() { ++channel;}
    void channelDown() { --channel;}
}

class TvSet{
    public static void main(String[] args) {
        Tv t;  // TV μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•œ λ³€μˆ˜ t λ₯Ό μ„ μ–Έν•œ 것
        t = new Tv(); // TV μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ 것
        t.channel = 7; // λ©€λ²„λ³€μˆ˜μ˜ 값을 7둜 ν•œ 것
        t.channelDown(); // λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 것
        System.out.println("ν˜„μž¬ 채널은 " + t.channel + " μž…λ‹ˆλ‹€.");
    }
}

Tv t ;

라고 ν•˜λ©΄ Tv 클래슀 νƒ€μž…μ„ κ°€μ§€λŠ” μ°Έμ‘° λ³€μˆ˜ t λ₯Ό μ„ μ–Έν•œ κ²ƒμœΌλ‘œ, λ©”λͺ¨λ¦¬μ— μ°Έμ‘° λ³€μˆ˜ t λ₯Ό μœ„ν•œ 곡간이 마련되고, 아직 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœκ²ƒμ€ μ•„λ‹ˆλ―€λ‘œ 이λ₯Ό μ΄μš©ν•΄μ„œ 아무것도 ν•  수 μ—†λ‹€.

 

μ΄μ–΄μ„œ,

t = new Tv() ;

라고 ν•˜λ©΄ new operator 에 μ˜ν•΄μ„œ Tv class 의 μΈμŠ€ν„΄μŠ€κ°€ memory 의 빈 곡간에 μƒμ„±λ˜λ©°, 멀버 λ³€μˆ˜λŠ” 각 μžλ£Œν˜•μ— ν•΄λ‹Ήν•˜λŠ” κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”λœλ‹€. 그리고 λŒ€μž… μ—°μ‚°μžμ— μ˜ν•΄ μƒμ„±λœ 객체의 μ£Όμ†Œ 값이 μ°Έμ‘° λ³€μˆ˜μΈ t 에 μ €μž₯되며, μ΄μ œλΆ€ν„° t λ₯Ό μ΄μš©ν•˜μ—¬ Tv μΈμŠ€ν„΄μŠ€μ— 접근이 κ°€λŠ₯해진닀. ( μΈμŠ€ν„΄μŠ€λ₯Ό 닀루기 μœ„ν•΄μ„œ λ°˜λ“œμ‹œ μ°Έμ‘°λ³€μˆ˜κ°€ ν•„μš”ν•˜λ‹€. )

 

t.channel = 7;

κ³Ό 같이 멀버 λ³€μˆ˜μ— μ ‘κ·Όν•  수 있으며,

 

t.channelDown();

으둜 μ°Έμ‘°λ³€μˆ˜ t κ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” Tv μΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œμΈ channelDown 을 ν˜ΈμΆœν•  수 μžˆλ‹€.

 

μΈμŠ€ν„΄μŠ€λŠ” μ°Έμ‘° λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œλ§Œ λ‹€λ£° 수 μžˆλŠ” 것이고 μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ€ μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…κ³Ό μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.

 

λ§Œμ•½μ— Tv μΈμŠ€ν„΄μŠ€λ₯Ό t1, t2 둜 총 2개λ₯Ό μ„ μ–Έν•œ λ‹€μŒ t2 = t1 을 μˆ˜ν–‰ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ 될까.

 

  Tv t1  = new Tv(); 와 Tv t2 = new Tv(); μ—μ„œ μ°Έμ‘°λ³€μˆ˜ t1, t2 λŠ” 각각의 μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•œλ‹€. μ΄λ•Œ t2 = t1 을 μˆ˜ν–‰ν•˜λ©΄ t2 κ°€ 가지고 있던 μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°’μ€ μžƒμ–΄λ²„λ¦¬κ²Œ 되고 t1 에 μ €μž₯λ˜μ–΄ 있던 μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°’μ΄ t2 에 μ €μž₯λœλ‹€. 이와 같이 μžμ‹ μ„ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μ°Έμ‘° λ³€μˆ˜κ°€ ν•˜λ‚˜λ„ μ—†λŠ” μΈμŠ€ν„΄μŠ€κ°€ λ°œμƒν•˜λ©΄, 가비지 컬렉터 (Garbage Collector) 에 μ˜ν•΄ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬κ°€ μ œκ±°λœλ‹€.

  μ°Έμ‘° λ³€μˆ˜μ—λŠ” ν•˜λ‚˜μ˜ κ°’λ§Œμ΄ μ €μž₯될 수 μžˆμ–΄μ„œ λ‘κ°œ μ΄μƒμ˜ μ°Έμ‘° λ³€μˆ˜κ°€ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” 것은 κ°€λŠ₯ν•˜μ§€λ§Œ ν•˜λ‚˜μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ λ‘˜ μ΄μƒμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킬 μˆ˜λŠ” μ—†λ‹€.

 

객체 λ°°μ—΄

  μ—¬λŸ¬ 개의 객체λ₯Ό 닀루어야 ν•˜λŠ” μƒν™©μ—μ„œ 객체λ₯Ό λ°°μ—΄λ‘œ λ‹€λ£° 수 μžˆλ‹€. λ°°μ—΄ μ•ˆμ— 객체가 μ €μž₯λ˜λŠ” 것은 μ•„λ‹ˆκ³ , μ£Όμ†Œκ°€ μ €μž₯되며 객체 배열은 μ°Έμ‘°λ³€μˆ˜λ“€μ„ λ°°μ—΄μ˜ ν˜•νƒœλ‘œ 묢어놓은 μ°Έμ‘° λ³€μˆ˜ 배열이라고 ν•  수 μžˆλ‹€. 

Tv tv1, tv2, tv3;            ->     Tv[ ] tvArr  =  new Tv[3];

  μœ„μ™€ 같이 객체 배열을 μ •μ˜ν•˜λ©΄ 각각의 μ›μ†Œλ“€μ€ μ°Έμ‘° λ³€μˆ˜μ˜ λ””ν΄νŠΈκ°’μΈ null 둜 μ΄ˆκΈ°ν™”λ˜λ©°, 객체 배열을 생성해놓고 객체 λ°°μ—΄μ˜ 각 μš”μ†Œμ— 객체의 μ°Έμ‘° λ³€μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 것을 μžŠμ§€ μ•Šλ„λ‘ μœ μ˜ν•˜μž. 

 

Tv[] tvArr  =  new Tv[3];

tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

// μœ„μ™€ 같이 객체 배열에 각 μš”μ†Œμ— μ €μž₯ν•  수 μžˆμ§€λ§Œ μ•„λž˜μ™€ 같이 μ‚¬μš©ν•˜λŠ” 것이 κ°„νŽΈν•˜λ‹€.
Tv[ ] tvArr  = {  new Tv(), new Tv(), new Tv() };

// ν˜Ήμ€
Tv[ ] tvArr = new Tv[100] ;
for(int i = 0 ; i < tvArr.length; i ++) {
    tvArr[i] = new Tv();
}

  객체 λ°°μ—΄μ—λŠ” 같은 νƒ€μž…μ˜ 객체만 μ €μž₯될 수 μžˆλ‹€. 그러면 μ–΄λ–»κ²Œ ν•˜λ©΄ λ‹€μ–‘ν•œ νƒ€μž…μ˜ 객체λ₯Ό ν•˜λ‚˜μ˜ 배열에 μ €μž₯ν•  수 μžˆμ„κΉŒ? μ΄λŠ” polymorhphism(λ‹€ν˜•μ„±) 에 λŒ€ν•œ 이해가 ν•„μš”ν•˜λ‹€.  - μΆ”ν›„ λ‹€λ£Έ.

 

 

클래슀의 또 λ‹€λ₯Έ μ •μ˜

1. λ³€μˆ˜ : ν•˜λ‚˜μ˜ 데이터λ₯Ό μ €μž₯ν•  수 μžˆλŠ” 곡간

2. λ°°μ—΄ : κ°™μ€ μ’…λ₯˜μ˜ μ—¬λŸ¬ 데이터λ₯Ό ν•˜λ‚˜μ˜ μ§‘ν•©μœΌλ‘œ μ €μž₯ν•  수 μžˆλŠ” 곡간

3. ꡬ쑰체 : μ„œλ‘œ κ΄€λ ¨λ˜μ–΄ μžˆλŠ” μ—¬λŸ¬ 데이터λ₯Ό μ’…λ₯˜μ— 관계없이 ν•˜λ‚˜μ˜ μ§‘ν•©μœΌλ‘œ μ €μž₯ν•  수 μžˆλŠ” 곡간

4. 클래슀 : λ°μ΄ν„°μ™€ ν•¨μˆ˜μ˜ 결합을 의미

 

  μžλ°”μ™€ 같은 객체지ν–₯μ–Έμ–΄μ—μ„œλŠ” λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•΄μ„œ 각각의 관계λ₯Ό μ‰½κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ ν•˜μ˜€λ‹€. 이와 같이 μ„œλ‘œ κ΄€λ ¨λ˜μ–΄ μžˆλŠ” λ³€μˆ˜λ₯Ό μ •μ˜ν•˜κ³ , ν•΄λ‹Ή λ³€μˆ˜λ“€μ— λŒ€ν•œ 처리λ₯Ό μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•œ 것이 ν΄λž˜μŠ€μ΄λ‹€. Cμ–Έμ–΄μ—μ„œ λ¬Έμžμ—΄μ€ char λ°°μ—΄μ΄μ§€λ§Œ JAVA μ—μ„œλŠ” String 클래슀둜 λ‹€λ£¨λŠ”λ°, μ΄λŠ” λ¬Έμžμ—΄μ„ λ‹¨μˆœν•œ λ°°μ—΄λ‘œ λ³΄λŠ” κ²ƒμ—μ„œ 보닀 λ‚˜μ•„κ°€, λ¬Έμžμ—΄ 데이터와 이λ₯Ό λ‹€λ£¨λŠ” ν•¨μˆ˜λ“€μ„ λ¬ΆκΈ° μœ„ν•¨μ΄λ‹€. 

 

  객체지ν–₯μ–Έμ–΄μ—μ„œ μ‚¬μš©μž μ •μ˜ νƒ€μž…(user - defined type)은 λ°”λ‘œ class 와 κ°™λ‹€. μ„œλ‘œ κ΄€λ ¨λ˜μ–΄ μžˆλŠ” 데이터듀을 ν•˜λ‚˜μ˜ 의미 λ‹¨μœ„λ‘œ λ¬Άμ–΄μ„œ μ‚¬μš©ν•  수 μžˆλŠ”λ°, class λ₯Ό μ΄μš©ν•˜λ©΄ 각각의 데이터에 λŒ€ν•œ inconsistency λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ œμ–΄μž/λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ 데이터 무결성을 μœ μ§€ν•  수 μžˆλ‹€.

public class Time{
    private int hour;
    private int minute;
    private float second;
    
    public int getHour() { return hour;}
    public int getMinute() { return minute; }
    public int getSecond() { return second; }
    
    public void setHour(int h){
        if(h<0 || h>23) return;
        hour = h;
    }
    
    public void setMinute(int m){
        if (m<0 || m>59) return;
        minute = m;
    }
    
    public void setSecond(float s){
        if(s<0.0f || s>59.99f) return;
        second = s;
    }
}

 

μ„ μ–Έ μœ„μΉ˜μ— λ”°λ₯Έ λ³€μˆ˜μ˜ μ’…λ₯˜

  λ³€μˆ˜λŠ” 클래슀 λ³€μˆ˜, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, 지역 λ³€μˆ˜λ‘œ 총 3 κ°€μ§€λ‘œ ꡬ뢄할 수 μžˆλŠ”λ° μ„ μ–Έλœ μœ„μΉ˜μ— λ”°λΌμ„œ κ²°μ •λœλ‹€. 멀버 λ³€μˆ˜λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ³€μˆ˜λ“€μ€ λͺ¨λ‘ 지역 λ³€μˆ˜μ΄λ©°, 멀버 λ³€μˆ˜ μ€‘μ—μ„œ static ν‚€μ›Œλ“œκ°€ 뢙은 것은 클래슀 λ³€μˆ˜λΌκ³  ν•˜κ³  그렇지 μ•Šμ€ 것은 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ΄λ‹€.

 

● μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ (Instance variable)

: 클래슀 μ˜μ—­μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ‘œ ν΄λž˜μŠ€κ°€ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ λ§Œλ“€μ–΄μ§„λ‹€. κ·Έλž˜μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ ㄱ밧을 μ½κ±°λ‚˜ μ €μž₯ν•˜λ €λ©΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ¨Όμ € 생성해야 ν•œλ‹€. μΈμŠ€ν„΄μŠ€λŠ” 독립적인 μ €μž₯곡간을 가지기 λ•Œλ¬Έμ— μ„œλ‘œ λ‹€λ₯Έ 값을 κ°€μ§ˆ 수 μžˆλŠ”λ°, μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ κ³ μœ ν•œ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•˜λŠ” 속성은 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ‘œ μ„ μ–Έν•œλ‹€.

 

● 클래슀 λ³€μˆ˜ (Class variable)

:  클래슀 μ˜μ—­μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ‘œ ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€λ©΄ μƒμ„±λ˜λ©°, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ•žμ— static ν‚€μ›Œλ“œλ₯Ό 뢙이면 λœλ‹€. μΈμŠ€ν„΄μŠ€ λ§ˆλ‹€ 독립적인 μ €μž₯ 곡간을 κ°€μ§€λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€λŠ” λ‹€λ₯΄κ²Œ 클래슀 λ³€μˆ˜λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅λœ μ €μž₯곡간을 κ³΅μœ ν•œλ‹€. 단일 클래슀의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ“€μ΄ 곡톡적인 값을 μœ μ§€ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή 속성을 클래슀 λ³€μˆ˜λ‘œ μ„ μ–Έν•΄μ•Ό ν•œλ‹€. 클래슀 λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€λŠ” λ‹€λ₯΄κ²Œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±μΉ˜ μ•Šκ³ λ„ μ‚¬μš©ν•  수 μžˆλ‹€. ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— loading 될 λ•Œ μƒμ„±λ˜κ³  이후 ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•Œ κΉŒμ§€ μœ μ§€λ˜λŠ”λ°, public ν‚€μ›Œλ“œλ₯Ό μ•žμ— 뢙이면 μ „μ—­λ³€μˆ˜μ˜ 성격을 κ°€μ§€κ²Œ λœλ‹€.

 

● 지역 λ³€μˆ˜(Local variable)

:  λ©”μ„œλ“œ λ‚΄μ—μ„œ 선언이 되면 ν•΄λ‹Ή λ©”μ„œλ“œ λ‚΄μ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ©°, λ©”μ„œλ“œκ°€ μ’…λ£Œλ¨κ³Ό λ™μ‹œμ— μ†Œλ©Έλ˜μ–΄ μ‚¬μš©ν•  수 μ—†λ‹€.

 

 

λ©”μ„œλ“œ

   λ©”μ„œλ“œ(method)λž€ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 일련의 λ¬Έμž₯듀을 ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ 묢은 κ²ƒμœΌλ‘œ, ν•¨μˆ˜μ™€ λΉ„μŠ·ν•œ 의미이며 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ 3 가지 μž₯점을 얻을 수 μžˆλ‹€.

 

● 높은 μž¬μ‚¬μš©μ„±(reusability)

:   λ§Œλ“€μ–΄μ§„ λ©”μ„œλ“œλŠ” μˆ˜μ—†μ΄ 호좜이 κ°€λŠ₯ν•˜λ‹€.

 

● μ€‘λ³΅λœ μ½”λ“œμ˜ 제거

:  μ½”λ“œλ₯Ό μ§œλ‹€ 보면 μ€‘λ³΅λ˜λŠ” 뢀뢄이 일뢀 λ°œμƒν•˜κ²Œ λ˜λŠ”λ°, ν•΄λ‹Ή 뢀뢄을 λ©”μ„œλ“œλ‘œ λ§Œλ“€ 경우 λ°˜λ³΅λ˜λŠ” λ¬Έμž₯을 ν•˜λ‚˜μ˜ λ¬Έμž₯으둜 쀄일 수 μžˆμ–΄μ„œ μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ— μœ λ¦¬ν•˜λ‹€. 

 

● ν”„λ‘œκ·Έλž¨μ˜ ꡬ쑰화

:  큰 규λͺ¨μ˜ ν”„λ‘œκ·Έλž¨μ„ μ„€κ³„ν•˜λŠ” λ‹¨κ³„μ—μ„œ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ 개 μ •μ˜ν•˜μ—¬ λ³΅μž‘ν•œ ν”„λ‘œκ·Έλž¨μ˜ ꡬ쑰λ₯Ό λ‹¨μˆœν™”μ‹œν‚¬ 수 μžˆλ‹€. 

 

  λ©”μ„œλ“œλŠ” μ„ μ–ΈλΆ€(header)와 κ΅¬ν˜„λΆ€(body)둜 이루어져 있으며, μ„ μ–ΈλΆ€μ—μ„œλŠ” λ©”μ„œλ“œμ˜ 이름과 λ§€κ°œλ³€μˆ˜ 및 λ°˜ν™˜ νƒ€μž…μ„ μ„€μ •ν•œλ‹€. λ©”μ„œλ“œμ˜ κ΅¬ν˜„λΆ€(body) μ—μ„œλŠ” μ›ν•˜λŠ” λ™μž‘μ— ν•΄λ‹Ήν•˜λŠ” λ¬Έμž₯을 λ„£μœΌλ©΄ λ˜λŠ”λ°, λ©”μ„œλ“œκ°€ λ°˜ν™˜κ°’μ„ κ°€μ§ˆ 경우 μ§€μ •ν•œ λ°˜ν™˜ νƒ€μž…κ³Ό μΌμΉ˜ν•˜κ±°λ‚˜ μžλ™ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•΄μ•Όλ§Œ ν•œλ‹€. 

 

인자(argument)와 λ§€κ°œλ³€μˆ˜(parameter)

:   λ©”μ„œλ“œλ₯Ό 호좜 ν•  λ•Œ, κ΄„ν˜Έ μ•ˆμ— λ„£μ–΄μ£ΌλŠ” 값듀을 인자라고 ν•œλ‹€. μ΄λŸ¬ν•œ μΈμžλ“€μ€ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ¨μ— 따라 λ§€κ°œλ³€μˆ˜μ— λŒ€μž…λœλ‹€. λ§€μ„œλ“œμ˜ κ΅¬ν˜„λΆ€λ₯Ό μž‘μ„±ν•  λ•Œ λ°˜λ“œμ‹œ 맀개 λ³€μˆ˜μ˜ 값이 μ μ ˆν•œ 지 확인해야 ν•œλ‹€. 이상 λ™μž‘μ— λŒ€ν•œ μ˜ˆμ™Έμ²˜λ¦¬μ— λŒ€ν•΄ λ°˜λ“œμ‹œ κ³ λ €ν•˜λŠ” 방어적 ν”„λ‘œκ·Έλž˜λ°μ„ μˆ˜ν–‰ν•˜λ„λ‘ ν•œλ‹€.

 

JVM 의 λ©”λͺ¨λ¦¬ ꡬ쑰

   μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄ JVM 은 system μœΌλ‘œλΆ€ν„° ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›κ³  JVM 은 ν•΄λ‹Ή λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μš©λ„μ— λ§žμΆ”μ–΄ μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ κ΄€λ¦¬ν•œλ‹€. κ·Έ 쀑, 3가지 μ£Όμš” μ˜μ—­μΈ method area , call stack, heap 에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄μž.

 

● Method area

:  ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” 쀑 μ–΄λ–€ ν΄λž˜μŠ€κ°€ μ‚¬μš©λ˜λ©΄, JVM 은 ν•΄λ‹Ή 클래슀 νŒŒμΌμ„ 읽은 λ’€ λΆ„μ„ν•˜μ—¬ ν΄λž˜μŠ€μ— λŒ€ν•œ 정보 및 클래슀 λ³€μˆ˜λ₯Ό Method area 에 μ €μž₯ν•œλ‹€.

 

● Heap

:  μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λŠ” κ³΅κ°„μœΌλ‘œ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 도쀑 μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€λ“€μ€ 여기에 μ €μž₯λœλ‹€.

 

● call stack | execution stack

:  호좜 μŠ€νƒ(call stack)은 λ©”μ„œλ“œ μž‘μ—… μ‹œ ν•„μš”ν•œ λ©”λͺ¨λ¦¬ 곡간을 μ œκ³΅ν•˜λ©°, λ©”μ„œλ“œκ°€ 호좜되면 call stack 에 호좜된 λ©”μ„œλ“œλ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜κ³  ν•΄λ‹Ή λ©”λͺ¨λ¦¬λŠ” λ©”μ„œλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ™μ•ˆμ— μ§€μ—­λ³€μˆ˜(parameter 포함)λ“€κ³Ό μ—°μ‚°μ˜ 쀑간 결과듀을 μ €μž₯ν•˜λŠ”λ° μ‚¬μš©λœλ‹€. λ©”μ„œλ“œκ°€ μž‘μ—…μ„ 마치면 ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ 곡간은 λ°˜ν™˜λ˜μ–΄ λΉ„μ›Œμ§„λ‹€. 각각의 λ©”μ„œλ“œλ₯Ό μœ„ν•œ 곡간은 κ΅¬λ³„λœλ‹€. κ°€μž₯ μ²˜μŒμ— 호좜된 λ©”μ„œλ“œμ˜ 곡간은 κ°€μž₯ μ•„λž˜μ— λ§ˆλ ¨λœλ‹€. 첫 λ²ˆμ§Έμ— 호좜된 λ©”μ„œλ“œμ˜ μˆ˜ν–‰ 도쀑 두 번째 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 경우, 첫 번째 λ©”μ„œλ“œμ˜ 곡간 λ°”λ‘œ μœ„μ— 두 번째 λ©”μ†Œλ“œμ˜ μž‘μ—… 곡간이 마련되고 μˆ˜ν–‰λœ 이후에 두 번째 λ©”μ†Œλ“œμ˜ λ©”λͺ¨λ¦¬λŠ” λ°˜ν™˜λ˜κ³  λ‹€μ‹œ μ΄μ–΄μ„œ 첫 번째 λ©”μ†Œλ“œκ°€ μˆ˜ν–‰λ˜λŠ” ꡬ쑰이닀. κ·ΈλŸ¬λ―€λ‘œ ν˜„μž¬ μˆ˜ν–‰λ˜κ³  μžˆλŠ” λ©”μ†Œλ“œλ₯Ό ν™•μΈν•˜κ³ μž ν•  λ•Œμ—λŠ” 호좜 μˆ˜νƒμ˜ κ°€μž₯ μœ„μ— μœ„μΉ˜μ—” λ©”μ„œλ“œλ₯Ό ν™•μΈν•˜λ©΄ λœλ‹€.

 

  호좜 μŠ€νƒμ˜ νŠΉμ§•μ„ μ •λ¦¬ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

1.  λ©”μ„œλ“œκ°€ 호좜되면 μˆ˜ν–‰μ— ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό μŠ€νƒμ— ν• λ‹Ήλ°›μŒ.

2.  λ©”μ„œλ“œμ˜ μˆ˜ν–‰μ΄ λλ‚˜λ©΄ λ©”λͺ¨λ¦¬κ°€ λ°˜ν™˜λ˜κ³  μŠ€νƒμ—μ„œ 제거됨.

3.  ν˜ΈμΆœμŠ€νƒμ˜ κ°€μž₯ μœ„μ— μœ„μΉ˜ν•œ λ©”μ„œλ“œκ°€ λ°”λ‘œ ν˜„μž¬ μ‹€ν–‰ 쀑인 λ©”μ„œλ“œμž„.

4.  μ•„λž˜μ— μžˆλŠ” λ©”μ„œλ“œλŠ” λ°”λ‘œ μœ„μ— μžˆλŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ parent λ©”μ„œλ“œμž„.

 

class CallStackTest{
    public static void main(String[] args) {
        firstMethod();
    }
    static void firstMethod(){
        secondMethod();
    }
    static void secondMethod(){
        System.out.println("secondMethod()");
    }
}

main() 은 firstMethod λ₯Ό ν˜ΈμΆœν•œλ‹€. 그리고 firstMethod() λŠ” secondMethod() λ₯Ό ν˜ΈμΆœν•˜λŠ”λ°, 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ λ©”μ„œλ“œκ°€ 호좜될 수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•žμ— static ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ£Όμ–΄μ•Ό ν•œλ‹€. 

 

1. λ¨Όμ € JVM 에 μ˜ν•΄μ„œ main λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜λ―€λ‘œ 호좜 μŠ€νƒμ—λŠ” main λ©”μ„œλ“œλ₯Ό μœ„ν•œ 곡간이 ν• λ‹Ήλ˜κ³  main λ©”μ„œλ“œκ°€ μˆ˜ν–‰λœλ‹€.

2. main λ©”μ„œλ“œ μˆ˜ν–‰ 도쀑 firstMethod() λ₯Ό ν˜ΈμΆœν•˜λ―€λ‘œ 호좜 μŠ€νƒμ˜ main λ©”μ„œλ“œλŠ” λŒ€κΈ° μƒνƒœλ‘œ λ‚¨μ•„μžˆκ³  μœ„μ— firstMethod λ©”μ„œλ“œλ₯Ό μœ„ν•œ μž‘μ—… 곡간이 ν• λ‹Ήλ˜κ³  μˆ˜ν–‰μ„ μ‹œμž‘ν•œλ‹€.

3. firstMethod() μˆ˜ν–‰ 도쀑 SecondMethod() λ₯Ό ν˜ΈμΆœν•˜λ―€λ‘œ, firstMethod() λ˜ν•œ λŒ€κΈ° μƒνƒœλ‘œ λ‚¨μ•„μžˆκ²Œ 되고 SecondMethod() λ₯Ό μœ„ν•œ μž‘μ—… 곡간이 ν• λ‹Ήλ˜κ³  μˆ˜ν–‰λœλ‹€.

4. SecondMethod() μ—μ„œ println() 을 ν˜ΈμΆœν•˜λ―€λ‘œ, println λ©”μ„œλ“œμ— μ˜ν•΄ SecondMethond() λΌλŠ” λ¬Έμž₯이 좜λ ₯λœλ‹€. 

5. println λ©”μ„œλ“œμ˜ μˆ˜ν–‰μ΄ μ™„λ£Œλ˜λ©΄ 호좜 μŠ€νƒμ—μ„œ μ‚¬λΌμ§€λŠ”λ°, parent method 인 SecondMethod() λŠ” 이후에 μˆ˜ν–‰ν•  μ½”λ“œκ°€ μ—†μœΌλ―€λ‘œ 순차적으둜 SecondMethod() 도 호좜 μŠ€νƒμ—μ„œ 사라진닀.

6. 같은 λ…Όλ¦¬λ‘œ main λ©”μ„œλ“œ κΉŒμ§€ 호좜 μŠ€νƒμ—μ„œ λΉ„μ›Œμ§€κ²Œ 되고 μ΅œμ’…μ μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλœλ‹€.

 

κΈ°λ³Έν˜• λ§€κ°œλ³€μˆ˜μ™€ μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜

   λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ λ§€κ°œλ³€μˆ˜λ₯Ό λ³΅μ‚¬ν•΄μ„œ λ„˜κ²¨μ£ΌλŠ”λ°, κΈ°λ³Έν˜•μΈ κ²½μš°μ—λŠ” 값이 λ³΅μ‚¬λ˜μ§€λ§Œ μ°Έμ‘°ν˜•μΈ κ²½μš°μ—λŠ” μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°€ λ³΅μ‚¬λœλ‹€. λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό κΈ°λ³Έν˜•μœΌλ‘œ μ„ μ–Έν•œλ‹€λ©΄ 였직 read 만 κ°€λŠ₯ν•˜μ§€λ§Œ, μ°Έμ‘°ν˜•μœΌλ‘œ μ„ μ–Έν•  경우 read & write κ°€ κ°€λŠ₯ν•˜λ‹€. 

class ArrayExample{
    public static void main(String[] args) {
        int[] arr = new int[] { 3, 2, 1, 6, 5, 4};
        
        printArr(arr);
        sortArr(arr);
        printArr(arr);
        System.out.println("sum = " + sumArr(arr));
    }
    static void printArr(int[] arr){
        System.out.println("[");
        for(int i : arr)
            System.out.println(i + ", ");
        System.out.println("]");
    }
    
    static int sumArr(int[] arr){
        int sum = 0;
        for(int i = 0 ; i <arr.length ; i++)
            sum += arr[i];
        return sum;
    }
    
    static void sortArr(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++)
            for (int j = 0; j < arr.length - 1 - i; j++)
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
    }
}

 

μž¬κ·€ λ©”μ„œλ“œ(Recursive method)

    λ©”μ„œλ“œ μ‹€ν–‰ 도쀑 자기 μžμ‹ μ„ λ‹€μ‹œ ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œλ₯Ό μž¬κ·€ λ©”μ„œλ“œλΌκ³  μΌμ»«λŠ”λ‹€. 이와 같은 μž¬κ·€ ν•¨μˆ˜λ₯Ό 지 λ•ŒλŠ” νƒˆμΆœ 쑰건을 λͺ…ν™•ν•˜κ²Œ μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 그렇지 λͺ»ν•˜λ©΄ λ¬΄ν•œ 루프에 λΉ μ§€κ²Œ λœλ‹€. λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 것은 λ‹¨μˆœ 반볡 루프와 λΉ„κ΅ν•˜λ©΄ λ§€κ°œλ³€μˆ˜μ˜ 볡사와 μ’…λ£Œ ν›„ 볡귀할 μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” κ³Όμ • 등이 μΆ”κ°€λ‘œ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— μž¬κ·€ 호좜의 μˆ˜ν–‰μ‹œκ°„μ΄ 더 였래 κ±Έλ¦°λ‹€. κ·ΈλŸΌμ—λ„ μž¬κ·€ ν˜ΈμΆœμ„ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ°”λ‘œ 논리적 κ°„κ²°μ„± λ•Œλ¬Έμ΄λ‹€.  μ•„λž˜λŠ” μž¬κ·€ λ©”μ„œλ“œμ˜ λŒ€ν‘œκ²©μΈ νŒ©ν† λ¦¬μ–Όμ„ ν…ŒμŠ€νŠΈ ν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν•œ 것이닀. 클래슀 λ‚΄λΆ€μ—μ„œ factorial 은 static method 이기 λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ§€ μ•Šκ³ λ„ ν˜ΈμΆœν•˜μ—¬ ν…ŒμŠ€νŠΈν•  수 μžˆλ‹€. 

class FactorialTest{
    public static void main(String[] args) {
        int result = factorial(4);

        System.out.println(result);
    }
    
    static int factorial(int n){
        int result = 0;
        if( n == 1)
            result = 1;
        else
            result = n*factorial(n-1);
        return result;
    }
}

μ•„λž˜λŠ” μ§€μˆ˜ν•©μ„ ν…ŒμŠ€νŠΈν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€.

class PowerTest{
    public static void main(String[] args) {
        int x = 2;
        int n = 5;
        long result = 0;
        
        for(int i = 1; i <=n ; i++)
            result += power(x,i);
        System.out.println(result);
    }
    static long power(int x, int n){
        if(n==1) return x;
        return x * power(x, n-1);
    }
}

 

클래슀 λ©”μ„œλ“œ(static λ©”μ„œλ“œ)와 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ

    클래슀 λ©”μ„œλ“œλŠ” 클래슀 λ³€μˆ˜μ™€ 같이 객체λ₯Ό λ”°λ‘œ μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ ν΄λž˜μŠ€μ΄λ¦„.λ©”μ„œλ“œμ΄λ¦„ 와 같은 λ°©μ‹μœΌλ‘œ 호좜이 ν•˜λŠ₯ν•œ 것이며, μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ 객체λ₯Ό μƒμ„±ν•΄μ•Όμ§€λ§Œ 호좜이 κ°€λŠ₯ν•œ λ©”μ„œλ“œμ΄λ‹€. 보톡 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ κ΄€λ ¨λœ μž‘μ—…μ΄ μš”κ΅¬λ˜λŠ” 경우 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ‘œ λ§Œλ“€κ³ , μΈμŠ€ν„΄μŠ€μ™€ 관계없이 μž‘μ—…μ΄ κ°€λŠ₯ν•œ 경우 클래슀 λ©”μ„œλ“œλ‘œ μ •μ˜ν•˜κ³€ ν•œλ‹€.

 

● 클래슀λ₯Ό 섀계할 λ•Œμ—λŠ” 멀버 λ³€μˆ˜ 쀑 λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것에 static 을 뢙이도둝 ν•œλ‹€.

:  μƒμ„±λ˜λŠ” 각 μΈμŠ€ν„΄μŠ€λ“€μ€ μ„œλ‘œ 독립적인 관계이기 λ•Œλ¬Έμ— 각각의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ“€μ€ μ„œλ‘œ λ‹€λ₯Έ 값을 μœ μ§€ν•˜μ§€λ§Œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— λŒ€ν•˜μ—¬ 같은 같이 μœ μ§€λ˜μ–΄μ•Ό ν•˜λŠ” λ³€μˆ˜λŠ” static ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ 클래슀 λ³€μˆ˜λ‘œ μ •μ˜ν•˜λ„λ‘ ν•œλ‹€.

 

● 클래슀 λ³€μˆ˜(static λ³€μˆ˜)λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš©ν•  수 μžˆλ‹€.

:  static ν‚€μ›Œλ“œκ°€ 뢙은 λ³€μˆ˜(class λ³€μˆ˜)λŠ” ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ μžλ™μ μœΌλ‘œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

● 클래슀 λ©”μ„œλ“œ(static λ©”μ„œλ“œ)λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.

:  μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€κ°€ λ°˜λ“œμ‹œ μ‘΄μž¬ν•΄μ•Όμ§€λ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. μ΄λŠ” 클래슀 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ 생성과 관계 없이 호좜이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 클래슀 λ©”μ„œλ“œκ°€ 호좜 된 경우 μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 클래슀 λ©”μ„œλ“œμ—μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ μ‚¬μš©μ„ κΈˆμ§€ν•˜λŠ” 반면 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 및 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œλŠ” static ν‚€μ›Œλ“œκ°€ 뢙은 멀버듀을 μ‚¬μš©ν•˜λŠ” 것이 항상 κ°€λŠ₯ν•œλ°, μ΄λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ°€ μ‘΄μž¬ν•œλ‹€λŠ” 것이 static λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬μ— 이미 올렀져 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

● λ©”μ„œλ“œ λ‚΄μ—μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우, static λ©”μ„œλ“œλ‘œ μ‚¬μš©ν•˜λŠ” 것을 κ³ λ €ν•œλ‹€.

:  λ©”μ„œλ“œμ˜ μž‘μ—… λ‚΄μš© 쀑, μΈμŠ€ν„΄μŠ€λ³€μˆ˜κ°€ ν•„μš”ν•˜λ‹€λ©΄ static ν‚€μ›Œλ“œλ₯Ό 뢙일 수 μ—†μ§€λ§Œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œλΌλ©΄ static ν‚€μ›Œλ“œλ₯Ό 뢙이면 λ©”μ„œλ“œμ˜ 호좜 μ‹œκ°„μ΄ 보닀 짧아지기 λ•Œλ¬Έμ— μ„±λŠ₯이 μ˜¬λΌκ°€λŠ” νš¨κ³Όκ°€ μžˆλ‹€. static ν‚€μ›Œλ“œλ₯Ό 뢙이지 μ•Šμ€ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ˜ 경우 μ‹€ν–‰ν•  λ•Œ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•  λ©”μ„œλ“œλ₯Ό μ°ΎλŠ” 과정이 μΆ”κ°€μ μœΌλ‘œ ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

클래슀 λ©”μ„œλ“œμ™€ μΈμŠ€ν„΄μŠ€ λ©€λ²„κ°„μ˜ 참쑰와 호좜

    같은 클래슀 λ‚΄λΆ€μ˜ 멀버 κ°„μ—λŠ” λ³„λ„μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ§€ μ•Šμ•„λ„ μ„œλ‘œ μ°Έμ‘°/호좜이 κ°€λŠ₯ν•˜λ‹€. μ΄λ•Œ 클래슀 멀버가 μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ°Έμ‘°/ν˜ΈμΆœν•˜λ €κ³  ν•˜λ©΄ μΈμŠ€ν„΄μŠ€λ₯Ό 생성해야 ν•œλ‹€. μ™œλƒλ©΄ μΈμŠ€ν„΄μŠ€ 멀버가 μ‘΄μž¬ν•˜λŠ” μ‹œμ μ— 클래슀 λ©€λ²„λŠ” 항상 μ‘΄μž¬ν•˜λŠ”λ°, 클래슀 멀버가 μ‘΄μž¬ν•˜λŠ” μ‹œμ μ— μΈμŠ€ν„΄μŠ€ 멀버(μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 및 λ©”μ„œλ“œ)λŠ” μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€. 

 

같은 클래슀 λ‚΄μ˜ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ static λ©”μ„œλ“œ κ°„μ˜ ν˜ΈμΆœμ„ μ„€λͺ…ν•˜κ³  μžˆλŠ” μ½”λ“œμ΄λ‹€. μœ„μ˜ 경우 staticMethod2 μ—μ„œ instanceMethod λ₯Ό ν˜ΈμΆœν•˜λ €κ³  ν•˜μ§€λ§Œ μ—λŸ¬κ°€ λœ¨λŠ” λͺ¨μŠ΅μ΄λ‹€. 같은 클래슀 λ‚΄μ˜ λ©”μ„œλ“œλŠ” μ„œλ‘œ 객체의 생성 ν˜Ήμ€ μ°Έμ‘°λ³€μˆ˜ 없이 직접 호좜이 κ°€λŠ₯ν•˜μ§€λ§Œ static λ©”μ„œλŠ” μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. (μΈμŠ€ν„΄μŠ€ 멀버가 μ‘΄μž¬ν•  λ•Œ 클래슀 λ©€λ²„λŠ” 항상 μ‘΄μž¬ν•˜κ² μ§€λ§Œ, λ°˜λŒ€λ‘œ 클래슀 멀버가 μ‘΄μž¬ν•œλ‹€κ³  ν•˜λ”λΌκ³  μΈμŠ€ν„΄μŠ€ 멀버가 μ‘΄μž¬ν•  κ²ƒμ΄λΌλŠ” 보μž₯은 μ—†κΈ° 떄문이닀.)

 

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό 호좜/μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ static λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€.

 

class MemberCall{
    int iv = 10;
    static int cv = 20;
    
    int iv2 = cv;
    static int cv2 = iv; // error
    // class λ³€μˆ˜λŠ” instance λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
    
    static void staticMethod1() {
        System.out.println(cv);
        System.out.println(iv); // error
        // class λ©”μ„œλ“œμ—μ„œ instance λ³€μˆ˜ μ‚¬μš©λΆˆκ°€
        MemberCall c = new MemberCall();
        System.out.println(c.iv);
        // 이와 같이 객체λ₯Ό μƒμ„±ν•΄μ•Όλ§Œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ°Έμ‘°κ°€λŠ₯
    }
    
    void instanceMethod1(){
        System.out.println(cv);
        System.out.println(iv);
        // instance λ©”μ†Œλ“œμ—μ„œλŠ” instance λ³€μˆ˜λ₯Ό λ°”λ‘œ μ‚¬μš©κ°€λŠ₯
    }
    
    static void staticMethod2(){
        staticMethod1();
        instanceMethod1(); // error
        // class λ©”μ„œλ“œμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜 λΆˆκ°€
        MemberCall c = new MemberCall();
        c.instanceMethod1(); // μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ 후에야 μ‚¬μš© κ°€λŠ₯
    }
    void instanceMethod2(){
        staticMethod1();
        instanceMethod1();
    }
}

μ‹€μ œλ‘œλŠ” 같은 ν΄λž˜μŠ€μ—μ„œ 클레슀 멀버가 μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ°Έμ‘°/ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ” κ²½μš°λŠ” 맀우 λ“œλ¬Όλ‹€κ³  ν•œλ‹€. μ΄λŸ¬ν•œ κ²½μš°κ°€ λ°œμƒν•œλ‹€λ©΄, μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œλ‘œ μž‘μ„±ν•΄μ•Όν•  λ©”μ†Œλ“œλ₯Ό 클래슀 λ©”μ„œλ“œλ‘œ μž‘μ„±ν•˜κ³  μžˆλŠ” 것은 μ•„λ‹Œμ§€ ν™•μΈν•˜λŠ” 것이 μ’‹λ‹€κ³  ν•œλ‹€. 

 

μ˜€λ²„λ‘œλ”©(overloading)

    ν•œ 클래슀 μ•ˆμ—μ„œ 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ 개 μ •μ˜ν•˜λŠ” 것을 λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©(method overloading) 이라고 ν•˜λ©°, 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œμΌμ§€λΌλ„ λ§€κ°œλ³€μˆ˜μ˜ 개수 ν˜Ήμ€ νƒ€μž…μ΄ λ‹€λ₯Έ 경우 같은 이름을 μ‚¬μš©ν•΄μ„œ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆλ‹€. μ˜€λ²„λ‘œλ”©μ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ˜ 쑰건을 λ§Œμ‘±ν•˜μ—¬μ•Ό ν•œλ‹€.

 

● λ©”μ„œλ“œμ˜ 이름이 같을 것

● λ§€κ°œλ³€μˆ˜μ˜ 개수 ν˜Ήμ€ νƒ€μž…μ΄ λ‹€λ₯Ό 것

 

μœ„ 쑰건을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λŠ” λ©”μ„œλ“œλŠ” 쀑볡 μ •μ˜μ΄κΈ° λ•Œλ¬Έμ— 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. λ˜ν•œ μ˜€λ²„λ‘œλ”©λœ λ©”μ„œλ“œλ“€μ€ 맀개 λ³€μˆ˜μ— μ˜ν•΄μ„œλ§Œ κ΅¬λΆ„λ˜λ―€λ‘œ λ°˜ν™˜ νƒ€μž…μ€ μ˜€λ²„λ‘œλ”©μ„ κ΅¬ν˜„ν•˜λŠ” 데에 영ν–₯을 λΌμΉ˜μ§€ μ•ŠμŒμ— μœ μ˜ν•˜μž.

 

  κ°€μž₯ λŒ€ν‘œμ μΈ μ˜€λ²„λ‘œλ”©μ˜ μ˜ˆμ‹œλŠ” println λ©”μ„œλ“œμ΄λ‹€. println μ•ˆμ—μ„œ μ–΄λŠ 값을 넣더라도 좜λ ₯이 λ˜μ§€λ§Œ, μ‹€μ œλ‘œλŠ” ν˜ΈμΆœν•  λ•Œ λ§€κ°œλ³€μˆ˜λ‘œ μ§€μ •ν•˜λŠ” κ°’μ˜ νƒ€μž…μ΄ 달라지면 ν˜ΈμΆœλ˜λŠ” println λ©”μ„œλ“œ λ˜ν•œ 달라진닀. PrintStream class λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ μ–΄λ–€ μ’…λ₯˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ •ν•˜λ”λΌλ„ 좜λ ₯이 κ°€λŠ₯ν•˜λ„λ‘ println 에 λŒ€ν•œ 10개의 μ˜€λ²„λ‘œλ”©μ„ κ΅¬ν˜„ν•˜κ³  μžˆλ‹€. 호좜 μ‹œ λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨μ§€λŠ” κ°’μ˜ νƒ€μž…μ— λ”°λΌμ„œ μ˜€λ²„λ‘œλ”©λœ λ©”μ„œλ“œ 쀑 ν•˜λ‚˜κ°€ μ„ νƒλ˜μ–΄ μ‹€ν–‰λ˜λŠ” 것이닀. 

int add(int a, int b) { return a+b;}
long add(long a, long b) {return a+b;}
long add(int[] a){
    long result = 0;
    for(int i = 0 ; i < a.length; i ++)
        result += a[i];
    return result;
}

  μœ„μ™€ 같이 μ˜€λ²„λ‘œλ”©μ„ μ‚¬μš©ν•˜λ©΄ 같은 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œλŠ” λ™μΌν•œ μ΄λ¦„μœΌλ‘œ 넀이밍할 수 있기 λ•Œλ¬Έμ— μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ— μœ λ¦¬ν•˜λ‹€. 

 

κ°€λ³€μΈμž(varargs)와 μ˜€λ²„λ‘œλ”©

    JDK1.5 λΆ€ν„° λ™μ μœΌλ‘œ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ 개수λ₯Ό 지정할 수 있으며, 이λ₯Ό κ°€λ³€μΈμž(variable arguments)라고 ν•œλ‹€. κ°€λ³€ μΈμžλŠ” νƒ€μž…... λ³€μˆ˜λͺ… κ³Ό 같이 μ„ μ–Έν•œλ‹€. PrintStream 클래슀의 printf() λ©”μ„œλ“œκ°€ λŒ€ν‘œμ μΈ μ˜ˆμ‹œμ΄λ‹€.

public PrintStream printf(String format, Object... args) { ... }

   λ§Œμ•½μ— μ—¬λŸ¬ λ¬Έμžμ—΄μ„ ν•˜λ‚˜λ‘œ κ²°ν•©ν•œ λ‹€μŒ λ°˜ν™˜ν•˜λŠ” concatenate λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜λ €κ³  ν•œλ‹€λ©΄, 맀개 λ³€μˆ˜μ˜ κ°œμˆ˜μ— λ”°λΌμ„œ μ—¬λŸ¬ 개λ₯Ό μ˜€λ²„λ‘œλ”©ν•΄μ•Ό ν•  κ²ƒμ΄μ§€λ§Œ κ°€λ³€ 인자λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©”μ„œλ“œ ν•˜λ‚˜λ§ŒμœΌλ‘œλ„ κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

String concatenate(String... str){
    ...
}

μœ„ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œμ—λŠ” 인자의 개수λ₯Ό κ°€λ³€μ μœΌλ‘œ 지정할 수 μžˆλ‹€ .μ‹¬μ§€μ–΄λŠ” μΈμžκ°€ μ•„μ˜ˆ 없어도 κ°€λŠ₯ν•˜λ©°, 배열을 λ„£λŠ” 것도 κ°€λŠ₯ν•˜λ‹€. κ°€λ³€μΈμžλŠ” λ‚΄λΆ€μ μœΌλ‘œ 배열을 μ΄μš©ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ κ°€λ³€μΈμžκ°€ μ„ μ–Έλœ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ 배열이 μƒˆλ‘œ μƒμ„±λœλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— κ°€λ³€ μΈμžλŠ” νŽΈλ¦¬ν•œ 것은 λ§žμ§€λ§Œ 이와 같은 λΉ„νš¨μœ¨μ μΈ μš”μ†Œκ°€ μˆ¨μ–΄μžˆμœΌλ―€λ‘œ ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λ„λ‘ ν•œλ‹€. 

 

λ‹¨μˆœνžˆ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ λ°°μ—΄λ‘œ ν•˜λŠ” 것이 κ°€λ³€μΈμžμ™€ λ™μΌν• κΉŒ? κ·Έλ ‡μ§€λŠ” μ•Šλ‹€. λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ λ‹¨μˆœνžˆ λ°°μ—΄λ‘œ ν•œ λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ 인자λ₯Ό 지정해주어야 ν•΄μ„œ 인자λ₯Ό μƒλž΅ν•  수 μ—†λ‹€. 

 

κ°€λ³€μΈμžλ₯Ό μ˜€λ²„λ‘œλ”© ν•  λ•Œμ—λŠ” ν•œ 가지 μ£Όμ˜ν•΄μ•Ό ν•  점이 μžˆλ‹€. 

class source{
    public static void main(String[] args) {
        String[] strArr = {"100", "200", "300"};

        System.out.println(concatenate("", "100", "200", "300"));
        System.out.println(concatenate("-", strArr));
        System.out.println(concatenate(",", new String[]{"1", "2", "3"}));
        System.out.println("[" + concatenate(",", new String[0]) + "]");
        System.out.println("["+concatenate(",") + "]");
    }
    static String concatenate(String delim, String... args){
        String result = "";

        for(String str : args){
            result += str + delim;
        }
        return result;
    }

    /*
    static String concatenate(String... args){
        return concatenate("", args);
    }

     */

}

concatenate λ©”μ„œλ“œλŠ” λ§€κ°œλ³€μˆ˜λ‘œ μž…λ ₯된 λ¬Έμžμ—΄μ— λŒ€ν•˜μ—¬ delim 을 사이에 ν¬ν•¨μ‹œμΌœμ„œ λ°˜ν™˜ν•œλ‹€. κ°€λ³€μΈμžλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ˜€μœΌλ―€λ‘œ λ¬Έμžμ—΄ κ°œμˆ˜μ— 상관없이 맀개 λ³€μˆ˜λ‘œ 지정할 수 μžˆλ‹€. μœ„ μ½”λ“œμ—μ„œ 주석 μ²˜λ¦¬ν•œ λ©”μ„œλ“œλ₯Ό ν’€κ³  μ»΄νŒŒμΌμ„ ν•  κ²½μš°μ—λŠ” μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. μ΄λŠ” 두 μ˜€λ²„λ‘œλ”© 된 λ©”μ„œλ“œκ°€ κ΅¬λΆ„λ˜μ§€ μ•Šμ•„μ„œ λ°œμƒν•˜λŠ” κ²ƒμœΌλ‘œ, κ°€λ³€μΈμžλ₯Ό μ„ μ–Έν•œ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λ‘œλ”©ν•˜λ©΄ κ΅¬λ³„λ˜μ§€ λͺ»ν•˜λŠ” κ²½μš°κ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ— 쑰심해야 ν•˜λ©°, κ°€λŠ₯ν•˜λ©΄ κ°€λ³€μΈμžλ₯Ό μ‚¬μš©ν•œ λ©”μ„œλ“œλŠ” μ˜€λ²„λ‘œλ”© ν•˜μ§€ μ•ŠλŠ”κ²ƒμ΄ μ’‹λ‹€.

 

μƒμ„±μž(Constructor)

    μƒμ„±μžλŠ” μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ ν˜ΈμΆœλ˜λŠ” μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λ©”μ„œλ“œμ΄λ‹€. κ·ΈλŸ¬λ―€λ‘œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™” μ‹œ μ‚¬μš©λ˜λ©°, μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μž‘μ—…μ„ μœ„ν•΄μ„œλ„ μ‚¬μš©λœλ‹€. μƒμ„±μžλŠ” λ©”μ„œλ“œμ²˜λŸΌ 클래슀 λ‚΄λΆ€μ—μ„œ μ„ μ–Έλ˜λ©°, λ©”μ„œλ“œμ™€ ꡬ쑰가 μœ μ‚¬ν•˜μ§€λ§Œ 리턴값은 μ—†λ‹€. μƒμ„±μžμ˜ 쑰건은 μ•„λž˜μ™€ κ°™λ‹€.

 

● μƒμ„±μžμ˜ 이름은 클래슀의 이름과 κ°™μ•„μ•Ό ν•œλ‹€.

● μƒμ„±μžλŠ” 리턴값이 μ—†λ‹€.

 

  μƒμ„±μž λ˜ν•œ μ˜€λ²„λ‘œλ”©μ΄ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ 클래슀 λ‚΄μ—μ„œ 맀개 λ³€μˆ˜κ°€ 각각 λ‹€λ₯Έ μ—¬λŸ¬ 개의 μƒμ„±μžλ₯Ό λ§Œλ“€ 수 μžˆλ‹€. λ‹€λ§Œ 쑰심해야할 것은 μƒμ„±μžκ°€ μΈμŠ€ν„΄μŠ€λ₯Ό μ§μ ‘μ μœΌλ‘œ μƒμ„±ν•˜λŠ” 것은 μ•„λ‹ˆλ©°, μ‹€μ œλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것은 μ—°μ‚°μžμΈ new 이닀. λ§Œμ•½μ— Card 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ Card c = new Card(); 와 같은 μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œμΌ°λ‹€κ³  κ°€μ •ν•΄λ³΄μž. 그러면 λ¨Όμ €, new μ—°μ‚°μžμ— μ˜ν•΄μ„œ heap λ©”λͺ¨λ¦¬ μ˜μ—­μ— Card 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€. 그리고 μƒμ„±μž Card() κ°€ ν˜ΈμΆœλ˜μ–΄ μˆ˜ν–‰λ˜λ©°, μ—°μ‚°μž new 에 μ˜ν•œ 결과둜 μƒμ„±λœ Card μΈμŠ€ν„΄μŠ€ μ£Όμ†Œκ°€ λ°˜ν™˜λ˜μ–΄μ„œ μ°Έμ‘° λ³€μˆ˜μΈ c 에 μ €μž₯λ˜λŠ” 것이닀. 

 

κΈ°λ³Έ μƒμ„±μž(Default Constructor)

    λͺ¨λ“  ν΄λž˜μŠ€μ—λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ μƒμ„±μžκ°€ μ •μ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ μ½”λ“œ μƒμ—μ„œ μƒμ„±μžλ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ”λ°, μ΄λŠ” μ»΄νŒŒμΌλŸ¬κ°€ κΈ°λ³Έ μƒμ„±μžλ₯Ό μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 클래슀 λ‚΄λΆ€μ—μ„œ μƒμ„±μžκ°€ ν•˜λ‚˜λ„ μ •μ˜λ˜μ§€ μ•Šμ€ 경우 μ»΄νŒŒμΌλŸ¬λŠ” μ•„λ¬΄λŸ° λ§€κ°œλ³€μˆ˜λ₯Ό 가지지 μ•Šκ³  μ•„λ¬΄λŸ° κΈ°λŠ₯을 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μΆ”κ°€ν•œ λ‹€μŒμ— μ»΄νŒŒμΌμ„ μ§„ν–‰ν•œλ‹€. 

class Data1{
    int value;
}
class Data2{
    int value;
    Data2(int x){
        value = x;
    }
}

class ConstructorTest{
    public static void main(String[] args){
        Data1 d1 = new Data1();
        Data2 d2 = new Data2();
    }
}

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ Data2 d2 = new Data2(); μ—μ„œ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€. Data2 μ—μ„œ Data2() λΌλŠ” μƒμ„±μžλ₯Ό 찾지 λͺ»ν•˜κΈ° λ•Œλ¬ΈμΈλ°, μ΄λŠ” Data2 ν΄λž˜μŠ€μ—μ„œ Data2() λΌλŠ” μƒμ„±μžκ°€ μ •μ˜λ˜μ–΄μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ°œμƒν•œλ‹€. Data1 μ—μ„œλ„ λ™μΌν•œλ° Data1 μ—μ„œλŠ” 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŠ” Data1 μ—μ„œλŠ” μƒμ„±μžκ°€ ν•˜λ‚˜λ„ μ—†μ–΄μ„œ μ»΄νŒŒμΌλŸ¬κ°€ Data1() μ΄λΌλŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μΆ”κ°€ν–ˆκΈ° λ•Œλ¬Έμ΄λ©°, Data2 μ—λŠ” Data2(int x) μƒμ„±μžκ°€ ν•˜λ‚˜ 있기 λ•Œλ¬Έμ— κΈ°λ³Έ μƒμ„±μžλ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šμ€ 것이고, main λ©”μ„œλ“œμ—μ„œ Data2 d2 = new Data2() 와 같이 μž‘μ„±ν•˜λ©΄ Data2() 와 같은 μƒμ„±μžκ°€ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•˜μ§€λ§Œ μ—†κΈ° λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 것이닀.

 

μ•„λž˜μ™€ 같이 맀개 λ³€μˆ˜λ₯Ό κ°€μ§€λŠ” μƒμ„±μžλ₯Ό μ •μ˜ν•˜μ—¬ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ›ν•˜λŠ” κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” ν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν•  수 μžˆλ‹€. 

class Car{
    String color;
    String gearType;
    int door;
    
    Car(){}
    Car(String c, String g, int d){
        color = c;
        gearType = g;
        door = d;
    }
}

 

μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μž ν˜ΈμΆœν•˜κΈ° this(), this

    같은 클래슀의 멀버듀 κ°„μ—λŠ” μ„œλ‘œ 호좜이 κ°€λŠ₯ν•œ 것 처럼 μƒμ„±μž 간에도 μ„œλ‘œ 호좜이 κ°€λŠ₯ν•˜λ‹€. ν•˜μ§€λ§Œ μ΄λŠ” μ•„λž˜μ˜ 두 쑰건을 λ§Œμ‘±ν–ˆμ„ λ•Œ κ°€λŠ₯ν•˜λ‹€.

 

● μƒμ„±μžμ˜ μ΄λ¦„μœΌλ‘œ 클래슀의 이름 λŒ€μ‹ μ— this λ₯Ό μ‚¬μš©ν•  것

● ν•œ μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•Œμ—λŠ” λ°˜λ“œμ‹œ 첫 μ€„μ—μ„œλ§Œ 호좜이 κ°€λŠ₯함

 

μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μžλ₯Ό 첫 μ€„μ—μ„œλ§Œ 호좜이 κ°€λŠ₯ν•˜λ„λ‘ ν•œ 것은 μƒμ„±μž λ‚΄λΆ€μ—μ„œ μ΄ˆκΈ°ν™” μž‘μ—… 도쀑에 λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” κ²½μš°μ—λŠ” 호좜된 λ‹€λ₯Έ μƒμ„±μž λ‚΄μ—μ„œλ„ 멀버 λ³€μˆ˜λ“€μ„ 값을 μ΄ˆκΈ°ν™”ν•œλ‹€λ©΄ 이전 μž‘μ—…μ΄ λ¬΄μ˜λ―Έν•΄μ§€λŠ” κ²½μš°κ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ΄λ©°, κ΄€λ ¨λ˜μ–΄ 좔후에 μžμ„Ένžˆ 닀루도둝 ν•˜μž.

class Car{
    String color;
    String gearType;
    int door;

    Car(){
        this("white", "auto", 4);
    }
    Car(String color){
        this(color, "auto", 4);
    }
    Car(String c, String g, int d){
        this.color = c;
        this.gearType = g;
        this.door = d;
    }
}

  μœ„μ™€ 같이 this λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜λŠ” 것이 μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ— μœ λ¦¬ν•˜λ‹€. this λŠ” μ°Έμ‘° λ³€μˆ˜λ‘œ μΈμŠ€ν„΄μŠ€ μžμ‹ μ„ 가리킨닀. μ°Έμ‘° λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ μΈμŠ€ν„΄μŠ€ 멀버에 μ ‘κ·Όν–ˆλ˜κ²ƒ 처럼 this λ₯Ό μ΄μš©ν•΄μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” 것이닀. ν•˜μ§€λ§Œ this λŠ” μΈμŠ€ν„΄μŠ€ λ©€λ²„λ§Œ μ‚¬μš©ν•  수 있으며 static λ©”μ„œλ“œ(클래슀 λ©”μ„œλ“œ)μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ‚¬μš©ν•  수 μ—†λŠ” κ²ƒμ²˜λŸΌ this λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. static λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ 호좜될 수 μžˆμœΌλ―€λ‘œ static λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„μˆ˜λ„ 있기 λ•Œλ¬Έμ΄λ‹€. 

 

  μƒμ„±μžλ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—λŠ” μžμ‹ μ΄ κ΄€λ ¨λœ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘° λ³€μˆ˜μΈ this κ°€ μ§€μ—­λ³€μˆ˜λ‘œ μˆ¨κ²¨μ§„ μƒνƒœλ‘œ μ „μž¬ν•œλ‹€. 보톡 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” νŠΉμ • μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨λœ μž‘μ—…μ„ ν•˜λ―€λ‘œ μžμ‹ κ³Ό κ΄€λ ¨λœ μΈμŠ€ν„΄μŠ€μ˜ 정보가 ν•„μš”ν•˜μ§€λ§Œ, static λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨ μ—†λŠ” μžμ—…μ„ ν•΄μ„œ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 정보가 ν•„μš” μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

● this : μΈμŠ€ν„΄μŠ€ 자기 μžμ‹ μ„ κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ³€μˆ˜λ‘œ, μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°€ μ €μž₯λ˜μ–΄ 있으며 λͺ¨λ“  μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ— 지역 λ³€μˆ˜λ‘œ μˆ¨κ²¨μ§„ μƒνƒœλ‘œ μ‘΄μž¬ν•œλ‹€.

● this(), this(parameter)  :  μƒμ„±μžλ‘œ, 같은 클래슀의 λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•Œ 이와 같이 μ‚¬μš©ν•œλ‹€.

 

λ§Œμ•½μ— ν˜„μž¬ μ‚¬μš©ν•˜κ³  μžˆλŠ” μΈμŠ€ν„΄μŠ€μ™€ λ™μΌν•œ μƒνƒœλ₯Ό κ°€μ§€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜ 더 λ§Œλ“€κ³ μž ν•œλ‹€λ©΄ μƒμ„±μžλ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€. 두 개의 μΈμŠ€ν„΄μŠ€κ°€ 같은 μƒνƒœλ₯Ό κ°€μ§„λ‹€λŠ” 것은 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ 값이 λͺ¨λ‘ λ™μΌν•˜λ‹€λŠ” 것이닀.

Car(Car c){
    color = c.color;
    gearType = c.gearType;
    door = c.door;
}

이와 같이 μƒμ„±μžλ₯Ό κ΅¬ν˜„ν•˜λ©΄, λ§€κ°œλ³€μˆ˜λ‘œ λ„˜μ–΄μ˜¨ Car μΈμŠ€ν„΄μŠ€μ™€ λ™μΌν•œ μƒνƒœμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ‰½κ²Œ λ§Œλ“€ 수 μžˆλ‹€. 

 

λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”

    λ³€μˆ˜ μ„ μ–Έ μ‹œ, λ©€λ²„λ³€μˆ˜(클래슀 λ³€μˆ˜, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜)와 λ°°μ—΄μ˜ μ΄ˆκΈ°ν™”λŠ” μ„ νƒμ μ΄μ§€λ§Œ, μ§€μ—­λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”λŠ” ν•„μˆ˜μ μ΄λ‹€. μ§€μ—­λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šκ³  컴파일 μ‹œ, μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. λ©€λ²Ό λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” λ°©λ²•μ—λŠ” 3가지가 μ‘΄μž¬ν•œλ‹€.

 

1. λͺ…μ‹œμ  μ΄ˆκΈ°ν™”(explicit initialization)

  λ³€μˆ˜λ₯Ό 선언함과 λ™μ‹œμ— μ΄ˆκΈ°ν™”ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. κΈ°λ³Έν˜• λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”λŠ” int door = 4; 와 같이 ν•˜κ³ , μ°Έμ‘°ν˜• λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”λŠ” Engine e = new Engine(); κ³Ό 같이 ν•΄μ£Όλ©΄ λœλ‹€. κ°„λ‹¨ν•˜κ³  λͺ…λ£Œν•œ λ°©λ²•μ΄μ§€λ§Œ, λ³΅μž‘ν•œ μ΄ˆκΈ°ν™” μž‘μ—…μ΄ ν•„μš”ν•  μ‹œμ—λŠ” μ΄ˆκΈ°ν™” λΈ”λŸ­(initializaton block) ν˜Ήμ€ μƒμ„±μžλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

2. μ΄ˆκΈ°ν™” λΈ”λŸ­(initialization block)

  μ΄ˆκΈ°ν™” λΈ”λŸ­μ€ 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­κ³Ό μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­μ΄ μžˆλ‹€. 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­μ€ 클래슀 λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”μ— μ‚¬μš©λ˜λ©°, μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­μ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”μ— μ‚¬μš©λœλ‹€. μ΄ˆκΈ°ν™” λΈ”λŸ­ λ‚΄μ—μ„œλŠ” λ©”μ„œλ“œ λ‚΄μ—μ„œμ™€ 같이 쑰건문, 반볡문, μ˜ˆμ™Έμ²˜λ¦¬ 등을 자유둭게 μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ—, μ΄ˆκΈ°ν™” μž‘μ—…μ΄ λ³΅μž‘ν•˜μ—¬ λͺ…μ‹œμ  μ΄ˆκΈ°ν™”λ§ŒμœΌλ‘œλŠ” λΆ€μ‘±ν•œ κ²½μš°μ— μ΄ˆκΈ°ν™” λΈ”λŸ­μ„ μ‚¬μš©ν•œλ‹€. 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­μ€ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­ μ•žμ— static ν‚€μ›Œλ“œλ₯Ό λ§λΆ™μ—¬μ£ΌκΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

class temp{
	static { /* 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­ */ }
    
    {
      /* μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­ */
    }
}

  μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” 주둜 μƒμ„±μžλ₯Ό ν™œμš©ν•˜μ—¬ μ΄ˆκΈ°ν™”ν•˜κ³ , μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­μ€ λͺ¨λ“  μƒμ„±μžμ—μ„œ κ³΅ν†΅μœΌλ‘œ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” μ½”λ“œλ₯Ό λ„£λŠ”λ°μ— μ‚¬μš©ν•œλ‹€.

class Car{
    String color;
    String gearType;
    int door;
    int count;
    int serialNo;
    Car(){
        count++;
        serialNo = count;
        color = "White";
        gearType = "Auto";
    }
    Car(String color, String gearType) {
        count++;
        serialNo = count;
        this.color = color;
        this.gearType = gearType;
    }
}

  μœ„ μ½”λ“œλ₯Ό 보면, Car() μƒμ„±μžμ™€ Car(String color, String gearType) μƒμ„±μžμ— μ€‘λ³΅λœ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” 뢀뢄이 μ‘΄μž¬ν•œλ‹€. μ΄λŸ¬ν•œ 쀑볡은 μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜λ₯Ό μ–΄λ ΅κ²Œ ν•˜λŠ” μ£Όμš” μš”μΈμ΄ λœλ‹€. 이와 같이 클래슀의 λͺ¨λ“  μƒμ„±μžμ— λŒ€ν•˜μ—¬ κ³΅ν†΅μ μœΌλ‘œ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  λ¬Έμž₯μ—λŠ” μΈμŠ€ν„΄μŠ€ λΈ”λŸ­μ„ ν™œμš©ν•˜λ©΄ 보닀 간결해진닀. μ½”λ“œ 쀑볡을 μ œκ±°ν•¨μœΌλ‘œμ¨ μ½”λ“œμ˜ 신뒰성을 λ†’μ—¬ μ£Όκ³ , 였λ₯˜ λ°œμƒ κ°€λŠ₯성을 쀄여쀀닀. μž¬μ‚¬μš©μ„±μ„ 높이고, 쀑볡을 μ œκ±°ν•˜λŠ” 것이 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°μ΄ μΆ”κ΅¬ν•˜λŠ” ꢁ극적인 λͺ©ν‘œμ΄λ‹€.

class Car{
    String color;
    String gearType;
    int door;
    int count;
    int serialNo;
    {
        count++;
        serialNo = count;
    }
    Car(){

        color = "White";
        gearType = "Auto";
    }
    Car(String color, String gearType) {
        this.color = color;
        this.gearType = gearType;
    }
}
class source{
    static{ // 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­
        System.out.println("static { }");
    }
    { // μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­
        System.out.println("{  }");
    }
    public source(){
        System.out.println("generator");
    }
    public static void main(String[] args) {
        System.out.println("source bt = new source() ; ");
        source bt = new source();

        System.out.println("source bt2 = new source() ; ");
        source bt2 = new source();
    }
}

 

  μœ„ μ½”λ“œκ°€ μ‹€ν–‰λ˜λ©΄ source κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ”©λ˜κ³ , class μ΄ˆκΈ°ν™” λΈ”λŸ­μ΄ μˆ˜ν–‰λ˜μ–΄ static { } 이 화면에 좜λ ₯λœλ‹€. λ‹€μŒμ—λŠ” main λ©”μ„œλ“œμ˜ μˆ˜ν–‰μ— λ”°λΌμ„œ source μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ–΄, μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­μ΄ μ‹€ν–‰λ˜κ³ , μƒμ„±μžκ°€ μ‹€ν–‰λœλ‹€. 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­μ€ λ©”λͺ¨λ¦¬μ— λ‘œλ”©λ  λ•Œ 졜초 1회만 μˆ˜ν–‰λ˜μ§€λ§Œ, μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­μ€ μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œλ§ˆλ‹€ μˆ˜ν–‰λ˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

class source{
    static int[] arr = new int[10];
    static{
        for(int i = 0 ; i < arr.length; i ++)
        {
            arr[i] = (int)(Math.random()*10 + 1);
        }
    }
    public static void main(String[] args) {
        for(int i = 0 ; i < arr.length ; i ++)
            System.out.println("arr[" + i + "] = " + arr[i]);
    }
}

  이와 같이 λ°°μ—΄μ΄λ‚˜ μ˜ˆμ™Έμ²˜λ¦¬ λ“± λ³΅μž‘ν•œ μ΄ˆκΈ°ν™” μž‘μ—…μ΄ ν•„μš”ν•œ κ²½μš°μ—λŠ” λͺ…μ‹œμ  μ΄ˆκΈ°ν™”λ§Œ μ΄μš©ν•˜μ—¬ μˆ˜ν–‰ν•  수 μ—†κ³  클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­μ„ μ‚¬μš©ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆλ‹€.

 

멀버 λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™” μ‹œκΈ° 및 μˆœμ„œ

    μ΄ˆκΈ°ν™”κ°€ μˆ˜ν–‰λ˜λŠ” μˆœμ„œμ— λŒ€ν•˜μ—¬ μ•Œμ•„λ³΄μž. 클래슀 λ³€μˆ˜λŠ” ν΄λž˜μŠ€κ°€ 처음 λ‘œλ”©λ  λ•Œ, 졜초 1회 μ΄ˆκΈ°ν™”λœλ‹€. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œλ§ˆλ‹€ 각 μΈμŠ€ν„΄μŠ€ λ³„λ‘œ μ΄ˆκΈ°ν™”κ°€ 이루어진닀. ν΄λž˜μŠ€λ³€μˆ˜λŠ” κΈ°λ³Έκ°’ - λͺ…μ‹œμ  μ΄ˆκΈ°ν™” - 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­μ˜ μˆœμ„œλ‘œ μ΄ˆκΈ°ν™”κ°€ μ§„ν–‰λ˜λ©°, μΈμŠ€ν„΄μŠ€λ³€μˆ˜λŠ” κΈ°λ³Έκ°’ - λͺ…μ‹œμ  μ΄ˆκΈ°ν™” - μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­ - μƒμ„±μž μˆœμ„œλ‘œ μ΄ˆκΈ°ν™”κ°€ μ§„ν–‰λœλ‹€.

 

  ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 도쀑에 ν΄λž˜μŠ€μ— λŒ€ν•œ 정보가 ν•„μš”ν•˜λ‹€λ©΄, ν΄λž˜μŠ€λŠ” λ©”λͺ¨λ¦¬μ— λ‘œλ”©λœλ‹€. 클래슀 멀버λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œ, μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν–ˆμ„ λ•Œμ™€ 같은 상황에 ν•΄λ‹Ήν•œλ‹€. ν•˜μ§€λ§Œ ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— 이미 μ˜¬λΌμ™€μžˆλ‹€λ©΄, λ‹€μ‹œ λ‘œλ”©ν•˜μ§€ μ•Šκ³  μ΄ˆκΈ°ν™”λ„ μ§„ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€. 

 

   ν΄λž˜μŠ€μ˜ λ‘œλ”© μ‹œκΈ°λŠ” μ–΄λ–€ JVM 을 μ‚¬μš©ν•˜λŠλƒμ— λ”°λΌμ„œ λ‹¬λΌμ§ˆ 수 μžˆλ‹€. ν΄λž˜μŠ€κ°€ ν•„μš”ν•  λ•Œ λ°”λ‘œ λ©”λͺ¨λ¦¬μ— λ‘œλ”©λ  μˆ˜λ„ 있고, μ‹€ν–‰νš¨μœ¨μ„ 높이기 μœ„ν•΄μ„œ ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ 미리 λ‘œλ”©λ˜λ„λ‘ μ„€κ³„λœ κ²½μš°λ„ μžˆλ‹€.

class InitTest{
    // Explicit initialization
    static int cv = 1; 
    int iv = 1;
    
    static { cv = 2; } // class μ΄ˆκΈ°ν™” λΈ”λŸ­
    { iv = 2; }; // instance μ΄ˆκΈ°ν™” λΈ”λŸ­
    
    InitTest(){ // Constructor
        iv = 3;
    }
}

 

  μœ„ ν΄λž˜μŠ€λŠ” 클래슀 λ³€μˆ˜ cv 와 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ iv λ₯Ό ν•˜λ‚˜μ”© 가지고 μžˆλ‹€. μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ˜€μ„ λ•Œ, λ¨Όμ € cv κ°€ λ©”λͺ¨λ¦¬(method area)에 μƒμ„±λ˜κ³  cv μ—λŠ” int ν˜•μ˜ 기본값인 0 이 μ €μž₯λœλ‹€. κ·Έ λ‹€μŒμ—λŠ” λͺ…μ‹œμ  μ΄ˆκΈ°ν™”μ— μ˜ν•΄ cv μ—λŠ” 1이 μ €μž₯되고, λ§ˆμ§€λ§‰μ— 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­μ΄ μˆ˜ν–‰λ˜μ–΄ cv 에 2κ°€ μ €μž₯λœλ‹€.

 

  InitTest 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λ©΄μ„œ, iv κ°€ λ©”λͺ¨λ¦¬(heap)에 μ˜¬λΌκ°„λ‹€. iv μ—­μ‹œ int ν˜• λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— 기본값인 0 이 μ €μž₯되고 λ‹€μŒμ—λŠ” λͺ…μ‹œμ  μ΄ˆκΈ°ν™”μ— μ˜ν•΄ 1이 μ €μž₯λœλ‹€. 그리고 μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­μ΄ μˆ˜ν–‰λ˜μ–΄ iv μ—λŠ” 2κ°€ μ €μž₯되고, μ΅œμ’…μ μœΌλ‘œ μƒμ„±μžμ— μ˜ν•΄ 3이 μ €μž₯λœλ‹€.

 

class Document{
    static int count = 0 ;
    String name; // Document name
    Document()
    {
        this("no_title" + (++count));
    }
    Document(String name){
        this.name = name;
        System.out.println("Document " + this.name + " is generated.");
    }
}

class source {
    public static void main(String[] args) {
        Document d1 = new Document();
        Document d2 = new Document("Java.txt");
        Document d3 = new Document();
        Document d4 = new Document();
    }
}

  Document μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œλ§ˆλ‹€ count 값을 μ¦κ°€μ‹œμΌœμ„œ, Document 의 이름을 μ„€μ •ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” no_title1, no_title2, no_title3 κ³Ό 같이 κ΅¬λΆ„λ˜λ„λ‘ μ„€μ •ν•˜μ˜€λ‹€. μΈμŠ€ν„΄μŠ€ 생성 μ‹œ κ³΅ν†΅μ μœΌλ‘œ μˆ˜ν–‰λ˜λŠ” μž‘μ—…μ΄λ―€λ‘œ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­μ„ μ΄μš©ν•˜μ˜€λ‹€.

 


References

https://opentutorials.org/course/1223/4551

 

μ–Έμ–΄μ†Œκ°œ - μƒν™œμ½”λ”©

Java의 역사 1995λ…„ μžλ°”μ˜ 아버지라고 λΆˆλ¦¬λŠ” μ œμž„μŠ€ 고슬링과 그의 λ™λ£Œλ“€μ— μ˜ν•΄μ„œ μ‹œμž‘λœ ν”„λ‘œμ νŠΈλ‹€. JavaλŠ” μ›λž˜ κ°€μ „μ œν’ˆμ„ μ œμ–΄ν•˜κΈ° μœ„ν•œ μ–Έμ–΄λ‘œ κ³ μ•ˆλ˜μ—ˆμ§€λ§Œ μ›Ήμ˜ λ“±μž₯으둜 μ—„μ²­λ‚œ 성곡

opentutorials.org

http://www.yes24.com/Product/Goods/24259565

 

Java의 정석 - YES24

졜근 7λ…„λ™μ•ˆ μžλ°” λΆ„μ•Όμ˜ 베슀트 μ…€λŸ¬ 1μœ„λ₯Ό μ§€μΌœμ˜¨ `μžλ°”μ˜ 정석`의 μ΅œμ‹ νŒ. μ €μžκ°€ μΉ΄νŽ˜μ—μ„œ 12λ…„κ°„ 직접 λ…μžλ“€μ—κ²Œ 닡변을 ν•΄μ˜€λ©΄μ„œ μ΄ˆλ³΄μžκ°€ μ–΄λ €μ›Œν•˜λŠ” 뢀뢄을 잘 νŒŒμ•…ν•˜κ³  μ“΄ μ±…. 뿐만 μ•„

www.yes24.com

 

 

728x90
λ°˜μ‘ν˜•
LIST

'πŸ’» Study ! > JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[CH07] 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°3 (OOP)  (0) 2022.08.01
[CH07] 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°2 (OOP)  (0) 2022.07.31
[CH05] λ°°μ—΄  (0) 2022.07.06
[CH02.] λ³€μˆ˜ (Variable)  (0) 2022.07.05
0. JAVA λž€?  (0) 2022.07.04
Comments