λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“– Java/πŸ’Š Java κ°•μ˜

Java 기본편 κ°•μ˜_μƒμ„±μž

by carrot0911 2024. 11. 26.

μƒμ„±μž

 

μƒμ„±μž - ν•„μš”ν•œ 이유

객체λ₯Ό μƒμ„±ν•˜λŠ” μ‹œμ μ— μ–΄λ–€ μž‘μ—…μ„ ν•˜κ³  μ‹Άλ‹€λ©΄ μƒμ„±μž(Construct)λ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€.

MemberInit

package construct;

public class MemberInit {
    String name;
    int age;
    int grade;
}

MemberInitMain1

package construct;

public class MemberInitMain1 {

    public static void main(String[] args) {
        MemberInit member1 = new MemberInit();
        member1.name = "user1";
        member1.age = 15;
        member1.grade = 90;

        MemberInit member2 = new MemberInit();
        member2.name = "user2";
        member2.age = 16;
        member2.grade = 80;

        MemberInit[] members = {member1, member2};

        for (MemberInit s : members) {
            System.out.println("이름: " + s.name + ", λ‚˜μ΄: " + s.age + ", 성적: " + s.grade);
        }
    }
}

νšŒμ› 객체λ₯Ό μƒμ„±ν•˜κ³  λ‚˜λ©΄ name, age, grade 같은 λ³€μˆ˜μ— μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•œλ‹€.
ν•˜μ§€λ§Œ νšŒμ›μ˜ μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜λŠ” 뢀뢄이 계속 반볡되고 μžˆλ‹€.

package construct;

public class MemberInitMain2 {

    public static void main(String[] args) {
        MemberInit member1 = new MemberInit();
        initMember(member1, "user1", 15, 90);

        MemberInit member2 = new MemberInit();
        initMember(member2,"user2", 16, 80);

        MemberInit[] members = {member1, member2};

        for (MemberInit s : members) {
            System.out.println("이름: " + s.name + ", λ‚˜μ΄: " + s.age + ", 성적: " + s.grade);
        }
    }

    static void initMember (MemberInit member, String name, int age, int grade) {
        member.name = name;
        member.age = age;
        member.grade = grade;
    }
}

initMember(...) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ λ°˜λ³΅μ„ μ œκ±°ν•œλ‹€. 그런데 이 λ©”μ„œλ“œλŠ” λŒ€λΆ€λΆ„ Member 객체의 멀버 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
이런 경우 속성과 κΈ°λŠ₯을 ν•œ 곳에 λ‘λŠ” 것이 더 λ‚˜μ€ 방법이닀. μ‰½κ²Œ μ΄μ•ΌκΈ°ν•΄μ„œ MemberInit이 μžκΈ° μžμ‹ μ˜ 데이터λ₯Ό λ³€κ²½ν•˜λŠ” κΈ°λŠ₯(λ©”μ„œλ“œ)을 μ œκ³΅ν•˜λŠ” 것이 μ’‹λ‹€.

 

this

MemberInit - initMember() μΆ”κ°€

package construct;

public class MemberInit {
    String name;
    int age;
    int grade;
    
    void initMember (String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}
package construct;

public class MemberInitMain2 {

    public static void main(String[] args) {
        MemberInit member1 = new MemberInit();
        member1.initMember("user1", 15, 90);

        MemberInit member2 = new MemberInit();
        member2.initMember("user2", 16, 80);

        MemberInit[] members = {member1, member2};

        for (MemberInit s : members) {
            System.out.println("이름: " + s.name + ", λ‚˜μ΄: " + s.age + ", 성적: " + s.grade);
        }
    }
}

this

멀버 λ³€μˆ˜μ™€ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜μ˜ 이름이 κ°™μœΌλ©΄ λ‘˜μ„ μ–΄λ–»κ²Œ ꡬ뢄해야 ν• κΉŒ?

