[Java] this() 생성자로 코드 중복 제거하자 (feat. 참조변수 this)

준우·2023년 2월 18일
0

Java

목록 보기
26/30
post-thumbnail
post-custom-banner

들어가기 앞서

용어 정리

  • iv(instance variable): 인스턴스 변수
  • lv(local variable): 로컬 변수

생성자 this()

  • 생성자에서 다른 생성자를 호출할 때 사용한다.
  • 다른 생성자 호출 시 첫 줄에서만 사용할 수 있다.
class Car{
	String color;
    String gearType;
    int door;

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

위와 같이 Car 클래스가 있을 때, 기본 생성자 Car()과 Car(String c, String g, int d) 메소드는 중복되는 부분이 있다.
이런 경우 나쁜 코드라고 볼 수 있다.
이 때 this() 메소드를 사용해서 생성자에서 다른 생성자를 호출하여 코드 중복을 제거하고 좋은 코드로 만들 수 있다.

사용 예시


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

    Car() {
    	this("white", "auto", 4);
    }
    
    Car(String c, String g, int d) {
    	color = c;
    	gearType = g;
    	door = d;
    }
}

그리고 이름이 비슷한 참조변수 this 도 알아보자.

참조 변수 this

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스의 주소가 저장되어있다.
  • 인스턴스 메서드(생성자 포함)에서 사용 가능
  • 모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재한다.
  • 지연변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

생성자 this() 와는 연관이 없으니 헷갈리면 안된다.

class MyMath2 {
	long a, b //this.a this.b
    
    //변수명이 같으니 this 키워드로 구분
    MyMath2(int a, int b) {
    	this.a = a;
    	this.b = b;
    }
    
    //구분하지 않아도 될 때에는 this 생략 가능
    long add() {
    	return a + b;	//return this.a + this.b;
    }
    
    static long add(long a, long b) {
    	return a + b;
    }
}

iv인 a와 b의 진짜 이름은 this.a 와 this.b이다.
굳이 붙이지 않아도 iv와 lv를 구분할 수 있을 때에는 생략이 가능하여 생략하지만
변수명이 동일하여 iv와 lv를 구분할 수 없을 때에는 this 키워드를 사용하여 구분한다.

사용 예시

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

위와 같은 생성자가 있을 때, 변수명이 다르므로 구분이 된다.
이 경우 같은 클래스 안에서 this는 생략될 수 있다.

Car(String color, String gearType, int door){ 
	//this.color는 iv, color는 lv
	this.color = color;
    this.gearType = gearType;
    this.door = door;
}

하지만 위와 같이 iv와 lv와 동일한 변수명을 가지는 경우 모든 변수가 lv처럼 취급되므로
iv와 lv를 구분하기 위해서 this 키워드를 붙여준다.
이렇게 인스턴스 변수와 지역 변수를 구분하기 위해 this 키워드를 붙여준다.

🫡 Reference

post-custom-banner

0개의 댓글