π™ΉπšŠπšŸπšŠ

[Java] μƒμ„±μž / this

ν•΄λ²„λ‹ˆ 2024. 4. 17. 16:53
λ°˜μ‘ν˜•

μƒμ„±μžλž€?

μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ ν˜ΈμΆœλ˜λŠ” ‘μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λ©”μ„œλ“œ’이닀.

public class Car {
    String brand;
    String model;
    int year;


    // λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μž
    public Car() { }

    // λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž
    public Car(String brand, String model, int year) {
        this.brand = brand;
        this.model = model;
        this.year = year;
    }

    // λ©”μ„œλ“œ
    public void displayInfo() {
        System.out.println("Brand: " + brand);
        System.out.println("Model: " + model);
        System.out.println("Year: " + year);
    }

    public static void main(String[] args) {
        // μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ—¬ Car 객체 생성
        Car myCar = new Car("Toyota", "Camry", 2022);
        myCar.displayInfo();
    }
}




μƒμ„±μžμ˜ 쑰건

μƒμ„±μžμ˜ 이름은 클래슀의 이름과 κ°™μ•„μ•Ό ν•œλ‹€.
μƒμ„±μžλŠ” 리턴 값이 μ—†λ‹€.

 

 

μƒμ„±μžλ„ μ˜€λ²„λ‘œλ”©μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— μ—¬λŸ¬κ°œμ˜ μƒμ„±μžκ°€ μ‘΄μž¬ν•  수 μžˆλ‹€.

Car myCar = new Car("Toyota", "Camry", 2022);

 

그리고 μ—°μ‚°μž newκ°€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것이지

μƒμ„±μžκ°€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것

이 μ•„λ‹ˆλ‹€.

‘μƒμ„±μž’λΌλŠ” 단어 λ•Œλ¬Έμ— μƒμ„±ν•œλ‹€λΌκ³  μ˜€ν•΄ν•  수 μžˆλŠ”λ°, μƒμ„±μžλŠ” λ‹¨μˆœνžˆ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ“€μ˜ μ΄ˆκΈ°ν™”μ— μ‚¬μš©λ˜λŠ” 쑰금 νŠΉλ³„ν•œ λ©”μ„œλ“œμΌ 뿐이닀.

 

Car c = mew Car();



1️⃣ μ—°μ‚°μž new에 μ˜ν•΄μ„œ λ©”λͺ¨λ¦¬(heap)에 Car클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€.

2️⃣ μƒμ„±μž Car()κ°€ ν˜ΈμΆœλ˜μ–΄ μˆ˜ν–‰λœλ‹€.

3️⃣ μ—°μ‚°μž new의 결과둜, μƒμ„±λœ Car μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°€ λ°˜ν™˜λ˜μ–΄ μ°Έμ‘°λ³€μˆ˜ 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();  // compile error λ°œμƒ 
        Data2 d3 = new Data2(7); // μ΄λ ‡κ²Œ 써야 함
    }
}

Data1μ—λŠ” μ •μ˜λ˜μ–΄ μžˆλŠ” μƒμ„±μžκ°€ ν•˜λ‚˜λ„ μ—†μœΌλ―€λ‘œ μ»΄νŒŒμΌλŸ¬κ°€ κΈ°λ³Έ μƒμ„±μžλ₯Ό 좔가해쀫닀.

ν•˜μ§€λ§Œ Data2μ—λŠ” 이미 μƒμ„±μž Data2(int x) κ°€ μ •μ˜λ˜μ–΄ μžˆμœΌλ―€λ‘œ κΈ°λ³Έ μƒμ„±μžκ°€ μΆ”κ°€λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•œ 것이닀.






λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž

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

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

μ΄λ ‡κ²Œ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•œ μ΄ˆκΈ°ν™”λ₯Ό λ§Œλ“€μ–΄μ€¬λ‹€.

 

 

λ§Œμ•½ μ΄ˆκΈ°ν™”κ°€ μ—†λŠ” 경우

Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4; 

 

μ΄ˆκΈ°ν™”κ°€ μžˆλŠ” 경우

Car c = new Car("white", "auto", 4);

둜 μ΄ˆκΈ°ν™”λ₯Ό ν–ˆμ„ λ•Œ 보닀 더 직관적이고 κ°„κ²°ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.






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

같은 클래슀의 멀버듀 간에 μ„œλ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” κ²ƒμ²˜λŸΌ μƒμ„±μž 간에도 μ„œλ‘œ 호좜이 κ°€λŠ₯ν•˜λ‹€.

단, λ‹€μŒμ˜ 두 쑰건을 λ§Œμ‘±μ‹œμΌœμ•Ό ν•œλ‹€.

μƒμ„±μžμ˜ μ΄λ¦„μœΌλ‘œ ν΄λž˜μŠ€μ΄λ¦„ λŒ€μ‹  thisλ₯Ό μ‚¬μš©ν•œλ‹€.
ν•œ μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” λ°˜λ“œμ‹œ 첫 μ€„μ—μ„œλ§Œ 호좜이 κ°€λŠ₯ν•˜λ‹€.



 

