Java 생성자 - this

this 설명 전 Student.class 와 Main.class 코드를 작성하고 알아보도록 한다.

Student.java

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

    void initStudent(String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Student student1 = new Student();
        student1.initStudent( "guest1", 14, 90);
        Student student2 = new Student();
        student2.initStudent( "guest2", 19, 70);

        Student[] students = {student1, student2};

        for (Student s : students) {
            System.out.println("학생이름: " + s.name + ", 학생 나이: " + s.age + ", 학생 점수: " + s.grade);
        }
    }
}

Student.class 코드를 살펴보면 멤버변수 name, age, grade 가 있으며, initStudent 내부 파라미터에는 String name, age, grade 가 있다. 일반적으로 별다른 키워드 없이 initStudent 에서 name, age, grade 변수를 사용하면 가장 가까운 범위(Scope)에 가까운 내부 파라미터를 가리키게 된다.

만약 내부 파라미터가 아닌 Student 클래스의 String name, int age, int grade 멤버변수를 가리키고 싶다면 this 키워드를 사용하여 this.name = name; 이처럼 내부 파라미터로 받아온 name 값을 this.name 멤버변수에게 할당하는 방법으로 클래스를 만들고 있다.

멤버 변수와 메소드의 파라미터의 이름이 같으면 어떻게 구별되는가?

  • 멤버 변수보다 파라미터가 코드 블럭의 안쪽에 있어서 우선순위가 높다. 따라서 initStudent(..) 메소드에서 name 이라 적힌 파라미터에 접근한다.
  • 멤버 변수에 접근하려면 앞에 this.{name} 이라고 적어주면 된다.
  • this 는 자신의 인스턴스를 가리킨다. Main의 student1 인스턴스를 생성하였는데. 마치 this.name 이 student1.name 참조하듯이 가리키고 있다.

만약 initStudent 메소드에서 this.name = name; 에서 "this." 를 제거하게 되면 어떻게 될까?
이는 두 개 모두 initStudent 파라미터를 바라보게 되고 name = name; 파라미터가 같은 파라미터 대입으로 실행 시 "guest1" 이름으로 변경되지 않을 것이다.

this 생략

this 는 생략할 수 있다. 입력한 변수를 메소드의 코드 블럭{} 에서 찾지 못하게 되면 멤버 변수를 찾아가기 때문에 생략이 가능하다.

public class MyClass {
    String member;

    void myMethod(String myParameter) {
        member = myParameter;
    }
}

  • myMethod 의 member 는 this가 없어도 멤버 변수에 접근하고 있다.
  • member는 Scope에서 먼저 지역변수 에서 같은 이름이 있는지 찾는다. 없으면 Scope가 MyClass 으로 확장되고 클래스에서 선언한 String member; 으로 사용한다.

this 코딩스타일

아직 IDE 발달되기 전 코드에서는 멤버변수를 사용한 경우 this 키워드를 붙어서 사용하였다. 이는 직관적으로 멤버 변수라는 것을 알리기 위함이지만, IDE가 발달하면서 이러한 코딩 스타일은 사라지게 되었다.

myMethod 의 member 는 멤버 변수라는 것을 알려주듯이 IDE에서 색깔이 표시되고 한 눈에 알아볼 수 있다.