[영상후기] [자바의 정석 - 기초편] ch6-36,37 생성자 this(), 참조변수 this

박철현·2024년 10월 17일
0

영상후기

목록 보기
154/160

movie

생성자 this

  • 생성자에서 다른 생성자 호출할 때 사용
    • 코드의 중복을 제거하기 위해 서로 호출
    • 같은 작업 여러번 짜는 것 보다 서로 호출하는 것이 코드의 중복을 줄일 수 있음
class Car2 {
	String color;
    String gearType;
    int door;
    
    Car2() {
    // Car2(String color, String gearType, int door)를 호출
    	this("white", "auto", 4);
    }
    
    Car2(String color) {
    	this(color, "auto", 4);
    }
    
    Car2(String c, String g, int d) {
    	color = c;
        gearType = g;
        door = d;
    }
}
  • 다른 생성자 호출시 첫 줄에서만 사용 가능
    • 만약 this 대신에 클래스 이름을 써도 에러남
      • this -> Car(color, "auto", 4); 하면 에러
Car(String color) {
	door = 5;
    this(color, "auto", 4); // Error
}

사용 예제 1

코드의 중복 발생 - 중복 제거 전

  • 기본 생성자 호출 시 기본적인 값 세팅
  • 전체 인자를 받아서 초기화
class Car {
	String color;
    String gearType;
    int door;
    
    Car() {
   		color = "white";
        gearType = "auto";
        door = 4;
    }
    
    Car(String c, String g, int d) {
    	this.color = c;
        this.gearType = g;
        this.door = d;
    }
}

중복 제거 후

  • 기본 생성자 호출 시 전체 매개변수를 받는 생성자를 호출하도록 하여 코드의 중복 제거
Car() {
	// Car("white", "auto", 4); 면 에러
    // 생성자 안에서 다른 생성자 호출하려먼 this
	this("white", "auto", 4);

참조변수 this

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수와 인스턴스 변수를 구별할 때 사용
    • 다른 경우도 있긴하나 일단 제일 많이 사용

변수명이 같다면 this가 있어야 iv로 간주된다

    Car(String color, String gearType, int door) {
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
  • this가 없으면 둘 다 지역변수로 간주된다.
  • 참조변수.변수이름 으로 사용해야 하나 같은 class라 this를 생략한다.
    • 같은 클래스 안에서 생략 가능
        Car2(String c, String g, int d) {
      	color = c; // this.color 이나 this 생략
          gearType = g;
          door = d;
      }
    • 만약 매개변수와 인스턴스 변수명이 같다면 생략 불가
      • 이름이 같으니 구분이 안됨
      Car(String color, String gearType, int door) {
      	this.color = color; // this 생략 불가
          this.gearType = gearType;
          this.door = door;
      }

정리

  • this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.

    • 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
    • 선언하지 않고 사용가능
  • this(), this(매개변수) : 생성자

    • 같은 클래스의 다른 생성자를 호출할 때 사용한다.
    • 클래스이름 대신 this()
  • this와 this()는 비슷하게 생겼을 뿐 완전히 다른 것이다.

    • this는 참조변수
    • this()는 생성자
  • 클래스 메서드 static에서는 this 사용 불가

    • static 메서드의 경우 객체 생성이 되지 않아도 메서드를 호출할 수 있음
    • 객체가 있음을 무조건 보장할 수 없음
    • 나머지인 생성자, 인스턴스 메서드는 사용 가능
class MyMAth2 {
	long a, b;
    
    MyMath2(int a, int b) { // 생성자
    	this.a = a; // 생략 불가
        this.b = b;
    }
    
    long add() { // 인스턴스 메서드
    // this가 없어도 a와 b가 구분되기에 생략 가능
    	return a + b; // return this.a + this.b
    }
    
    static long add(long a, long b) { // 클래스 메서드(static 메서드)
    // static 메서드의 경우 객체 생성이 되지 않아도 메서드를 호출할 수 있음 -> 객체 있음을 보장할 수 없음
    // this : 객체 자신
    	return a + b; // this를 붙일 수 없다.
    }
}
profile
비슷한 어려움을 겪는 누군가에게 도움이 되길

0개의 댓글

관련 채용 정보