본문 바로가기
Language & Framework & GIT/JAVA

[JAVA] this / super

by veganwithbacon 2022. 10. 22.
반응형

현재 교재는 명품 자바 에센셜과 스파르타 코딩클럽의 강의를 병행해서 보고 있다.

스파르타 강의 자체가 저어어어어어어엉말로 알아야 하는 부분만 나와있어서, 그래서 왜 라고 물었을 때 기억이 안나서 추가적으로 정리하게 됐다.

강의가 안좋다기보단 압축 성장엔 탁월하나 깊이에 있어서는 아쉽다.안좋을수도?하핳

 

 

✅this

1️⃣this.

 

  특징

- 객체 자신에 대한 레퍼런스

- 컴파일러에 의해 자동 관리된다

- static 메소드에서는 사용 불가

- 인스턴스 메소드(생성자 포함)에서 사용가능

- this.멤버 형태로 멤버 접근할 때 사용

- 참조 변수를 사용할 수 있는 대상은 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없다

- 같은 클래스 내에서는 this 생략 가능

RGB(String A,String B,String C){
   Red= A;
   Green = B;
   Blue = C;
 }

 

😮 그래서 왜 쓸까?

지역변수와 인스턴스 변수를 구분하기 위해 사용한다

 

 

2️⃣this( )

this()는 생성자 호출에 사용되는데, 같은 클래스의 다른 생성자를 호출할 때 사용된다

 

  특징

- 다른 생성자의 호출은 생성자의 첫 문장에서만 가능(this()/super() 사용시 구현부의 첫 문장에 써야함)

- this() 생성자를 사용하여 코드를 재사용해 더욱 간략한 코드가 가능하다

 

this()를 사용하지 않아도 this()를 사용한 코드와 동일한 기능을 수행하지만, this() 생성자를 통해 더욱 간략한 코드를 만들 수 있다. 또한, 생성자 간의 유기적 연결로 인해 추후 수정 시 적은 코드만을 변경해 유지보수에 용이하다.

 

this() 생성자 사용 x

더보기
class Car{
       String color;
       int door;
       
       //매개변수가 없는 생성자 Car()
       Car(){
             color = "red";
             door =4;
             }
       
       //매개변수가 있는 생성자
       Car(String color, int door){
             this.color=color; 
             this.door=door;
             }
}

 

this() 생성자 사용 

더보기
class Car{
         String color;
         int door;
         
         Car(){
                this(color,4);
              }
        
        
        //매개변수가 있는 생성자
         Car(String color, int door){
                this.color=color;
                this.door=door;
        }
}

 

 

✅super

1️⃣super.

: 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조할 때 사용하는 참조 변수

 

인스턴스 변수의 이름과 지역 변수의 이름이 같을 때는 인스턴스 변수 앞에 this를 통해 구분할 수 있다.

이처럼 부모 클래스의 멤버와 자식 클래스의 멤버명이 같을 경우 super 키워드를 통해 구별할 수 있다.

 

this와 마찬가지로 super 참조 변수를 사용할 수 있는 대상도 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없다.

 

예시 코드

더보기
class Parent {

    int a = 10;

}

 

class Child extends Parent {

    int a = 20;

 

    void display() {

        System.out.println(a);

        System.out.println(this.a);

        System.out.println(super.a);

    }

}

 

public class Inheritance03 {

    public static void main(String[] args) {

        Child ch = new Child();

        ch.display();

    }

}

 

실행 결과

20
20
10

 

 int형 변수 num은 자식 클래스인 Child 클래스에서도 선언되어 있다.

따라서 지역 변수와 this 참조 변수는 자식 클래스에서 대입된 값을 출력하며,

super 참조 변수만이 부모 클래스에서 대입된 값을 출력하게 된다

 

2️⃣super()

 : this() 메소드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면,

   super() 메소드는 부모 클래스의 생성자를 호출할 때 사용

 

자식 클래스의 인스턴스를 생성하면 해당 인스턴스의 고유 멤버뿐 아니라 부모 클래스의 모든 멤버까지도 포함된다.

따라서 부모 클래스의 멤버를 초기화하기 위해서는 자식 클래스의 생성자에서 부모 클래스의 생성자까지 호출해야한다.

 

부모 클래스의 생성자 호출은 모든 클래스의 부모 클래스인 Object 클래스의 생성자까지 계속 거슬러 올라가며 수행된다

 

자바 컴파일러는 컴파일 시 클래스에 생성자가 하나도 정의되어 있지 않아야만, 자동으로 기본 생성자를 추가해준다.

 

매개변수를 가지는 생성자를 선언해야 할 경우에는  다음 예제처럼 기본 생성자까지 명시적으로 선언하는 것이 좋다

class Parent {
    int a;
    Parent() { a = 10; }
    Parent(int n) { a = n; }
}

 
class Child extends Parent {
    int b;
    
    Child() {
        super();
        b = 20;
    }
    
    //코드 주소 :http://www.tcpschool.com/java/java_inheritance_super

 

다음 예제를 통해 super()메소드의 호출을 확인하자

class Parent {
    int a;
    Parent() { a = 10; }
    Parent(int n) { a = n; }
}

 
class Child extends Parent {
    int b;
    Child() {
①      //super(40);
        b = 20;
    }

    void display() {
        System.out.println(a);
        System.out.println(b);
    }
}

public class Inheritance04 {
    public static void main(String[] args) {
        Child ch = new Child();
        ch.display();
    }
}

실행 결과

10
20

위의 예제를 그냥 실행하면, 자바 컴파일러는 주석 처리된 ①번 라인에 자동으로 super(); 구문을 삽입하게 된다.

따라서 변수 a는 10으로 초기화된다.

 

①라인의 주석 처리를 해제하고 실행하면, 부모 클래스인 Parent 클래스는 두 번째 생성자에 의해 초기화된다.

변수 a는 40으로 초기화되고, 값은 40과 20이 출력된다.

 

반응형

댓글