java - this와 this() / super와 super()

yunzivv·2025년 3월 13일

JAVA 기초

목록 보기
14/23

1. this와 this()


this와 this()는 클래스 내부에서 사용된다. 두 this의 차이점에 대해서 알아보자


1-1. this

클래스 내부에서 인스턴스가 자기자신을 참조할 때 사용하는 참조변수다. this는 자신 인스턴스의 주소를 가르킨다.

  • 예시 코드
public class Main {
    Frog keroro = new Frog("keroro", 100);
    }
}

class Frog {
	String name;
    int age;
    
    Frog(String name, int age){ // 생성자
    	this.name = name;
        this.age = age;
    }
}

예시 코드의 동작

  1. keroro라는 인스턴스를 생성하고 생성자에게 keroro100을 인수로 넘겨줬다.
  2. keroro 인스턴스 생성과 동시에 생성자가 실행된다.
  3. 생성자는 매개변수로 받은 name(keroro)과 age(100)을 자기 자신의 멤버 nameage에 초기화한다.

this 특징

  • 인스턴스 변수와 매개변수 이름이 같은 경우 구분할 수 있다.
  • this 참조 변수는 인스턴스 메서드에서만 사용이 가능하다.

1-2. this()

this()는 같은 클래스에서 생성자가 다른 생성자를 호출할 때 사용한다.

  • 예시 코드
public class Main {
    Frog keroro = new Frog("keroro");
    }
}

class Frog {
	String name;
    int age;
    
    Frog(String name) { // 생성자 1
    	this(name, 0)
    }
    Frog(String name, int age){ // 생성자 2
    	this.name = name; 
        this.age = age;
    }
   
}

예시 코드의 동작

  1. 메인 클래스에서 keroro라는 인스턴스를 생성하고 생성자에게 keroro를 인수로 넘겨줬다.
  2. 메서드 시그니처가 일치하는 생성자1이 실행된다.
  3. 생성자1은 this()를 사용하여 다른 생성자를 호출하고 name0을 인수로 넘겨준다.
  4. 메서드 시그니처가 일치하는 생성자2가 호출되어 각각 인스턴스 변수에 저장한다.

특징

  • 코드의 중복을 줄일 수 있다.
  • 생성자 내부에서만 사용할 수 있다.
  • 메서드 오버로딩(메서드 시그니처)으로 구분한다.
  • 다른 생성자를 호출할 때는 제일 첫 줄에서 호출해야만 한다


2. super와 super()


super와 super()도 this와 this()의 차이와 같다. 대신 super은 상속 받은 부모클래스에 접근한다는 것이 차이점이다.

2-1. super

super 참조 변수를 사용하여 부모 클래스 멤버에 접근할 수 있다.
this키워드와 마찬가지로 클래스 자신의 멤버 이름과 부모 클래스의 멤버 이름이 같을 때 구분하기 위해 사용한다.

  • 예시 코드
class super {
	int a = 10;
}
class serve extends super {
	int a = 100;
	void printA () {
    	System.out.println(this.a);
        System.out.println(super.a);
    }
}
출력
100
10

2-2. super()

this()와 마찬가지로 부모 클래스의 생성자를 호출하는 메서드다.
자식 클래스의 인스턴스를 생성하면, 그 인스턴스에는 자식 클래스의 멤버와 부모 클래스의 멤버까지 포함되어있다.
이 때 부모 클래스의 멤버를 초기화하기 위해서는 super() 메서드로 부모 클래스의 생성자를 호출하여 초기화해야한다.

특징

  • 자식 클래스에서 부모 클래스 생성자를 호출하지 않으면 자동으로 부모 클래스의 기본 생성자를 호출한다. (부모 클래스에 기본 생성자가 없다면 오류가 발생한다.)

  • super() 역시 첫줄에 사용되어야 한다.

  • 예시 코드

class super {
	int a = 0;
    super(int i){ // 생성자
    	a = i;
    }
}
class serve extends super {
    int b;
    
    serve() { // 생성자
    	super(10)
        b = 100;
    }
    void printAB(){
    	System.out.println(a);
        System.out.println(b);
    }
}
출력
10
100

0개의 댓글