프로그래밍언어/Java

[Java 기본] 생성자

배세 2024. 7. 4. 21:34

생성자 - 필요한 이유


객체를 생성하는 시점에 어떤 작업이 하고 싶다면 생성자(Constuctor)를 이용하면 된다.

이해를 돕기 위해 아래 예제를 살펴보자. 

 

예제


    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 = 20;
        member2.grade = 80;
        
        MemberInit[] members = {member1, member2};

        for (MemberInit m : members) {
            System.out.println("이름: "+ m.name + " 나이: "+ m.age + " 성적: " + m.grade);
        }
        
    }

=> 객체를 생성하고 나면 변수에 초기값을 설정해야 한다. 위의 코드는 회원의 초기값을 설정하는 부분이 반복된다. 

메서드를 사용해서 반복을 제거해보자. 

 

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", 20, 80);
        
        MemberInit[] members = {member1, member2};

        for (MemberInit m : members) {
            System.out.println("이름: "+ m.name + " 나이: "+ m.age + " 성적: " + m.grade);
        }
    }

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

=>객체지향적인 프로그램을 위해 Member가 자기 자신의 데이터를 변경하도록 코드를 수정해보자. 

 

this


 

MemberInit.java

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;
    }
}

 

=> 매개변수와 멤버변수가 동일하다. 둘을 어떻게 구분할까?

이럴 땐 더 가까운 스코프의 변수가 우선순위를 가진다. 이러면 name = name 에서 좌변, 우변의 변수는 동일하게 매개변수를 가리키게 된다.  이럴 때 this 한정자를 붙이면 자신의 인스턴스 자신의 참조값을 가리킨다. 

 

InitMember는 Member의 초기값 설정하는 역할을 한다. 자기 자신의 인스턴스를 외부에서 전달된 파라미터로 셋팅하는 것이다. 

 

 

정리


  • 매개변수의 이름과 멤버 변수의 이름이 같은 경우 this를 사용해서 둘을 명확하게 구분해야 한다.
  • this는 인스턴스 자신을 가리킨다.

 

this의 생략


this는 생략 가능하다. 이 경우 변수를 찾을 때 가까운 지역변수를 찾고 없으면 멤버변수를 찾는다. 

 

public class MemberThis {
    String nameField;
    
    void initMember(String nameParameter) {
        nameField = nameParameter;
    }
}

=> 매개변수와 멤버변수의 이름이 다른 경우에 생략할 수 있다. 

 

이름이 다르더라도 멤버변수에 접근하는 경우에 항상 this를 적어주는 코딩스타일도 있다. 결과는 동일한데, this를 붙이면 멤버변수를 사용한다는 것을 쉽게 확인할 수 있다는 차이점이 있다. 

최근에는 IDE가 발전하면서 변수 색상을 다르게 표시해주기 때문에 사용하지 않는 추세이다. 

 

 

 


* 인프런 
'김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.