본문으로 바로가기

this 키워드

category Java언어 2018. 8. 20. 13:56

Identifier(식별자)란 클래스, 인터페이스, 변수, 메소드, 배열, 문자열을 구분할 수 있는이름이다.

그냥 사람의 이름과 같은 것 이다.

 

Keyword(키워드)란 어떤 기능을 하도록 미리 예약해 놓은 명령어를 의미한다. 그래서 키워드를 Reserved Word라고도 한다.

키워드 단독으로는 식별자로 사용할 수 없다. 단, 키워드를 포함하여 식별자를 사용할 순 있다.

 

java에서 this라는 키워드는 2가지 기능을 가진다.  첫째는 자기 자신을 가르키는 레퍼런스 변수, 두번째는 자기 자신의 또다른 생상자를 호출하는 생성자 메소드.


 

 

 

1. 자기 자신을 참조하는 "reference 변수"

 

1) this를 사용할 수 있는 이유

this는 instance method의 첫번째 매개변수로 항상 제공된다.(JVM이 자동으로 제공)(instance method호출의 경우만 제공!!)

*예외 : static method에는 자동제공x,  필드명과 매개변수명이 같을 경우 자동제공x

    (static은static이, instance는instance가 관리해야 한다.)

 

2) this가 필요한 이유

실제 하나의 클래스 타입으로 여러개의 객체를 생성시 method도 각각의 객체에 따로 생성되는 것이 아니라 코드영역이라는 공간에 하나만 생성된다. 생선된 모든 객체들은 그 하나의 메소드를 함께 사용하게 되는데, 이때 메소드가 생성된 여러개의 인스턴스 필드중 어떤 것에 접근하는 것인지 구분하기 위해 사용된다. 각각의 인스턴스에서 메소드를 호출하면 해당 인스턴스를 가르키는 참조변수 this를 매개변수로 넘겨줌으로서 메소드가 필드를 구분한다.

 

 

 

3) 어떤경우에 사용?

1 instance field와 parameter를 구분

 

Java에서는 클래스 작성시 field를 초기화하지않고 선언만 한다. 이는 데이터에 의존하지 않고 기능만을 제공하는 Java의 특성 때문이다.

그러면 언제 초기화를 해야할까? 바로 해당 클래스로 객체를 생성하여 인스턴스를 만들때 초기화한다. 그런데 앞서 애기한 Java의 특성상 데이터를 직접 조작하는 편보다는 기능으로 구현하는 것이 더 바람직하다. 이러한 이유로 Java에서는 초기화기능을 생성자,그리고 setter,getter메소드가 담당하게 되는데, 통상 초기화를 위해 입력받는 매개변수와 해당 클래스의 field명을 같도록하는 보통이다. 이는 코드를 보자마자 한번에 용도를 파악하기 용이하기 때문이다. 그런데 이름이 같은경우 jvm은 parameter를 우선으로 인식한다. 이 경우 this참조변수로 문제를 해결할 수 있다.

 

class A{

 

int data1;

 

A(int data1){

data1 = data1;                              <- 매개변수 data1 = 매개변수 data1  =>초기화 실패

}

 

}

 

class A{

 

int data1;

 

A(int data1){

this.data1 = data1;                              <- 인스턴스 변수 data1 = 매개변수 data1  =>초기화 성공

}

 

}

 

2 현재 this가 가르키는 객체를 알고싶을때

 

 

 

4) 주의사항

instance field는 instance method가 관리하고, static field는 static method가 관리하는 것이 좋다.

전자의 경우, 생성된 객체를 가르키는 reference변수 this가 instance method의 첫번째 매개변수로 (JVM에 의해 자동으로)

주어지기 때문에 쉽게 현재 생성된 객체의 instance field에 접근할 수 있다. 하지만 static method로 현재 생성된 여러 instance field에 접근할 경우 생성된 객체를 가르키는 reference 변수 this가 default로 첫번째 매개변수로서 주어지지 않기 때문에 this를 직접 static method의 첫번째 매개변수로 건네주어야 하는 불편함이 있다.

 

public class StaticIns{

 

//field

private int a; //instance field

 

//method

private static void disp(staticIns th){

 

System.out.println(th.a);

}

 

public StaticIns getThis(){    //현재 instance를 가르키는 reference변수를 반환하는 메소드

return this;    

}

 

public static void main(String args[]){

 

StaticIns si = new StaticIns();  //객체생성

 

disp( si.getThis() );    //static method 호출

 

}

 

 

 

}

 


 

 

2. 생성자 내에서 자신의 또 다른 생성자를 호출하기 위한 "생성자 this()"

1) 생성자 내의 body에서 오버로딩된 또 다른 생성자를 호출하는 것.

2) 의미적으로 this() == A()  이다.

 

 

class A{

 

//field

int a;

int b;

 

//constructor

A() {

this(5,10);

}

 

A(int a) {

this.a =a;

b=0;

}

 

A(int a, int b) {

this.a =a;

this.b=b;

}

}

 

 

 

 

'Java언어' 카테고리의 다른 글

String문제  (0) 2018.08.21
overloading과 overriding  (0) 2018.08.20
접근 지정자  (0) 2018.08.20
추상 클래스와 인터페이스의 차이  (0) 2018.08.16
Data Type(기본형,참조형)의 종류와 Size  (1) 2018.08.16