자바(Java) this, super 키워드, this(), super() 함수 사용하는 방법

자바(JAVA)

자바(Java) this, super 키워드, this(), super() 함수 사용하는 방법

 

환경: Eclipse Mars

 

this 현재 클래스의 인스턴스를 가리킵니다. super 는 부모 클래스를 가리킵니다. 현재 클래스의 인스턴스에 있는 속성이나 함수를 제어하려면 this.setName() 을 하고 부모 클래스의 함수를 호출하고 싶으면 super.setName() 을 입력합니다. 아래 소스를 보면서 어떻게 사용하는지 알아 보도록 하겠습니다.

 

¤ 클래스의 속성과 매개변수의 이름이 같을 때

 

아래 소스는 this 를 사용하지 않았을 때 상황입니다. 주로 set/get 함수를 만들 때 실수하는 경우 입니다. 매개 변수의 이름과 Fruit 에 내에 지역변수 이름이 같기 때문에 Fruit 객체의 name 속성에 값이 저장되지 않습니다. 이 때 Fruit 인스턴스를 가리키는 this 키워드를 사용해야 되는 것입니다.

 

public class Fruit {
    public String name;
    public String color;
    public double weight;
        
    public Fruit(String name, String color, double weight) {
        name = name;
        color = color;
        weight = weight;
    }
    
    public static void main(String[] args) {
        Fruit banana = new Fruit("banana", "yellow", 5.0);
        System.out.println("name : " + banana.name);    
        System.out.println("color : " + banana.color);  
        System.out.println("weight : " + banana.weight);
    }
}

 

아래 그림처럼 매개변수로 넘어온 값을 Fruit 속성에 저장하려면 모든 속성에 this 를 붙여 줍니다.

public class Fruit {
    public String name;
    public String color;
    public double weight;
        
    public Fruit(String name, String color, double weight) {
        this.name = name;
        this.color = color;
        this.weight = weight;
    }
    
    public static void main(String[] args) {
        Fruit banana = new Fruit("banana", "yellow", 5.0);
        System.out.println("name : " + banana.name);    
        System.out.println("color : " + banana.color);  
        System.out.println("weight : " + banana.weight);
    }
}

 

 

¤ 오버로딩된 다른 생성자 호출하는 방법

 

this() 는 자기자신의 생성자를 호출함으로서 생성자의 초기화 과정을 반복하지 않아도 됩니다. this(x, y) 처럼 파라미터가 있으면 자기 자신의 클래스에 해당하는 동일한 파라미터 객체를 가진 함수를 호출하게 됩니다.

super() 는 상속받은 바로 위 클래스의 생성자를 호출하게 됩니다. super(x, y) this 의 파라미터 넘기는 함수처럼 상속받은 클래스에서 동일한 파라미터 객체를 가진 함수를 호출합니다. 이것이 this super 의 차이점입니다. 주의 할점은 this() super() { 바로 다음에만 쓸 수 있습니다. 그래서 this(), super() 는 같이 쓸 수가 없는 것입니다.

 

class UpperClass {
    int x; 
    int y;

    public UpperClass() {
        x = 10;
        y = 20;
    }

    public UpperClass(int x) {
        this(); // 자신의 클래스 public UpperClass() 생성자 호출
        this.x = x;
    }

    public UpperClass(int x, int y) {
        this(x); // 자신의 클래스 public UpperClass(int x) 생성자 호출
        this.y = y;
    }
}

class LowerClass extends UpperClass {
    int r;

    public LowerClass() {
        super(); // 상위 클래스의 public UpperClass() 생성자 호출.
        r = 30;
    }
    public LowerClass(int x) {
        super(x); // 상위 클래스의 public UpperClass(int x) 생성자 호출
        r = 30;
    }

    public LowerClass(int x, int y) {
        super(x, y); // 상위 클래스의 public UpperClass(int x, int y) 호출
        r = 30;
    }

    public LowerClass(int x, int y, int r) {
        this(x, y); // 자신의 클래스 public LowerClass(int x, int y) 호출
        this.r = r;
    }
}

public class Exe{
   public static void main(String[] ar) {

   }
}

 

¤ 자신의 참조값을 전달하고 싶을 때

 

어떤 함수에서는 리턴값으로 자기 자신의 참조값을 전달하고 싶을 때가 있습니다. 이 때 this 키워드를 이용함으로써 해결이 가능합니다.

 

public class Fruit {
    public String name;
    public String color;
    public double weight;
        
    public Fruit(String name, String color, double weight) {
        this.name = name;
        this.color = color;
        this.weight = weight;
    }
        
    public Fruit getInstance() {
        return this;
    }
}
신고
Posted by 녹두장군