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("카페라떼", 500, 100); 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(); 에 해당하는 내용을 출력하게된다.
# 실행결과
'JAVA > JAVA2' 카테고리의 다른 글
JAVA2_day02 | Garbage Collector (가비지 콜렉터) (0) | 2018.01.11 |
---|---|
JAVA2_day02 | 동적 로딩, 정적 로딩, static 키워드 (0) | 2018.01.11 |
JAVA2_day01 | 추가공부 (상속) (0) | 2018.01.10 |
JAVA2_day01 | 추가공부 (객체지향 설계) (0) | 2018.01.10 |
JAVA2_day01 | 상속 (Inheritance) (0) | 2018.01.10 |