  • 멀버 λ³€μˆ˜λ³΄λ‹€ λ§€κ°œλ³€μˆ˜κ°€ μ½”λ“œ λΈ”λ‘μ˜ 더 μ•ˆμͺ½μ— 있기 λ•Œλ¬Έμ— λ§€κ°œλ³€μˆ˜κ°€ μš°μ„ μˆœμœ„λ₯Ό 가진닀.
    λ”°λΌμ„œ initMember(String name, ...) λ©”μ„œλ“œ μ•ˆμ—μ„œ name이라고 적으면 λ§€κ°œλ³€μˆ˜μ— μ ‘κ·Όν•˜κ²Œ λœλ‹€.
  • 멀버 λ³€μˆ˜μ— μ ‘κ·Όν•˜λ €λ©΄ μ•žμ— this.이라고 ν•΄μ£Όλ©΄ λœλ‹€. thisλŠ” μΈμŠ€ν„΄μŠ€ μžμ‹ μ˜ 참쑰값을 가리킨닀.

this의 μƒλž΅

thisλŠ” μƒλž΅ κ°€λŠ₯ν•˜λ‹€. λ³€μˆ˜λ₯Ό 찾을 λ•Œ κ°€κΉŒμš΄ μ§€μ—­λ³€μˆ˜(λ§€κ°œλ³€μˆ˜λ„ μ§€μ—­λ³€μˆ˜)λ₯Ό λ¨Όμ € μ°Ύκ³  μ—†μœΌλ©΄ κ·Έλ‹€μŒμœΌλ‘œ 멀버 λ³€μˆ˜λ₯Ό μ°ΎλŠ”λ‹€. 멀버 λ³€μˆ˜λ„ μ—†μœΌλ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

package construct;

public class MemberThis {
    String nameField;

    void initMember (String nameParameter) {
        nameField = nameParameter;
    }
}
  • nameFieldλŠ” λ¨Όμ € μ§€μ—­λ³€μˆ˜(λ§€κ°œλ³€μˆ˜)μ—μ„œ 같은 이름이 μžˆλŠ”μ§€ μ°ΎλŠ”λ‹€. 이 경우 μ—†μœΌλ―€λ‘œ 멀버 λ³€μˆ˜μ—μ„œ μ°ΎλŠ”λ‹€.
  • nameParameterλŠ” μ§€μ—­λ³€μˆ˜(λ§€κ°œλ³€μˆ˜)μ—μ„œ 같은 이름이 μžˆλŠ”μ§€ μ°ΎλŠ”λ‹€. λ§€κ°œλ³€μˆ˜κ°€ μžˆμœΌλ―€λ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

this와 μ½”λ”© μŠ€νƒ€μΌ

package construct;

public class MemberThis {
    String nameField;

    void initMember (String nameParameter) {
        this.nameField = nameParameter;
    }
}

this.nameFieldλ₯Ό 보면 thisλ₯Ό μƒλž΅ν•  수 μžˆμ§€λ§Œ, μƒλž΅ν•˜μ§€ μ•Šκ³  μ‚¬μš©ν•΄λ„ λœλ‹€.
μ΄λ ‡κ²Œ thisλ₯Ό μ‚¬μš©ν•˜λ©΄ 이 μ½”λ“œκ°€ 멀버 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€λŠ” 것을 눈으둜 μ‰½κ²Œ 확인할 수 μžˆλ‹€.
μ‰½κ²Œ μ΄μ•ΌκΈ°ν•΄μ„œ thisλ₯Ό κ°•μ œλ‘œ μ‚¬μš©ν•΄μ„œ, 지역 λ³€μˆ˜(λ§€κ°œλ³€μˆ˜)와 멀버 λ³€μˆ˜λ₯Ό λˆˆμ— 보이도둝 κ΅¬λΆ„ν•˜λŠ” 것이닀.

 

μƒμ„±μž - λ„μž…

λŒ€λΆ€λΆ„μ˜ 객체 지ν–₯ μ–Έμ–΄λŠ” 객체λ₯Ό μƒμ„±ν•˜μžλ§ˆμž μ¦‰μ‹œ ν•„μš”ν•œ κΈ°λŠ₯을 μ’€ 더 νŽΈλ¦¬ν•˜κ²Œ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ μƒμ„±μžλΌλŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λ©΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ‹œμ μ—μ„œ μ¦‰μ‹œ ν•„μš”ν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

MemberConstruct

package construct;

public class MemberConstruct {
    String name;
    int age;
    int grade;

