[그린컴퓨터] Server/JAVA(객체 지향 프로그래밍)

this 예약어 {자신의 메모리를 가리키는 this, 생성자에서 다른 생성자를 호출하는 this, 자신의 주소를 반환하는 this}

Ben의 프로그램 2023. 5. 19. 21:03
728x90
앞서 객체란 무엇이고, 코드로 객체를 어떻게 구현하고 생성하는지 알아보았습니다. 이제, 클래스와 객체에 관련된 새로운 용어들을 살펴보고, 객체 간에 어떻게 협력할 수 있는지 알아보겠습니다.

자신의 메모리를 가리키는 this

  • this 간단히 설명하면 생성된 인스턴스 스스로를 가리키는 예약어입니다. 
  • 이 외에도 다른 역할로 this 를 사용할 수 있습니다. 예제를 통해 하나씩 내용을 살펴보겠습니다.
package thisex;

class BirthDay {
	int day;
	int month;
	int year;
	
	public void setYear(int year) {
		this.year = year;
	}
	
	public void printThis( ) {
		System.out.println(this);
	}
}

public class ThisExample {
	public static void main(String[] args) {
		BirthDay dDay = new BirthDay();
		dDay.setYear(2000);
		System.out.println(dDay);
		dDay.printThis();
	}
}

  • 인스턴스를 가리키는 참조 변수참조 값을 가지고 있으며, 참조 값이란 힙 메모리에 생성된 인스턴스의 주소 값니다.
  • 출력된 값을 보면 dDay.printThis( ) 메서드의 출력 값참조 변수 dDay 를 출력한 값이 같습니다.
  • 즉, 클래스 코드에서 사용하는 this 는 생성된 인스턴스 자신을 가리키는 역할을 합니다. 

파일 하나에 클래스 두 개?

  • 위의 예제는 프로그램 구성이 이전까지의 예제와 다릅니다.
  • 이전에는 클래스를 만들고 해당 클래스를 테스트하는 클래스를 따로 만들었는데, 이번에는 한 파일에 클래스가 두 개 있습니다.
  • BirthDay 클래스는 객체를 코드로 만든 클래스이고, ThisExample 클래스는 This 출력 값의 의미를 알기 위해 main( ) 함수를 포함하여 만든 테스트용 클래스입니다. 
  • 대부분 하나의 자바 파일에 클래스가 하나 있지만, 이번 예제처럼 하나의 파일에 클래스가 여러 개 존재할 수 있습니다.
  • 하지만, public 클래스는 하나뿐이며 public 클래스는 자바 파일 이름과 이름이 같아야 합니다.

생성자에서 다른 생성자를 호출하는 this

  • 클래스에 생성자가 여러 개 있을 때 어떤 생성자에서 다른 생성자를 호출하는 경우가 종종 있습니다.
  • 이때 this 를 사용해 클래스의 생성자에서 다른 생성자를 호출할 수 있습니다. 
  • 예제 코드와 함께 이해해 보겠습니다. 
package thisex;

class Person {
	String name;
	int age;
	
	public Person() {
		this("이름 없음", 1); // 아래에 있는 다른 생성자인 Person(String, int) 생성자 호출!
	}
  
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
}

public class CalAnotherConst {

	public static void main(String[] args) {
		Person noName = new Person();
		System.out.println(noName.name);
		System.out.println(noName.age);
	}
}
  • Person 클래스에는 Person( ) 디폴트 생성자와 매개변수를 가지는 Person(String, int) 생성자가 있습니다.
  • Person( ) 디폴트 생성자가 호출되는 경우에는 초깃값으로 "이름 없음"과 1 값을 대입하고자 합니다.
  • 디폴트 생성자 코드 안에서 직접 작성할 수도 있지만, 이미 아래 생성자에 코드가 있으므로, this 를 활용하여 호출하여 사용하는 것이 편리합니다. 
  • 그런데 this 로 다른 생성자를 호출할 때는 주의할 점이 하나 있습니다.
  • this 를 사용하여 생성자를 호출하는 코드 이전에는 다른 코드를 넣을 수 없습니다. 다음 그림을 참조해주세요.

Constructor call must be the first statement in a constructor 이라는 오류 메시지가 생긴다.

  • 생성자는 클래스가 생성될 때 호출되므로 클래스 생성이 완료되지 않은 시점에 다른 코드가 있다면 오류가 발생하게 됩니다. 
  • 다른 말로 하자면, 디폴트 생성자에서 클래스의 생성이 완료되는 것이 아닌, this 를 사용해 다른 생성자를 호출하므로, 클래스가 생성되는 것은 this 를 사용한 다른 생성자의 호출 이후입니다. 그래서 this 를 사용해 다른 생성자를 호출하는 코드 이전에 다른 코드가 있으면 해당 코드는 클래스가 생성되지도 않은 상태에서 작동하는 코드이기 때문에 오류가 발생하게 됩니다. 

자신의 주소를 반환하는 this

  • this를 사용하여 생성된 클래스 자신의 주소 값을 반환할 수 있습니다. 
  • 인스턴스 주소 값을 반환할 때는 this를 사용하고 반환형은 클래스 자료형을 사용합니다.
package thisex;

class Person {
	String name;
	int age;
	
	public Person() {
		this("이름 없음", 1); // Person(String, int) 생성자 호출 이다!
	}
    
    Person returnItSelf() { // this 반환할 때 반환형은 자기자신 클래스형!
    	return this; // this 반환 
    }

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

public class CalAnotherConst {

	public static void main(String[] args) {
		Person noName = new Person();
		System.out.println(noName.name);
		System.out.println(noName.age);
        
        Person p = noName.returnItSelf( );  // this 값을 클래스 변수에 대입
        System.out.println(p);	// noName.returnItSelf( )의 반환 값 출력
        System.out.println(noName);  // 참조 변수 출력
	}
}
  • 클래스 자료형과 상관없이 클래스 내에서 this 를 사용하면 자신의 주소 값을 반환할 수 있다는 것을 알아 둡시다!