[JAVA] this키워드

@욕심쟁이

·

2020. 8. 21. 16:56

반응형

1. this 키워드

- 자신의 현재 인스턴스 주소가 저장되어 있는 참조변수

  (자신의 인스턴스를 가리키는 목적으로 사용됨)
- 객체(인스턴스)생성시 참조변수 this에 자동으로 this에 인스턴스 주소가 저장됨

 

※ 로컬변수와 멤버변수(인스턴스변수)의 이름이 같을때 로컬변수가 선언된 메서드 내에서

   해당 이름을 지정하면 로컬변수를 가르킴 로컬변수의 데이터를 다시 로컬변수(자신)에저장

   따라서, 아무효과가 없는 코드가 됨.

name = name; // 로컬변수 = 로컬변수로 읽힌다.
//The assignment to variable name has no effect(이 변수명을 쓰는것은 아무효과가 없다) 노란줄 경고        

멤버변수와 로컬변수의 이름이 같을떄 멤버변수를 지정하기 위해서  레퍼런스 this를 사용하여

    멤버변수를 지정해야함.

    → 일반 참조변수와 동일하게 사용하되 자신의 인스턴스 주소가 무조건 정장되어있음

    인스턴스를 생성할 떄 마다 각인스턴스의 주소가 각인스턴스 내의 this(인스턴스변수 접근)에

        저장되므로 각각 다른 주소를 갖게됨

public class Ex {
	public static void main(String[] args) {
		Person3 p = new Person3("강감찬",20);
		System.out.println("이름 : "+ p.name);
		System.out.println("나이 : "+ p.age);
		
		Person3 p2 = new Person3("이순신",10);
		System.out.println("이름 : "+ p2.name);
		System.out.println("나이 : "+ p2.age);
	}
}
class Person3{
	
	String name; //멤버변수
	int age;
	
	public Person3(String name, int age) {  //매개변수로 int형 로컬변수 name, age를 선언
        this.name = name; //this를 사용하면 멤버변수를 가르킴 
        this.age = age;
        //인스턴스변수는 new하면 사용가능 멤버변수 접근
        //메서드변수는 호출되어야 지역변수로 접근
	}
	
	
}

 

2. 레퍼런스 this

- 자신의 인스턴스 주소가 저장되는 참조변수

 - 모든 인스턴스에 자동으로 생성되는 변수이며

  객체(인스턴스)생성 시 자동으로 자신의 인스턴스 주소가 저장됨

- 인스턴스변수와 로컬변수의 이름이 같을때, 로컬변수가 건언된 메서드 내에서 인스턴스 변수를 가르키는 용도

- 인스턴스 내에서 인스턴스변수와 이름이 중복되는 변수가 없으면 레퍼런스 this를 생략 할 수 있다.

<기본사용문법>

this.인스턴스변수 

//또는

this.인스턴스 메서드();

this.model( 인스턴스변수(멤버변수)) = model(로컬변수(매개변수))

 

3. 다른생성자 호출 : this() (생성자 this)

- 생성자 내에서 자신의 인스턴스 내의 다른 생성자를 호출

- 생성자 초기화 코드가 중복 될 때 중복 제거를 위해 하나의 생성자에서만 초기화 코드를 작성하고

   나머지 다른생성자는 해당 생성자 호출을 통해 데이터만 전달하여 초기화 코드릐 중복을 제거하는 용도로 사용

this(로컬(매개)변수[,로컬(매개)변수,.....]);

! 주의사항 

생성자 this()는 반드시생성자 내의 첫줄에서 호출되어야한다!

public class Ex4 {

	public static void main(String[] args) {
		
		Person4 p = new Person4();
		p.print();

		Person4 p2 = new Person4("이순신");
		p2.print();

		Person4 p3 = new Person4("강감찬", 20);
		p2.print();
	}

}
class Person4{
	
	String name;
	int age;
	
	public Person4() {
		//name="홍길동";
		//age=0;
		
		//다른 생성자 Person4(String ,int)를 호출하여 대신 초기화 요청
		//=> 생성자는 new이외에 직접 호출이 불가능하며 생성자 this()필수
		this("홍길동", 0);
		System.out.println("Person4() 생성자 호출됨!");
		//this("홍길동", 0); // 컴파일 에러발생!  => 생성자 this()는 반드시생성자 내의 첫문장에서 호출되어야한다! 
	}
	
	public Person4(String name) {
        //this.name=name;
        //age=0;
		this(name,0);
		System.out.println("Person4(String) 생성자 호출됨!");
	}
	
	public Person4(String name, int age) {
		//this.name = name;
		//this.age = age;
        this(name,age);
		System.out.println("Person4(String, int) 생성자 호출됨!");
	}
	
	public void print() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
	}
}
/*
<출력결과>
Person4(String, int) 생성자 호출됨!
Person4() 생성자 호출됨!
이름 : 홍길동
나이 : 0
Person4(String, int) 생성자 호출됨!
Person4(String) 생성자 호출됨!
이름 : 이순신
나이 : 0
Person4(String, int) 생성자 호출됨!
이름 : 이순신
나이 : 0
*/
반응형