본문 바로가기
교육, 학습/멀티캠퍼스_풀 스택

JAVA 문법 - 참조변수this와 생성자this() 비교, 사용시 장점

by 개발하는 경제학도 2022. 1. 7.

강의 소개

현재 수강하고 있는 멀티캠퍼스 k-digital 지능형 웹서비스 풀 스택 과정을 수강하며 적은 내용입니다.
교재로는 자바의 정석을 사용하고 있습니다.


this

this는 자기 자신을 지칭하는 키워드이고, 반면 super키워드는 상속하는 부모 객체를 지칭한다.
super와 마찬가지로 this는 this. 과 this()의 사용법에 차이가 있다.

 

1. this.

this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수이다.
이 this에는 인스턴스의 주소가 저장되어 있다.
또한, 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

- 사용이유
인스턴스 변수와 지역변수를 구분하기 위해 참조 변수 this를 사용한다.

- 특징
this 참조 변수를 사용할 수 있는 영역은 인스턴스 메서드이고, 클래스 메서드에서는 사용할 수 없다.
모든 인스턴스 메서드에는 this 참조 변수가 숨겨진 지역 변수로 존재하고 있다.

- 예시
[this 참조 변수를 사용하지 않은 경우]

class Car { String color; int door; Car(String c, int d) { color /*인스턴스 변수*/ = c /*지역 변수*/ ; door /*인스턴스 변수*/ = d /*지역 변수*/ ; } }

Car생성자에는 매개변수로 String 타입의 c, int 타입의 d가 들어간다.
하지만 클래스 Car의 **인스턴스 변수(= non static 변수)는 color와 door이고 Car생성자에는 사실 color, door가 들어가고 싶은 것이다. 따라서 c, d도 코드를 볼 때 한눈에 color, door을 나타내기 위해 코드를 변경하고 싶을 때, this를 사용하여 인스턴스 변수임을 나타낼 수 있는 것이다.
위 코드를 this를 사용하여 아래와 같이 바꿀 수 있다.

** 변수의 종류 (자세히)

더보기

변수의 종류

클래스의 필드(field)란 클래스에 포함된 변수(variable)를 의미한다.

클래스 내에서 변수는 선언된 위치에 따라 아래와 같이 구분된다.

class Person { static int age; // 클래스 변수(= static 변수) String name; // 인스턴스 변수(= non static 변수) void method() { int something = 100; // 지역 변수 } }

 

1) 클래스 변수(static variable)

클래스 영역에 위치한 변수 중에서 static 키워드가 붙은 변수이다. 동의어로 static 변수라고도 부른다.

static의 특성은 '공유'이다. 따라서 인스턴스를 생성하지 않고도 '클래스. 클래스 변수'로 바로 사용할 수 있다.

또한, static의 특성에 따라 해당 클래스의 모든 인스턴스가 1개로 유지(하고 공유) 하기 위해 사용된다.

클래스 변수는 초기화하지 않아도 변수의 타입에 맞게 자동 초기화된다. (ex. int i;)

 

2) 인스턴스 변수(instance variable)

클래스 영역에 위치한 변수 중에서 static 키워드가 붙지 않은 변수다.

static이 없기 때문에 클래스에서 생성된 인스턴스마다 가져야 하는 '고유의 값'을 나타내기 위해 사용된다.

클래스 변수와 마찬가지로 인스턴스 변수도 초기화하지 않아도 변수의 타입에 맞게 자동 초기화된다.

 

3) 지역 변수(local variable)

메서드, 생성자, 초기화 블록 내에 위치한 변수를 지역 변수라 한다.

(클래스 변수, 인스턴스 변수와 다르게) 자동 초기화되지 않는다. 따라서 지역 변수는 반드시 초기화해주어야 한다.

(ex. int i = 100;)

 


[this 참조 변수를 사용한 경우]

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

이렇듯, 인스턴스 변수를 this.color로, 지역변수를 color로 표시하여 구분할 수 있다.
또한, this 참조 변수를 사용하지 않았던 코드와 여전히 동일한 기능을 수행한다. 다만 매개변수 c와 d가 의미하는 바가 color, door로 의미가 명확해지며, 인스턴스 변수와 구분이 용이해졌다는 장점이 있다.
특히, 본 예시와 같이 'this.color = color'처럼 생성자의 매개변수로 인스턴스 변수들의 초기값을 제공(= 초기화)하는 경우에 이런 형태가 많이 사용된다.

 


 

2. this()

this() 생성자이다. 이 this()는 생성자 호출에 사용되는데, 같은 클래스의 다른 생성자를 호출할 때 사용된다.

- 특징
다른 생성자의 호출은 생성자의 첫 문장에서만 가능하다. (그래서 this() 나 super()가 올 때는 구현부의 첫 문장에 쓰여야 한다)
만약, this(매개변수 1, 매개변수 2,..)처럼 this() 안에 매개변수를 넣으면, 동일 클래스 내부에서 '매개변수 리스트'가 일치하는 생성자를 호출해준다.
this() 생성자를 사용하여 코드를 재사용하여 더욱 간략한 코드를 만들 수 있다.

- 예시
[this() 생성자를 사용하지 않은 경우]

class Car { String color; int door; // 매개변수가 없는 생성자 Car() { color = "red"; door = 4; } // 매개변수가 있는 생성자 Car(String color, int door) { this.color = color; this.door = door; } }

예시를 확인해보면 매개변수가 없는 Car() 생성자, 매개변수가 있는 Car(String color, int door) 생성자 두 개가 있다.
이런 경우 Car() 생성자에서 Car(String color, int door)생성자를 this() 로 아래와 같이 호출해줄 수 있다.

[this() 생성자를 사용한 경우]

class Car { String color; int door; Car() { this(color, 4); // 맨 아래의 Car(String color, int door) 생성자를 호출 } // 매개변수가 있는 생성자 Car(String color, int door) { this.color = color; this.door = door; } }

Car()생성자에서 this()를 사용하여 Car(String color, int door) 생성자를 호출해주었다.
this()를 사용하지 않은 코드와 동일한 기능을 수행하지만, this() 생성자를 통해서 더욱 간략한 코드를 만들 수 있다. 또한, 생성자 간의 유기적 연결로 인하여 추후 수정 시 더 적은 코드만을 변경하면 되어 유지보수에 용이하다는 장점이 있다.

 

 

출처: 자바의 정석(남궁 성 저), 멀티캠퍼스

댓글