본문 바로가기
Java/기본 개념 및 클래스

[Java] 26. 참조 변수 this, this의 3가지 용법

글: Song hyun 2024. 4. 18.
728x90
반응형

[Java] 26. 참조 변수 this, this의 3가지 용법

 

1. 참조 변수 this
this: 인스턴스(객체) 자신의 메모리를 가리키는 참조 변수이다. (=인스턴스의 주소.) this는 컴파일러에서 자동으로 생성한다. 생성자 내부에서 매개 변수와 필드 이름이 동일할 때, 혼동을 피하기 위해 많이 쓰인다.
-생성자에서 또 다른 생성자를 호출할 때 사용할 수 있다.
-자신의 주소(참조값, 주소값)을 반환시킬 수 있다.


2. this의 세 가지 용법
(1) 자기 자신을 가리키는 this
메서드는 이름이 같으면 가장 가까운 변수를 사용한다.
매개변수를 설계할 때, 멤버변수와 이름을 다르게 한다.

프로그램 내부의 변수가 많아, 변수의 이름을 변경하기 보다는 
this.를 통해 객체 내부의 변수를 가리키는 경우가 많다.

(2) 생성자에 다른 생성자를 호출하는 this()
-괄호 안의 매개변수의 개수, 자료형을 다른 생성자에서 호출 할 수 있다. 
-this로 생성자를 호출할 때는 다른 생성자를 가장 먼저 호출하고, 다른 수식을 작성해야 한다.
(다른 수식이 먼저 올 수 없다.)
-생성자가 많으면 많을 수록, 코드의 반복을 줄일 수 있다. (반복문과 비슷하다.)

(3) 자신의 주소(참조값, 주소값)을 반환시킬 수 있다.
-return this;

 

 

 


 

3. 연습 문제

(1) Person 클래스 내부에 getter/setter 메서드를 만들어라.

(2) setter 메서드를 통해 객체 person1의 name 변수를 "티모"로 변경해보자.

 

풀이 과정

(1) Person 클래스 내부에 getter/setter 메서드를 만들어라.

-각각 이름/나이/전화번호/성별의 요소마다 getter/setter 메서드를 만든다. 

-getter 메서드는 파라미터 없이 해당 변수를 바로 리턴하는 메서드이다.

-setter 메서드는 리턴 없이 해당 변수를 파라미터값으로 초기화하는 메서드이다.

 

(2) setter 메서드를 통해 객체 person1의 name 변수를 "티모"로 변경해보자.

-setter 메서드는 해당 객체의 변수를 파라미터값으로 초기화하는 메서드이다.

-person1.setName("티모")를 입력하면, 클래스 내부의 setName 메서드가 실행되면서 멤버변수 name이 "티모"로 변경된다.

 

 

아래는 순서대로 (1) Person 클래스, (2) Person 클래스의 객체,메서드를 호출하는 PersonTest의 소스코드이다.

package basic.ch11;

public class Person {
	// this의 세 가지 사용방법
	// 1. this는 자기 자신을 가리킨다.(인스턴스의 주소)
	// 2. 생성자에 다른 생성자를 호출할 때 사용할 수 있다.

	// 변수-> private(필수)

	private String name;
	private int age;
	private String phone;
	private String gender;

	// 생성자
	// 메서드는 이름이 같으면 가장 가까운 변수를 사용한다.
	// 매개변수를 설계할 때, 멤버변수와 이름을 다르게 한다.

	public Person(String name, int age) {
		// 자기 자신의 멤버변수 name에 외부에서 들어오는 지역변수 name을 대입한다.
		this.name = name;
		this.age = age;
	}

	public Person(String name, int age, String phone) {
		// 생성자에서 다른 생성자를 호출할 수 있다.
		this(name, age);
		this.phone = phone;
	}

	public Person(String name, int age, String phone, String gender) {
		this(name, age, phone);
		this.gender = gender;
	}

	// 3. 자신의 주소값을 반환시킬 수 있다.
	public Person getPerson() {
		// 자신의 주소값을 반환시킨다.
		return this;
	}
	
	public String getName() {
		return this.name;
	}
	
	public int getAge() {
		return this.age;
	}
	
	public String getPhone() {
		return this.phone;
	}
	
	public String getGender() {
		return this.gender;
	}

	public void showInfo() {
		System.out.println("이름 : " + name + " 나이 : " + age);
	}

	// 연습 문제
	// 1. setName 메서드 만들기(setter)
	public void setName(String name) {
		this.name = name;
	}
	
	public void setAge(int age) {
		this.age=age;
	}
	public void setPhone(String phone) {
		this.phone=phone;
	}
	public void setGender(String gender) {
		this.gender=gender;
	}

	
}
package basic.ch11;

public class PersonTest {
	public static void main(String[] args) {
		Person person1 = new Person("홍길동", 100);
		Person personBox = person1; // Person 클래스 내부의 객체는 현재 1개이다.
		// 현재 객체 person1은 스택에 주소값, 힙에 변수값이 저장되어 있다.
		// 하지만 personBox는 주소값을 할당받았기 때문에, 변수값이 따로 없으며
		// heap 내의 person1의 값을 링크하고 있다!

		// 위 코드까지는 Heap 메모리 영역에 객체가 2개 생성된 상태이다.
		// 지역변수인 person1, personBox는 같은 객체를 가리킨다.

		// 연습 문제
		// 1. setName 메서드 만들기

		Person personLee = new Person("이순신", 101);
		// 이 코드가 어떤 의미를 지니는지 한 줄 한 줄 주석을 달면 빨리 는다.

		// 2. 홍길동의 이름을 setter 메서드를 이용해 팀으로 바꿔라.

		person1.setName("티모");
		person1.showInfo();
		personBox.setName("가츠");
		person1.showInfo();

	} // end of main

} // end of class
728x90
반응형