프로그래밍 언어/JAVA

[JAVA] 자바의 this & super

Rateye 2021. 1. 19. 14:36
728x90
반응형

this

this 키워드

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

레퍼런스 this

  • 자신의 인스턴스 주소가 저장되는 참조 변수
  • 모든 인스턴스에 자동으로 생성되는 변수이며 객체(인스턴스) 생성 시 자동으로 자신의 인스턴스 주소가 저장됨
  • 인스턴스변수와 로컬변수의 이름이 같을 때, 로컬변수가 선언된 메서드 내에서 인스턴스변수를 가리키는 용도
  • 메서드 내에서 인스턴스변수와 이름이 중복되는 변수가 없으면 레퍼런스 this 를 생략할 수 있다.

기본 사용 문법

this.인스턴스변수 또는 this.인스턴스메서드()
class Person3 {
	String name;
	int age;
	
	public Person3(String name, int age) { 
		// 매개변수로 int형 로컬변수 name, age 선언
		// => 로컬변수와 멤버변수(인스턴스변수)의 이름이 같을 때
		//    로컬변수가 선언된 메서드 내에서 해당 이름을 지정하면
		//    로컬변수를 가리키게 된다!
//		name = name; // 로컬변수의 데이터를 다시 로컬변수(자신)에 저장
//		age = age; // 따라서, 아무런 효과가 없는 코드가 된다!
		// => The assignment to variable name has no effect 경고 발생
		
		// 멤버변수와 로컬변수의 이름이 같을 때 멤버변수를 지정하기 위해서
		// 레퍼런스 this 를 사용하여 멤버변수를 지정해야한다!
		// => 일반 참조변수와 동일하게 사용하되 
		//    자신의 인스턴스 주소가 무조건 저장되어 있음
		// => 인스턴스를 생성할 때마다 각 인스턴스의 주소가 
		//    각 인스턴스 내의 this 에 저장되므로 각각 다른 주소를 갖게됨
		this.name = name; // 인스턴스변수 name 에 로컬변수 name 값 저장
		this.age = age; // 인스턴스변수 age 에 로컬변수 age 값 저장
	}
	
	// Getter/Setter 정의
	// Getter 메서드는 로컬변수 선언이 없는 경우가 많으므로
	// 인스턴스변수에 레퍼런스 this 를 생략해도 된다!
	public String getName() {
		return name;
	}
	
	// Setter 메서드도 인스턴스변수와 로컬변수 이름이 동일하므로
	// 인스턴스변수(좌변)에 레퍼런스 this 를 사용한다!
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	
}
		Person3 p = new Person3("홍길동", 20);
		System.out.println("이름 : " + p.name);
		System.out.println("나이 : " + p.age);
		
		
		Person3 p2 = new Person3("이순신", 44);
		System.out.println("이름 : " + p2.name);
		System.out.println("나이 : " + p2.age);

생성자 this()

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

  • 생성자 초기화 코드가 중복될 때 중복 제거를 위해 하나의 생성자에서만 초기화 코드를 작성하고 나머지 다른 생성자는 해당 생성자 호출을 통해 데이터만 전달하여 초기화 코드의 중복을 제거하는 용도로 사용
주의사항! 생성자 this() 는 반드시 생성자 내의 첫문장에서 호출되어야한다

기본 사용 문법

this([생성자에 전달할 데이터...]);
	class Person4 {
	String name;
	int age;
	
	// 기본 생성자 정의 - 이름 : "홍길동", 나이 : 0 초기화
	public Person4() {
		//		name = "홍길동";
		//		age = 0;
		// 다른 생성자 Person4(String, int)를 호출하여 대신 초기화 요청
		// => 생성자는 new 이외에 직접 호출이 불가능하며 생성자 this() 필수!
		this("홍길동", 0);
		System.out.println("Person4() 생성자 호출됨!");
		//		this("홍길동", 0); // 컴파일에러 발생!
		// => 생성자 this() 는 반드시 생성자 내의 첫문장에서 호출되어야한다!
	}

	// 이름 전달받는 생성자 정의 - 나이 : 0 초기화
	public Person4(String name) {
	//		this.name = name;
	//		age = 0;
		this(name, 0); // 로컬변수 name 에 저장된 데이터는 그대로 전달
		System.out.println("Person4(String) 생성자 호출됨!");
	}

	// 이름, 나이 전달받는 생성자 정의
	public Person4(String name, int age) {
		this.name = name;
		this.age = age;
		System.out.println("Person4(String, int) 생성자 호출됨!");
	}
		Person4 p = new Person4();
		System.out.println("이름 : " + p.name);
		System.out.println("나이 : " + p.age);
		
		Person4 p2 = new Person4("이순신");
		System.out.println("이름 : " + p2.name);
		System.out.println("나이 : " + p2.age);
728x90
반응형