This


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");
		
	}
	
}