Vibe.ai
λ°˜μ‘ν˜•

 

πŸ‘€Today...


μ •μ‹ μ—†μ—ˆλ˜ 주말이 μ§€λ‚˜κ°”λ‹€... μ •μ²˜κΈ°λŠ” κ°€μ±„μ ν•΄λ΄€μ„λ•Œ ν•©κ²©ν•œκ²ƒκ°™λ‹€. λŒ€ν•™κ΅ λ‹€λ‹ˆλ˜λ•Œμ— C++을 배운적이 μžˆμ—ˆλŠ”λ° κ°μ²΄μ§€ν–₯μ΄λΌλŠ” κ°œλ…μ΄ λ„μ €νžˆ λ‚΄λ¨Έλ¦¬λ‘œλŠ” 이해가 μ•ˆκ°€κ³  μ–΄λ €μ› λ˜κ²ƒκ°™λ‹€. μ§€κΈˆλ„ μ–΄λ ΅κΈ΄ ν•˜μ§€λ§Œ κ·Έλ•Œλ³΄λ‹€ μ‘°κΈˆλ” μ΄ν•΄κ°€λ˜λŠ” λŠλ‚Œμ΄λ‹€. λ…ΈνŠΈλΆλ„ κ³ μž₯λ‚˜κ³  ν™˜κ²½μƒ 많이 μ–΄λ ΅μ§€λ§Œ 계속 κ³΅λΆ€ν•˜μž! ν™”μ΄νŒ…

 

β˜•μ˜€λŠ˜μ˜ TIL(Today I Learn)


μƒμ„±μž

μƒμ„±μž(Constructor)λŠ” 말 κ·ΈλŒ€λ‘œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 역할을 ν•˜λŠ” 클래슀의 κ΅¬μ„±μš”μ†Œμ΄λ‹€. μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ λ•Œ ν˜ΈμΆœλ˜λŠ” μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λ©”μ„œλ“œ 이닀. new ν‚€μ›Œλ“œλ₯Ό 톡해 객체λ₯Ό μƒμ„±ν• λ•Œ ν˜ΈμΆœλ˜λŠ”κ²ƒμ΄ 이 μƒμ„±μžλΌλŠ” 것이닀.

 

μƒμ„±μžκ°€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 역할이닀 ? (X)

μΈμŠ€ν„΄μŠ€ 생성을 ν•˜λŠ”μ—­ν•  > new ν‚€μ›Œλ“œ (O)

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ“€μ„ μ΄ˆκΈ°ν™” ν•˜λŠ” μ—­ν•  > μƒμ„±μž (O)

μƒμ„±μžλŠ” λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ λ§Œλ“€μ–΄μ§„λ‹€.

class Constructor{
	Constructor(){		//μƒμ„±μž 선언이 μ—†μ„μ‹œμ—λŠ” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μžλ™μƒμ„±
    }
    Constructor(String str){	//μƒμ„±μž overloading1
    }
    Constructor(int a,int b){	//μƒμ„±μž overloading2
    }

 

μƒμ„±μž μƒμ„±μ˜ κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™λ‹€.

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

2. μƒμ„±μžλŠ” return νƒ€μž…μ΄ μ—†λ‹€.

3. ν΄λž˜μŠ€μ•ˆμ—λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜ μ΄μƒμ˜ μƒμ„±μžκ°€ 쑴재(선언이 μ—†μ„μ‹œμ—λŠ” default Constructorκ°€ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μžλ™ 생성)

4. μƒμ„±μžκ°€ μ„ μ–Έλ˜λ©΄ μ„ μ–Έλœ μƒμ„±μžλ₯Ό 기본으둜 μ‚¬μš©ν•œλ‹€.

class Car{
    int num;
    String str;
    
