πŸ“•JAVA

[JAVA] 쀑첩 클래슀

λΉ™λ””μš© 2024. 4. 29.

 

- 클래슀 μ•ˆμ— 클래슀λ₯Ό μ€‘μ²©ν•΄μ„œ μ •μ˜ν•  수 μžˆλŠ”λ°, 이λ₯Ό 쀑첩 클래슀라고 ν•œλ‹€.

Class class1 {
    Class class2{
    ...
    }
}

1. 쀑첩 클래슀의 λΆ„λ₯˜

- 쀑첩 ν΄λž˜μŠ€μ—λŠ” 크게 λ‘κ°€μ§€λ‘œ λΆ„λ₯˜ν•  수 μžˆλŠ”λ°, 정적 쀑첩 클래슀(1개), λ‚΄λΆ€ 클래슀(3개)κ°€ 이것이닀.

- 쀑첩 클래슀λ₯Ό μ •μ˜ν•˜λŠ” μœ„μΉ˜λŠ” λ³€μˆ˜μ˜ μ„ μ–Έ μœ„μΉ˜μ™€ κ°™λ‹€.

- 지역 ν΄λž˜μŠ€λŠ” 지역 λ³€μˆ˜μ™€ 같이 μ½”λ“œ λΈ”λŸ­ μ•ˆμ—μ„œ 클래슀λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

Class class1 {
	
    //정적 쀑첩 클래슀
    static class StaticNested {
    }
	
    //λ‚΄λΆ€ 클래슀
    Class class2 {
    }
    
    Class LocalClass {
    ...
    }
    
    Local local = new Local();
}

 

- 정적 쀑첩 ν΄λž˜μŠ€λŠ” λ°”κΉ₯ 클래슀의 μ•ˆμ— μžˆμ§€λ§Œ λ°”κΉ₯ ν΄λž˜μŠ€μ™€ 관계가 μ „ν˜€ μ—†λŠ” λ‹€λ₯Έ 클래슀λ₯Ό λ§ν•˜λ©°, λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” λ°”κΉ₯ 클래슀의 내뢀에 μžˆμœΌλ©΄μ„œ λ°”κΉ₯ 클래슀λ₯Ό κ΅¬μ„±ν•˜λŠ” μš”μ†Œλ₯Ό λ§ν•œλ‹€.

  정적 쀑첩 클래슀 λ‚΄λΆ€ 클래슀
νŠΉμ§• - static이 λΆ™λŠ”λ‹€.
- λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ— μ†Œμ†λ˜μ§€ μ•ŠλŠ”λ‹€.
- static이 뢙지 μ•ŠλŠ”λ‹€.
- λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ— μ†Œμ†λœλ‹€.

 

* λ‚΄λΆ€ 클래슀 μ’…λ₯˜

- λ‚΄λΆ€ 클래슀 : λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ˜ 맴버에 μ ‘κ·Ό

- 지역 클래슀 : λ‚΄λΆ€ 클래슀의 νŠΉμ§• + 지역 λ³€μˆ˜μ— μ ‘κ·Ό

- 읡λͺ… 클래슀 : 지역 클래슀의 νŠΉμ§• + 클래슀의 이름이 μ—†λŠ” νŠΉλ³„ν•œ 클래슀

 

* 쀑첩 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

- 논리적 κ·Έλ£Ήν™” : νŠΉμ • ν΄λž˜μŠ€κ°€ ν•˜λ‚˜μ˜ 클래슀 μ•ˆμ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” 경우

- μΊ‘μŠν™” : 쀑첩 λ°”κΉ₯ ν΄λž˜μŠ€λŠ” private λ§΄λ²„λ‘œ μ ‘κ·Ό κ°€λŠ₯, 이λ₯Ό 톡해 κΈ΄λ°€ν•˜κ²Œ μ—°κ²°ν•  수 μžˆλ‹€.

2. 정적 쀑첩 클래슀

- μžμ‹ μ˜ λ©€λ²„μ—λŠ” μ ‘κ·Ό κ°€λŠ₯

- λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€ λ©€λ²„μ—λŠ” μ ‘κ·Ό λΆˆκ°€λŠ₯

- λ°”κΉ₯ 클래슀의 클래슀 λ©€λ²„μ—λŠ” μ ‘κ·Ό κ°€λŠ₯ (private도 κ°€λŠ₯)

 

3. λ‚΄λΆ€ 클래슀

- μžμ‹ μ˜ 멀버에 μ ‘κ·Ό κ°€λŠ₯

- λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€ 멀버에 μ ‘κ·Ό κ°€λŠ₯

- λ°”κΉ₯ 클래슀의 클래슀 멀버에도 μ ‘κ·Ό κ°€λŠ₯

//생성방법
InnerOuter outer = new InnerOuter();
IntterOuter.Inner inner = outer.new Inner();