❓ 첫 μ€„μ—μ„œλ§Œ 호좜이 κ°€λŠ₯ν•œ 이유 ❓

μ΄ˆκΈ°ν™” μž‘μ—…μ˜ μˆœμ„œλ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.

객체λ₯Ό μ‚¬μš©ν•˜κΈ° 전에 μ΄ˆκΈ°ν™”λ₯Ό λ¨Όμ € ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— κ·œμΉ™μ„ κ·Έλ ‡κ²Œ μ •ν•œ 것이닀.

Car(String color) {
    door = 5;  // 
    Car(color, "auto", 4); // μ—λŸ¬1. μƒμ„±μžμ˜ 두 번째 μ€„μ—μ„œ λ‹€λ₯Έ μƒμ„±μž 호좜 
}  // μ—λŸ¬2. this(color, "auto", 4);둜 ν•΄μ•Ό 함
Car (String c, String g, int d) {
    color = c;
    gearType = g;
    door = d; 
}
Car(String color, String gearType, int door) {
    this.color = color;
    this.gearType = gearType;
    this.door = door;
}

λ§€κ°œλ³€μˆ˜λ‘œ μ„ μ–Έλœ λ³€μˆ˜μ˜ 이름이 color둜 μΈμŠ€ν„΄μŠ€λ³€μˆ˜ color와 같을 κ²½μš°μ—λŠ” μ΄λ¦„λ§ŒμœΌλ‘œλŠ” 두 λ³€μˆ˜κ°€ μ„œλ‘œ ꡬ별이 μ•ˆ λœλ‹€.

이런 κ²½μš°μ—λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ•žμ— ‘this’λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

color = color μ΄λ ‡κ²Œ ν•˜λ©΄ λ‘˜ λ‹€ μ§€μ—­λ³€μˆ˜λ‘œ κ°„μ£Όλœλ‹€.

this λŠ” μ°Έμ‘°λ³€μˆ˜λ‘œ μΈμŠ€ν„΄μŠ€ μžμ‹ μ„ 가리킨닀.

μ°Έμ‘°λ³€μˆ˜λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€μ˜ 멀버에 μ ‘κ·Όν•  수 μžˆλŠ” κ²ƒμ²˜λŸΌ, this 둜 μΈμŠ€ν„΄μŠ€λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” 것이닀.

staticλ©”μ„œλ“œμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ 멀버듀을 μ‚¬μš©ν•  수 μ—†λŠ” κ²ƒμ²˜λŸΌ, this μ—­μ‹œ μ‚¬μš©ν•  수 μ—†λ‹€.

사싀 μƒμ„±μžλ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œμ—λŠ” μžμ‹ μ΄ κ΄€λ ¨λœ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ³€μˆ˜ this κ°€ μ§€μ—­λ³€μˆ˜λ‘œ μˆ¨κ²¨μ§„ μ±„λ‘œ μ‘΄μž¬ν•œλ‹€.

일반적으둜 μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œλŠ” νŠΉμ • μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨λœ μž‘μ—…μ„ ν•˜κΈ° λ•Œλ¬Έμ— μžμ‹ κ³Ό κ΄€λ ¨λœ μΈμŠ€ν„΄μŠ€μ˜ 정보가 ν•„μš”ν•˜μ§€λ§Œ, staticλ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨ μ—†λŠ” μž‘μ—…μ„ ν•˜λ―€λ‘œ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 정보가 ν•„μš” μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.



this μΈμŠ€ν„΄μŠ€ μžμ‹ μ„ κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ³€μˆ˜. μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°€ μ €μž₯λ˜μ–΄ μžˆλ‹€.
λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œμ— μ§€μ—­λ³€μˆ˜λ‘œ μˆ¨κ²¨μ§„ μ±„λ‘œ μ‘΄μž¬ν•œλ‹€.
this(), this(λ§€κ°œλ³€μˆ˜) μƒμ„±μž, 같은 클래슀의 λ‹€λ₯Έ μƒμ„±μžλ₯Ό 호좜 ν•  λ•Œ μ‚¬μš©ν•œλ‹€.






μƒμ„±μžλ₯Ό μ΄μš©ν•œ μΈμŠ€ν„΄μŠ€μ˜ 볡사

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

    Car() {
        this("white", "auto", 4);
    }

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

    Car(String color, String gearType, int door) {
        this.color = color;
        this.gearType = gearType;
        this.door = door; 
    }
}

κΈ°μ‘΄ 객체의 μƒνƒœλ₯Ό λ³΅μ‚¬ν•˜μ—¬ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©λœλ‹€.




μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•ŒλŠ” λ‹€μŒμ˜ 2가지 사항을 κ²°μ •ν•΄μ•Ό ν•œλ‹€.
1. 클래슀 - μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 것인가?
2. μƒμ„±μž - μ„ νƒν•œ 클래슀의 μ–΄λ–€ μƒμ„±μžλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 것인가? 

 

 

 

λ°˜μ‘ν˜•