    public Car(int num, String str){  //μƒμ„±μž
    this.num = num;					  //thisν‚€μ›Œλ“œλ‘œ Car클래슀의 λ©€λ²„λ³€μˆ˜ μ΄ˆκΈ°ν™”
    this.str = str;					  //thisν‚€μ›Œλ“œλ‘œ Car클래슀의 λ©€λ²„λ³€μˆ˜ μ΄ˆκΈ°ν™”
    }							
}

public class ConstructorExample {
    public static void main(String[] args) {
        Car c = new Car(1118,"λ²€μΈ ");
		System.out.println(c.num + "," + c.str);
}
//output
//1118,λ²€μΈ 

//μ˜ˆμ œμ—¬μ„œ μ €λ ‡κ²Œ μ μ—ˆλŠ”λ° μ‹€μ œ μ‚¬μš©μ€ Class의 λ©€λ²„λ³€μˆ˜κ°€ private으둜 μ„ μ–Έλ˜μ—ˆμ„λ•Œ
//접근이 λΆˆκ°€ν•˜κ²Œ μΊ‘μŠν™”λ˜μ–΄μžˆμœΌλ―€λ‘œ μΈμŠ€ν„΄μŠ€μ„ μ–Έμ‹œμ— μ €λ ‡κ²Œ ν•„λ“œκ°’μ„ μ„€μ •ν•΄μ£Όκ³ 
//getter / setter둜 λΆˆλŸ¬μ˜€λŠ” λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•œλ‹€...!

μœ„μ˜ μ½”λ“œλŠ” λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν˜ΈμΆœμ‹œμ— 해당값을 λ°›μ•„μ„œ μΈμŠ€ν„΄μŠ€μ˜ λ©€λ²„λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.

 

 

this vs this()

# this()

this()λŠ” μžμ‹ μ΄ μ†ν•œ ν΄λž˜μŠ€μ—μ„œ λ‹€λ₯Έμƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” κ²½μš°μ— μ‚¬μš©ν•œλ‹€. μ•„λž˜ μ½”λ“œλ‘œ ν™•μΈν•΄λ³΄μž.

public class Test {
    public static void main(String[] args) {
        Example example = new Example();
        Example example2 = new Example(5);
    }
}

class Example  {
    public Example() {
        System.out.println("Example의 κΈ°λ³Έ μƒμ„±μž 호좜!");
    };

    public Example(int x) {
        this();		//<-------this() μ‚¬μš©!!
        System.out.println("Example의 두 번째 μƒμ„±μž 호좜!");
    }
}

//Output
Example의 κΈ°λ³Έ μƒμ„±μž 호좜!
Example의 κΈ°λ³Έ μƒμ„±μž 호좜!
Example의 두 번째 μƒμ„±μž 호좜!

μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™λ‹€. 4번째 μ€„μ—μ„œ Example example2 = new Example(5)λ₯Ό ν†΅ν•΄μ„œ Example(int x) μƒμ„±μžκ°€ 싀행될것이고 this()λ₯Ό ν†΅ν•΄μ„œ Example()μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€. 그리고 Example(int x)의 λ¬Έμž₯이 μ‹€ν–‰λœλ‹€.

 

this()λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ¬Έλ²•μš”μ†Œλ₯Ό μΆ©μ‘±μ‹œμΌœμ•Όν•œλ‹€.

  • this() λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ μƒμ„±μžμ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯
  • this() λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ μƒμ„±μžμ˜ 첫쀄에 μœ„μΉ˜ν•œλ‹€.

 

# this

thisλŠ” μΈμŠ€ν„΄μŠ€ μžμ‹ μ„ 가리킨닀. μš°λ¦¬κ°€ μ°Έμ‘°λ³€μˆ˜λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€λ©€λ²„μ— μ ‘κ·Όν•  수 μžˆλŠ”κ²ƒ 처럼 thisλ₯Ό ν†΅ν•΄μ„œ μΈμŠ€ν„΄μŠ€ μžμ‹ μ˜ λ³€μˆ˜μ— 접근이 κ°€λŠ₯ν•˜λ‹€. 그리고 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ λ§€κ°œλ³€μˆ˜λ₯Ό μ΄λ¦„λ§ŒμœΌλ‘œλŠ” κ΅¬λΆ„ν•˜κΈ°κ°€ μ–΄λ €μš΄λ°, μ΄λ•Œ 이λ₯Ό ꡬ뢄해 μ£ΌκΈ° μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λ˜λŠ”κ²ƒμ΄ λ°”λ‘œ this ν‚€μ›Œλ“œμ΄λ‹€.

class Car{
        int num;
        String str;