- λ°”κΉ₯ ν΄λž˜μŠ€μ—μ„œ λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•ŒλŠ” λ°”κΉ₯ 클래슀 이름을 μƒλž΅ν•  수 μžˆλ‹€.

- λ°”κΉ₯ ν΄λž˜μŠ€μ—μ„œ λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” μžμ‹ μ„ μƒμ„±ν•œ λ°”κΉ₯ 클래슀이 μΈμŠ€ν„΄μŠ€λ₯Ό μžλ™μœΌλ‘œ μ°Έμ‘°ν•œλ‹€.

4. 같은 μ΄λ¦„μ˜ λ°”κΉ₯ λ³€μˆ˜ μ ‘κ·Ό

- λ³€μˆ˜μ˜ 이름이 같을 λ•Œμ—λŠ” μš°μ„ μˆœμœ„μ— 따라 좜λ ₯λœλ‹€.

public class Outer {

	public int value = 1;
    
    class Inner{
    	public int value = 2;
        
        vold go(){
        	int value = 3;
		}
	}
}

- μ½”λ“œκ°€ μœ„μ™€ 같을 λ•Œ 처음 valueλ₯Ό μ‘°νšŒν•˜λ©΄ 3이 λ‚˜μ˜¨λ‹€. (μ§€μ—­λ³€μˆ˜ 이기 λ•Œλ¬Έ)

- value = 2λ₯Ό μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ” this.value λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€. (λ‚΄λΆ€ 클래슀)

- value = 1을 μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ” Outer.valueλ₯Ό μ ‘κ·Όν•˜λ©΄ λœλ‹€. (λ°”κΉ₯ 클래슀)

- 이름이 같은건 별ㄹ 쒋지 μ•Šμ€ μ½”λ“œμž„

5. 지역 클래슀

- 지역 ν΄λž˜μŠ€λŠ” λ‚΄λΆ€ 클래슀의 ν•œ μ’…λ₯˜μ΄λ©° λ•Œλ¬Έμ— μ½”λ“œ λΈ”λŸ­ μ•ˆμ—μ„œ μ •μ˜λœλ‹€.

- 지역 ν΄λž˜μŠ€λŠ” 지역 λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

1) 지역 클래슀의 μ ‘κ·Ό λ²”μœ„

- μžμ‹ μ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μΈ value μ ‘κ·Ό κ°€λŠ₯

- μžμ‹ μ΄ μ†ν•œ μ½”λ“œ λΈ”λ¦­μ˜ μ§€μ—­λ³€μˆ˜ μ ‘κ·Ό κ°€λŠ₯

- μžμ‹ μ΄ μ†ν•œ μ½”λ“œ λΈ”λŸ­μ˜ λ§€κ°œλ³€μˆ˜ μ ‘κ·Ό κ°€λŠ₯

- λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€ 맴버에도 μ ‘κ·Ό κ°€λŠ₯

- μ ‘κ·Ό μ œμ–΄μž (private) μ‚¬μš© 뢈

6. 지역 클래슀 - 지역 λ³€μˆ˜ 캑쳐

* λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°

- 클래슀 λ³€μˆ˜ : ν”„λ‘œκ·Έλž¨ μ’…λ£Œ κΉŒμ§€λ‘œ κ°€μž₯ κΈΈλ‹€(λ©”μ„œλ“œ μ˜μ—­)

- μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ : μΈμŠ€ν„΄μŠ€μ˜ 생쑴 κΈ°κ°„(νž™ μ˜μ—­)

- 지역 λ³€μˆ˜ : λ©”μ„œλ“œμ˜ 호좜이 λλ‚˜λ©΄ 사라짐(슀 μ˜μ—­)

 

- 지역 ν΄λž˜μŠ€λŠ” 지역 λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆμ§€λ§Œ, 지역 λ³€μˆ˜μ˜ 생λͺ…μ£ΌκΈ°λŠ” 짧고 지역 클래슀λ₯Ό 톡해 μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ˜ 생λͺ…μ£ΌκΈ°λŠ” κΈΈλ‹€λŠ” λ¬Έμ œκ°€ μžˆλ‹€.

1) 지역 λ³€μˆ˜ 캑쳐

- μœ„μ™€ 같은 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μžλ°”μ—μ„  지역 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” μ‹œμ μ— ν•„μš”ν•œ 지역 λ³€μˆ˜λ₯Ό λ³΅μ‚¬ν•΄μ„œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ— ν•¨κ»˜ λ„£μ–΄λ‘”λ‹€.

 

* 캑쳐 κ³Όμ •

 

1. LocalPrinter μΈμŠ€ν„΄μŠ€ 생성 μ‹œλ„ : 지역 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ 지역 ν΄λž˜μŠ€κ°€ μ ‘κ·Όν•˜λŠ” 지역 λ³€μˆ˜λ₯Ό 확인