    MemberConstruct (String name, int age, int grade) {
        System.out.println("μƒμ„±μž 호좜 name: " + name + ", age: " + age + ", grade: " + grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

μƒμ„±μžλŠ” λ©”μ„œλ“œμ™€ λΉ„μŠ·ν•˜μ§€λ§Œ 차이가 μžˆλ‹€.

  • μƒμ„±μžμ˜ 이름은 클래슀 이름과 κ°™μ•„μ•Ό ν•œλ‹€. λ”°λΌμ„œ 첫 κΈ€μžλ„ λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•œλ‹€.
  • μƒμ„±μžλŠ” λ°˜ν™˜ νƒ€μž…μ΄ μ—†λ‹€. λΉ„μ›Œλ‘μ–΄μ•Ό ν•œλ‹€.
  • λ‚˜λ¨Έμ§€λŠ” λ©”μ„œλ“œμ™€ κ°™λ‹€.

ConstructMain1

package construct;

public class ConstructMain1 {

    public static void main(String[] args) {
        MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
        MemberConstruct member2 = new MemberConstruct("user2", 16, 80);

        MemberConstruct[] members = {member1, member2};

        for (MemberConstruct s : members) {
            System.out.println("이름: " + s.name + ", λ‚˜μ΄: " + s.age + ", 성적: " + s.grade);
        }
    }
}

μƒμ„±μž 호좜

μƒμ„±μžλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  λ‚˜μ„œ μ¦‰μ‹œ ν˜ΈμΆœλœλ‹€.

new μƒμ„±μžμ΄λ¦„(μƒμ„±μžμ— λ§žλŠ” 인수 λͺ©λ‘)
new ν΄λž˜μŠ€μ΄λ¦„(μƒμ„±μžμ— λ§žλŠ” 인수 λͺ©λ‘)

new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 객체λ₯Ό 생성할 λ•Œ λ§ˆμ§€λ§‰μ— κ΄„ν˜Έ( )도 포함해야 ν•˜λŠ” μ΄μœ κ°€ λ°”λ‘œ μƒμ„±μž λ•Œλ¬Έμ΄λ‹€.
객체λ₯Ό μƒμ„±ν•˜λ©΄μ„œ λ™μ‹œμ— μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€λŠ” 의미λ₯Ό ν¬ν•¨ν•œλ‹€.

μƒμ„±μž μž₯점

쀑볡 호좜 제거

  • μƒμ„±μž 덕뢄에 객체λ₯Ό μƒμ„±ν•˜λ©΄μ„œ 동기에 생성 직후에 ν•„μš”ν•œ μž‘μ—…μ„ ν•œ λ²ˆμ— μ²˜λ¦¬ν•  수 있게 λ˜μ—ˆλ‹€.

μ œμ•½ - μƒμ„±μž 호좜 ν•„μˆ˜

  • 객체λ₯Ό 생성할 λ•Œ 직접 μ •μ˜ν•œ μƒμ„±μžκ°€ μžˆλ‹€λ©΄ 직접 μ •μ˜ν•œ μƒμ„±μžλ₯Ό λ°˜λ“œμ‹œ ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•„μˆ˜ κ°’ μž…λ ₯을 보μž₯ν•  수 μžˆλ‹€.

 

βœ”οΈ μ°Έκ³ 

쒋은 ν”„λ‘œκ·Έλž¨μ€ λ¬΄ν•œν•œ μžμœ λ„κ°€ μ£Όμ–΄μ§€λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ•„λ‹ˆλΌ μ μ ˆν•œ μ œμ•½μ΄ μžˆλŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€.

 

κΈ°λ³Έ μƒμ„±μž

κΈ°λ³Έ μƒμ„±μž

  • λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžλ₯Ό κΈ°λ³Έ μƒμ„±μžλΌκ³  ν•œλ‹€.
  • ν΄λž˜μŠ€μ— μƒμ„±μžκ°€ ν•˜λ‚˜λ„ μ—†μœΌλ©΄ μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” λ§€κ°œλ³€μˆ˜κ°€ μ—†κ³ , μž‘λ™ν•˜λŠ” μ½”λ“œκ°€ μ—†λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ€€λ‹€.
  • μƒμ„±μžκ°€ ν•˜λ‚˜λΌλ„ 있으면 μžλ°”λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€.

MemberDefault

package construct;

public class MemberDefault {
    String name;

    MemberDefault () {

    }
}

κΈ°λ³Έμƒμ„±μžλ₯Ό μ™œ μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ€„κΉŒ?

μžλ°”μ—μ„œ κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄μ£Όμ§€ μ•ŠλŠ”λ‹€λ©΄ μƒμ„±μž κΈ°λŠ₯이 ν•„μš”ν•˜μ§€ μ•Šμ€ κ²½μš°μ—λ„ λͺ¨λ“  ν΄λž˜μŠ€μ— κ°œλ°œμžκ°€ 직접 κΈ°λ³Έ μƒμ„±μžλ₯Ό μ •μ˜ν•΄μ•Ό ν•œλ‹€.
μƒμ„±μž κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κ²½μš°λ„ 많기 λ•Œλ¬Έμ— 이런 편의 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

 

μƒμ„±μž - μ˜€λ²„λ‘œλ”©κ³Ό this( )

μƒμ„±μžλ„ λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ²˜λŸΌ λ§€κ°œλ³€μˆ˜λ§Œ λ‹€λ₯΄κ²Œ ν•΄μ„œ μ—¬λŸ¬ μƒμ„±μžλ₯Ό μ œκ³΅ν•  수 μžˆλ‹€.

MemberConstruct - μƒμ„±μž μΆ”κ°€

package construct;

public class MemberConstruct {
    String name;
    int age;
    int grade;

    MemberConstruct (String name, int age) {
        this.name = name;
        this.age = age;
        this.grade = 50;
    }

    MemberConstruct (String name, int age, int grade) {
        System.out.println("μƒμ„±μž 호좜 name: " + name + ", age: " + age + ", grade: " + grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

κΈ°μ‘΄ MemberConstruct에 μƒμ„±μžλ₯Ό ν•˜λ‚˜ μΆ”κ°€ν•΄μ„œ μƒμ„±μžκ°€ 2κ°œκ°€ λ˜μ—ˆλ‹€.

MemberConstruct(String name, int age)
MemberConstruct(String name, int age, int grade)
package construct;

public class ConstructMain2 {

    public static void main(String[] args) {
        MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
        MemberConstruct member2 = new MemberConstruct("user2", 16);

        MemberConstruct[] members = {member1, member2};

        for (MemberConstruct s : members) {
            System.out.println("이름: " + s.name + ", λ‚˜μ΄: " + s.age + ", 성적: " + s.grade);
        }
    }
}

μƒμ„±μžλ₯Ό μ˜€λ²„λ‘œλ”©ν•œ 덕뢄에 성적 μž…λ ₯이 κΌ­ ν•„μš”ν•œ κ²½μš°μ—λŠ” gradeκ°€ μžˆλŠ” μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ©΄ 되고, 그렇지 μ•Šμ€ κ²½μš°μ—λŠ” gradeκ°€ μ—†λŠ” μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ©΄ λœλ‹€. gradeκ°€ μ—†λŠ” μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ©΄ 성적은 50점이 λœλ‹€.

μ΄λ•Œ this( )λΌλŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜λ©΄ μƒμ„±μž λ‚΄λΆ€μ—μ„œ μžμ‹ μ˜ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.
참고둜 thisλŠ” μΈμŠ€ν„΄μŠ€ μžμ‹ μ˜ 참쑰값을 가리킨닀. κ·Έλž˜μ„œ μžμ‹ μ˜ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€.

MemberConstruct - this( ) μ‚¬μš©

package construct;

public class MemberConstruct {
    String name;
    int age;
    int grade;

    MemberConstruct (String name, int age) {
    	this(name, age, 50);
    }

    MemberConstruct (String name, int age, int grade) {
        System.out.println("μƒμ„±μž 호좜 name: " + name + ", age: " + age + ", grade: " + grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

this( ) κ·œμΉ™

  • this( )λŠ” μƒμ„±μž μ½”λ“œμ˜ 첫 μ€„μ—λ§Œ μž‘μ„±ν•  수 μžˆλ‹€.