        public Car(int num, String str){  //μƒμ„±μž
            this.num = num;					  //thisν‚€μ›Œλ“œλ‘œ Car클래슀의 λ©€λ²„λ³€μˆ˜ μ΄ˆκΈ°ν™”
            this.str = str;					  //thisν‚€μ›Œλ“œλ‘œ Car클래슀의 λ©€λ²„λ³€μˆ˜ μ΄ˆκΈ°ν™”
            //num = num; ---γ„±
            //str = str; ---> μ§€μ—­λ³€μˆ˜λ‘œ κ°„μ£Όλ˜μ–΄ μ—λŸ¬λ°œμƒ
    }
}

public class Main {
    public static void main(String[] args) {
        Car c = new Car(1118,"λ²€μΈ ");
        System.out.println(c.num + "," + c.str);
    }
}

* 주둜 μΈμŠ€ν„΄μŠ€ ν•„λ“œλͺ…κ³Ό μ§€μ—­λ³€μˆ˜λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λœλ‹€.

 

 

λ‚΄λΆ€ 클래슀(Inner Class)

λ‚΄λΆ€ν΄λž˜μŠ€(inner class)λŠ” 클래슀 내뢀에 μ„ μ–Έλœ 클래슀둜 μ™ΈλΆ€ν΄λž˜μŠ€μ™€ λ‚΄λΆ€ν΄λž˜μŠ€κ°€ μ„œλ‘œ μ—°κ΄€λ˜μ–΄μžˆμ„λ•Œ μ‚¬μš©ν•œλ‹€.

λ‚΄λΆ€ν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ μ™ΈλΆ€ν΄λž˜μŠ€μ˜ 멀버에 μ‰½κ²Œ 접근이 κ°€λŠ₯ν•˜κ³ , μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ μ€„μΌμˆ˜μžˆλ‹€. λ˜ν•œ μ™ΈλΆ€μ μœΌλ‘œ λΆˆν•„μš”ν•œ 데이터λ₯Ό 감좜수 μžˆμ–΄ μΊ‘μŠν™”λ₯Ό λ‹¬μ„±ν•˜λŠ”λ° μœ μš©ν•˜λ‹€.

class Outer { // μ™ΈλΆ€ 클래슀
	
	class Inner {
		// μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€ 클래슀	
	}
	
	static class StaticInner {
		// 정적 λ‚΄λΆ€ 클래슀
	}

	void run() {
		class LocalInner {
		// μ§€μ—­ λ‚΄λΆ€ 클래슀
		}
	}
}

 

μ’…λ₯˜ μ„ μ–Έμœ„μΉ˜ μ‚¬μš©κ°€λŠ₯ν•œλ³€μˆ˜
μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€ 클래슀(instance inner class) μ™ΈλΆ€ 클래슀의 λ©€λ²„λ³€μˆ˜ μ„ μ–Έμœ„μΉ˜μ— μ„ μ–Έ
(멀버 λ‚΄λΆ€ 클래슀)
μ™ΈλΆ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, μ™ΈλΆ€ μ „μ—­ λ³€μˆ˜
정적 λ‚΄λΆ€ 클래슀(static inner class) μ™ΈλΆ€ 클래슀의 λ©€λ²„λ³€μˆ˜ μ„ μ–Έμœ„μΉ˜μ— μ„ μ–Έ
(멀버 λ‚΄λΆ€ 클래슀)
μ™ΈλΆ€ μ „μ—­ λ³€μˆ˜
μ§€μ—­ λ‚΄λΆ€ 클래슀(local inner class) μ™ΈλΆ€ 클래슀의 λ©”μ„œλ“œλ‚˜ μ΄ˆκΈ°ν™”λΈ”λ‘ μ•ˆμ— μ„ μ–Έ μ™ΈλΆ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, μ™ΈλΆ€ μ „μ—­ λ³€μˆ˜
읡λͺ… λ‚΄λΆ€ 클래슀(anonymous inner class) 클래슀의 μ„ μ–Έκ³Ό 객체의 생성을 λ™μ‹œμ— ν•˜λŠ” 일회용 읡λͺ… 클래슀 μ™ΈλΆ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, μ™ΈλΆ€ μ „μ—­ λ³€μˆ˜

λ‚΄λΆ€ν΄λž˜μŠ€λŠ” 일단 κ°œλ…λ§Œ μ•Œκ³  λ„˜μ–΄κ°€μž! λ‹€μŒλ²ˆμ— κΈ°νšŒκ°€ 되면 λ‹€μ‹œν•œλ²ˆ 곡뢀λ₯Ό μ§„ν–‰ν•΄μ•Όκ² λ‹€.

 


πŸ‘Šν˜Όμžμ„œ ν•΄κ²°ν•˜κΈ°


1. ν…μŠ€νŠΈ μŠ€νƒ€ν¬λž˜ν”„νŠΈ λ§Œλ“€κΈ°

 

 

 

 

λ°˜μ‘ν˜•
profile

Vibe.ai

@hai02y

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!