2. μ‚¬μš©ν•˜λŠ” 지역 λ³€μˆ˜ 볡사 : 지역 ν΄λž˜μŠ€κ°€ μ‚¬μš©ν•˜λŠ” 지역 λ³€μˆ˜λ₯Ό 볡사(λ§€κ°œλ³€μˆ˜λ„ 지역 λ³€μˆ˜μ˜ ν•œ μ’…λ₯˜) 

3. 지역 λ³€μˆ˜ 볡사 μ™„λ£Œ : λ³΅μ‚¬ν•œ 지역 λ³€μˆ˜λ₯Ό μΈμŠ€ν„΄μŠ€μ— ν¬ν•¨ν•œλ‹€.

4. μΈμŠ€ν„΄μŠ€ 생성 μ™„λ£Œ :  λ³΅μ‚¬ν•œ 지역 λ³€μˆ˜λ₯Ό ν¬ν•¨ν•΄μ„œ μΈμŠ€ν„΄μŠ€ 생성이 μ™„λ£Œλœλ‹€. 

 

- LocalPrint μΈμŠ€ν„΄μŠ€μ—μ„œ print()λ₯Ό 톡해 ParamVar, localVar μ ‘κ·Όμ‹œ μŠ€νƒ μ˜μ—­μ— μžˆλŠ” 지역 λ³€μˆ˜μ— μ ‘κ·Όν•˜λŠ” 것이 μ•„λ‹Œ, μΈμŠ€ν„΄μŠ€μ— μžˆλŠ” μΊ‘μ³ν•œ λ³€μˆ˜μ— μ ‘κ·Όν•˜λŠ” 것이닀.

- 캑쳐된 Valλ“€μ˜ 생λͺ…μ£ΌκΈ°λŠ” LocalPrinerμΈμŠ€ν„΄μŠ€μ˜ 생λͺ…주기와 κ°™κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ 생λͺ…μ£ΌκΈ°κ°€ λ‹€λ₯Έ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

- 지역 ν΄λž˜μŠ€κ°€  μ ‘κ·Όν•˜λŠ” 지역 λ³€μˆ˜λŠ” μ ˆλŒ€λ‘œ 값이 쀑간에 λ³€κ²½λ˜λ©΄ μ•ˆλœλ‹€ (final)

7. 읡λͺ… 클래슀

- 지역 클래슀의 νŠΉλ³„ν•œ μ’…λ₯˜ 쀑 ν•˜λ‚˜λ‘œ 이름이 μ—†λ‹€λŠ” 것이 νŠΉμ§•μ΄λ‹€.

- 읡λͺ… ν΄λž˜μŠ€λŠ” 클래슀의 μ„ μ–Έκ³Ό 생성을 ν•œλ²ˆμ— μ²˜λ¦¬ν•  수 μžˆλ‹€.

Printer printer = new Printer(){
	//body
}

- 읡λͺ… ν΄λž˜μŠ€λŠ” 클래슀의 body μ •μ˜ν•˜λ©΄μ„œ λ™μ‹œμ— μƒμ„±λœλ‹€.

 

* 읡λͺ… 클래슀 νŠΉμ§•

- 이름 μ—†λŠ” 지역 클래슀λ₯Ό μ„ μ–Έν•˜λ©΄μ„œ λ™μ‹œμ— μƒμ„±ν•œλ‹€.

- 읡λͺ… ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀λ₯Ό μƒμ†λ°›κ±°λ‚˜, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

- 이름을 가지지 μ•ŠκΈ° λ•Œλ¬Έμ— μƒμ„±μž¦λ₯Ό κ°€μ§ˆ 수 μ—†λ‹€ (κΈ°λ³Έ μƒμ„±μžλ§Œ μ‚¬μš©)

 

* 읡λͺ… 클래슀의 μž₯점

- 클래슀λ₯Ό λ³„λ„λ‘œ μ •μ˜ν•˜μ§€ μ•Šκ³ λ„ μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀λ₯Ό κ΅¬ν˜„ν•  수 μžˆμ–΄μ„œ μ½”λ“œκ°€ 더 간결해진닀.

- 지역 ν΄λž˜μŠ€κ°€ μΌνšŒμ„±μœΌλ‘œ μ‚¬μš©λ˜λŠ” κ²½μš°λ‚˜ κ°„λ‹¨ν•œ κ΅¬ν˜„μ„ μ œκ³΅ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

 

 

* μžλ°”8 μ΄μ „κΉŒμ§€ λ©”μ„œλ“œμ— 인수둜 전달할 수 μžˆλŠ” 것은 크게 2가지 (κΈ°λ³Έν˜•, μ°Έμ‘°ν˜•)

* μžλ°”8 이후뢀터 ν•¨μˆ˜λ₯Ό 인수둜 전달할 수 있게 λ˜μ—ˆλŠ”λ° 이걸 λžŒλ‹€λΌκ³  ν•œλ‹€.

 

 

- μ°Έκ³  : κΉ€μ˜ν•œμ˜ μ‹€μ „ μžλ°” - 쀑급 1편

λŒ“κΈ€