1. 참조변수 this


1) 자신 클래스의 멤버(변수, 메서드)에 접근

* 인스턴스화된 자기 자신의 객체를 지칭

* JVM 메모리에는 같은 클래스형을 갖는 수많은 객체가 존재할 수 있는데,

  그 많은 객체 중에서 자기 자신 객체의 메소드나 클래스 변수를 가리키기 위해서 사용한다. 


2) this(): 자신 클래스의 생성자 호출




2. 참조변수 super


1) 부모(상위) 클래스의 멤버(변수, 메서드)에 접근 

* 인스턴스화된 부모 객체를 지칭


2) super(); 부모(상위) 클래스의 생성자 호출




# Coffee 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package coffee;
 
public class Coffee {
    
    // 공통점: 에스프레소 용량, 커피 이름
    protected String coffeeName;
    protected int capacity;
    
    public Coffee() {}
    public Coffee(String coffeeName, int capacity) {
        this.coffeeName = coffeeName;
        this.capacity = capacity;
    }
 
    public String getInfo() {
        return "CoffeeName: " + coffeeName + ", Capacity: " + capacity + "ml"
    }
 
    public static void main(String[] args) {
        
        Coffee c1 = new Coffee("아메리카노"360);
        Coffee c2 = new Coffee("카페라떼"500);
        
        System.out.println(c1.getInfo());
        System.out.println(c2.getInfo());
        
    }
}
cs

# 설명

Line 6~7: 커피 제조에 공통으로 필요한 커피 이름(coffeeName)과 에스프레소 용량(capacity)를 선언한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package coffee;
 
public class LatteCoffee extends Coffee {
 
    protected int capacityMilk;    // 우유 용량 추가
 
    public LatteCoffee() {}
    public LatteCoffee(String coffeeName, int capacity, int capacityMilk) {
        super(coffeeName, capacityMilk);
        this.capacityMilk = capacityMilk;
    }
    
    public String getInfo() {
        return super.getInfo() + ", Milk Capacity: " + capacityMilk + "ml";
    }
    
    public String getDescription() {
        String rt = super.getInfo();
        rt += "\n";
        rt += this.getInfo();
        return rt;
    }
 
    public static void main(String[] args) {
 
        LatteCoffee c1 = new LatteCoffee("카페라떼"500100);
        System.out.println(c1.getInfo());
        
    }
}
cs

# 설명

Line 3: Coffee 클래스를 상속받는다. 

Line 5: 카페라떼 제조에 필요한 우유 용량(capacityMilk)를 추가 선언한다. 

Line 9: 부모 클래스의 매개변수 생성자를 통해 초기화한다.

Line 10: 추가 선언한 변수를 초기화한다. 

Line 13~15: 상속받은 부모 클래스의 getInfo()를 오버라이딩하여 추가 변수에 대한 정보를 출력할 수 있도록 한다. 


# 실행 결과





3. 생성자 호출 순서


1) 상속 관계에 있을 때 부모(상위) 클래스의 생성자가 호출된 후, 마지막으로 자식(하위) 클래스의 생성자가 호출된다.

즉, 부모가 태어나야 자식이 태어날 수 있는 것처럼! 


2) 가급적 클래스를 만들 때, 기본 생성자를 만들고 시작하자. 

매개 변수가 있는 생성자를 만들게 되면, 기본 생성자는 만들어지지 않고 이에 대한 에러가 발생하기 때문이다. 




# 설명 

- 부모 클래스 Mother에서 기본 생성자를 선언하지 않아 에러가 발생한다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package inheritanceex;
 
class Super {
    int x = 10;
    void display() {
        System.out.println("Super 메서드 호출!");
    }
}
 
class Sub extends Super {
    int x = 20;
    void display() {
        System.out.println("Super의 x = " + super.x);
        System.out.println("Sub의 x = " + x);
    }
}
 
public class InheritTest02 {
    public static void main(String[] args) {
        
        Super s1 = new Super();
        s1.display();
        
        Sub s2 = new Sub();
        s2.display();
        
    }
}
 
cs



# 설명

Line 11: 부모 클래스의 x가 아닌 자신 클래스에서 x의 선언과 초기화를 한다. 

Line 13: 부모 클래스의 x를 출력한다. 


# 실행 결과




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package inheritanceex;
 
class Father {
    public Father() {
        System.out.println("Father 생성자 호출");
    }
}
 
class Son extends Father {
    public Son() {
        // 부모 생성자를 먼저 호출하는 super(); 이 생략되었다. 
        System.out.println("Son 생성자 호출");
    }
}
 
public class InheritTest03 {
    public static void main(String[] args) {
    
        Son s1 = new Son();
        
    }
}
 
cs

# 설명

Line 11: 부모 생성자를 먼저 호출하는 super(); 가 생략되었다. 

     생략되었지만 super(); 에 해당하는 내용을 출력하게된다. 


# 실행결과