package ex_this;
public class Ex1 {
public static void main(String[] args) {
/*
* 레퍼런스 this
* - 자신의 인스턴스 주소가 저장되는 참조 변수
* - 모든 인스턴스에 자동으로 생성되는 변수이며
* 객체 생성 시 자동으로 자신의 인스턴스 주소가 저장됨
* - 인스턴스변수와 로컬변수의 이름이 같을 때,
* 로컬변수가 선언된 메서드 내에서 인스턴스변수를 가르키는 용도
* - 메서드 내에서 인스턴스변수와 이름이 중복되는 변수가 없으면
* 레퍼런스 this를 생략할 수 있다.
*
* < 기본 사용 문법 >
* this.인스턴변수 또는 this.인스턴스메서드()
*
*/
// Person 클래스의 인스턴스 생성("홍길동", 20)
// Person p = new Person(); // 오류 발생!
Person p = new Person("홍길동", 20);
System.out.println("이름 : " + p.getName());
System.out.println("나이 : " + p.getAge());
Person p2 = new Person("이순신", 44);
System.out.println("이름 : " + p2.getName());
System.out.println("나이 : " + p2.getAge());
}
}
class Person {
// 인스턴스 멤버변수 선언
String name;
int age;
// 생성자의 매개변수로 로컬변수 name, age 선언
public Person(String name, int age) {
// => 로컬변수와 멤버변수(인스턴스변수)의 이름이 같을 때
// 로컬변수가 선언된 메서드 내에서 해당 이름을 지정하면
// 로컬변수를 가르키게 된다!
// name = name; // 로컬변수의 데이터를 다시 로컬변수(자신)에 저장
// age = age; // 따라서, 아무런 효과가 없는 코드가 된다!
// 멤버변수와 로컬변수의 이름이 같을 때 멤버변수를 지정하기 위해서
// 레퍼런스 this를 사용하여 멤버변수를 지정해야한다!
// => 일반 참조변수와 동일하게 사용하되 자신의 인스턴스 주소가 무조건 저장되어 있음
// => 인스턴스를 생성할 때마다 각 인스턴스의 주소가 각 인스턴스 내의 this에 저장되므로
// 각각 다른 주소를 갖게 됨
this.name = name; // 인스턴스 변수 name에 로컬변수 name 값 저장
this.age = age; // 인스턴스 변수 age에 로컬변수 age 값 저장
}
// Getter/Setter 정의
// Getter 메서드는 로컬변수 선언이 없는 경우가 많으므로
// 인스턴스변수에 레퍼런스 this를 생략해도 된다!
public String getName() {
return name; // this.name 사용 가능
}
// Setter 메서드도 인스턴스변수와 로컬변수 이름이 동일하므로
// 인스턴스변수에 레퍼런스 this를 사용!
public void setName(String name) {
this.name = name; // this 제거 불가
}
// 단축키를 활용한 Getter/Setter 메서드 자동 생성
// 단축키 : Alt + Shift + S
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
연습
package ex_this;
public class Test1 {
public static void main(String[] args) {
Car c = new Car();
c.print();
// c.company = "현대자동차";
// c.model = "소나타";
// c.print();
System.out.println("============================");
Car c2 = new Car("기아자동차");
c2.print();
System.out.println("============================");
Car c3 = new Car("기아자동차", "스포티지");
c3.print();
}
}
/*
* Car 클래스 정의
* - 멤버변수
* 1) 회사(company, 문자열)
* 2) 모델(model, 문자열)
* 3) 색상(color, 문자열)
* 4) 최대속도(maxSpeed, 정수)
* - 기본생성자 정의 및 다음 데이터로 초기화
* 회사 : "현대자동차"
* 모델 : "소나타"
* 색상 : "검정"
* 최대속도 : 200
* - 회사(company)를 전달받는 생성자 정의 및 다음 데이터로 초기화
* 회사 : 전달받은 회사
* 모델 : "소나타"
* 색상 : "검정"
* 최대속도 : 200
* - 회사(company), 모델(model)을 전달받는 생성자 정의 및 다음 데이터로 초기화
* 회사 : 전달받은 회사
* 모델 : 전달받은 모델
* 색상 : "검정"
* 최대속도 : 200
* - 회사(company), 모델(model), 색상(color)을 전달받는 생성자 정의 및 다음 데이터로 초기화
* 회사 : 전달받은 회사
* 모델 : 전달받은 모델
* 색상 : 전달받은 색상
* 최대속도 : 200
* - 회사(company), 모델(model), 색상(color), 최대속도(maxSpeed)을
* 전달받는 생성자 정의 및 다음 데이터로 초기화
* 회사 : 전달받은 회사
* 모델 : 전달받은 모델
* 색상 : 전달받은 색상
* 최대속도 : 전달받은 최대속도
*
* - 멤버변수 정보 출력하는 print 메서드 정의
*/
class Car {
String company;
String model;
String color;
int maxSpeed;
public Car() {
// 로컬변수가 없으므로 모든 변수에 this 생략 가능
company = "현대자동차";
model = "소나타";
color = "검정";
maxSpeed = 200;
}
public Car(String company) {
// company 로컬변수는 이름이 중복되므로
// 멤버변수 company에 레퍼런스 this 생략 불가!
this.company = company;
this.model = "소나타"; // this 생략 가능
color = "검정";
maxSpeed = 200;
}
public Car(String company, String model) {
this.company = company;
this.model = model;
color = "검정";
maxSpeed = 200;
}
public Car(String company, String model, String color) {
this.company = company;
this.model = model;
this.color = color;
maxSpeed = 200;
}
public Car(String company, String model, String color, int maxSpeed) {
this.company = company;
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
public void print() {
System.out.println("회사 : " + company);
System.out.println("모델 : " + model);
System.out.println("색상 : " + color);
System.out.println("최대속도 : " + maxSpeed + " km/h");
}
}