-
Java | Super & 생성자 호출 메커니즘JAVA/JAVA 2020. 1. 30. 17:46
Super
부모클래스의 객체를 가리키는 예약어
- super.멤버변수: 부모 클래스의 멤버 변수에 접근
- super.메소드명(~): 부모 클래스의 메소드에 접근
super(~)
부모클래스 생성자 호출
- 자식클래스의 모든 생성자에 부모 클래스의 기본 생성자를 호출하는 super()가 생략되어 있음
- 매개변수 입력시, 그에 맞는 부모 클래스 생성자 호출
- 매개변수 미입력 또는 super() 생략시, 부모 클래스 기본 생성자 호출
상속에서의 this
자식클래스의 객체를 가리키는 예약어,
현재 생성된 객체 자체가 자식클래스이기 때문에 this가 자식클래스의 인스턴스를 가리킴
생성자 호출 메커니즘
자식클래스의 객체를 생성하면 부모클래스 생성자를 먼저 호출한 뒤 자식클래스 생성자 호출
package j200130; // 부모 클래스 class Parent extends Object { // 기본 생성자 Parent() { System.out.println("부모 클래스_기본 생성자 호출"); } } // 자식 클래스 class Child extends Parent { // 기본 생성자 Child() { System.out.println("자식 클래스_기본 생성자 호출"); } } public class InheriTest { public static void main(String[] args) { // Parent 클래스 pt 객체 생성, 기본 생성자 호출 Parent pt = new Parent(); System.out.println("pt: " + pt); // Child 클래스 cd 객체 생성, 기본 생성자 호출 Child cd = new Child(); System.out.println("cd: " + cd); /* 부모 클래스_기본 생성자 호출 pt: j200130.Parent@15db9742 부모 클래스_기본 생성자 호출 자식 클래스_기본 생성자 호출 cd: j200130.Child@6d06d69c */ } }
※ 상속 관계는 원래 is-a관계가 성립하도록 작성해야 하지만, 이해하기 쉽도록 간단하게 작성함
※ 자바에서 클래스 작성시, 기본적으로 java.lang.Object 클래스를 상속받게 되어있음
사용례_Super & Overriding
package j200130; class Parent { // extends Object 가 생략된 상태 // 부모 클래스 멤버 변수 String name; int age; // 부모 클래스 기본 생성자 Parent() { super(); // 기본적으로 생략되어 있으며, Object 클래스의 기본 생성자를 호출함 System.out.println("부모 클래스_기본 생성자 호출"); } // 생성자 오버로딩 Parent(String name, int age) { this.age = age; this.name = name; System.out.println("super 생성자 호출"); } // Object 클래스로부터 물려받은 toString()메소드 오버라이딩 public String toString() { return "내용을 변경해도 되나요?"; } } class Child extends Parent { // 자식 클래스 기본 생성자 Child() { // 부모 클래스의 매개 변수가 2개인 생성자 호출 super("홍길동", 24); System.out.println("자식 클래스_기본 생성자 호출"); } // 정보 출력 일반 메소드 void printInfo() { System.out.println("이름: " + name + ", 나이: " + age); } } public class InheriTest { public static void main(String[] args) { // Parent 클래스 pt 객체 생성, 기본 생성자 호출 Parent pt = new Parent(); System.out.println("pt.toString(): " + pt.toString()); // Parent 클래스 pt 객체 생성, 기본 생성자 호출, 부모 클래스의 매개변수가 2개인 생성자 호출 Child cd = new Child(); System.out.println("cd.toString(): " + cd.toString()); // 정보 출력 메소드 호출 cd.printInfo(); /* 부모 클래스_기본 생성자 호출 pt.toString(): 내용을 변경해도 되나요? super 생성자 호출 자식 클래스_기본 생성자 호출 cd.toString(): 내용을 변경해도 되나요? 이름: 홍길동, 나이: 24 */ } }
※ toString() : Object 클래스의 일반 메소드, 객체의 주소값(문자열)을 반환하는 메소드
모든 클래스가 Object를 상속하기 때문에 toString() 메소드 역시 가지고 있으며,
객체 출력시 기본적으로 toString() 메소드가 생략된 상태로 실행됨※ 부모 클래스에서 변경된 내용은 자식 클래스에도 반영됨
사용례_Super
super를 사용해서 부모 클래스의 멤버 변수와 메소드에 접근
package j200130; class Person { // 멤버 변수 선언 String name; // null int age = 20; // 정보 출력 메소드 void print() { System.out.println("Person 이름: " + name + ", 나이: " + age); } } class Man extends Person { // 상속받은 멤버변수와 같은 이름의 변수를 자식클래스에도 선언 가능 int age = 40; // 메소드 오버라이딩 void print() { // 부모 클래스인 Person 클래스의 print() 메소드 호출 super.print(); // 부모 클래스의 name, age 변수 출력 System.out.println("Person 이름: " + super.name + ", 나이: " + super.age); // 자식 클래스의 name, age 변수 출력, 각 변수 앞에 this 생략 System.out.println("Man 이름: " + name + ", 나이: " + age); } } public class SuperTest2 { public static void main(String[] args) { // Man 클래스 m 객체 생성 Man m = new Man(); // m 객체 name 변수 초기화 m.name = "홍길동"; // m 객체의 print() 메소드 호출 m.print(); /* Person 이름: 홍길동, 나이: 20 Person 이름: 홍길동, 나이: 20 Man 이름: 홍길동, 나이: 40 */ } }
상속에서 생성자 호출이 이루어지는 메커니즘과
상속시 부모 객체를 가리키는 super 예약어에 대해 알아보았습니다.상속은 재사용성을 높이고 작업의 편의성을 높이는 데에 유용하므로
super를 적절하게 사용하면 코드의 양을 많이 줄일 수 있겠습니다.'JAVA > JAVA' 카테고리의 다른 글
Java | Final (0) 2020.01.31 Java | Integer.to~String() (0) 2020.01.31 Java | 접근 제어자 with 상속 (0) 2020.01.30 Java | Inheritance 상속 & Overriding & Class 관계 (0) 2020.01.29 Java | Array of Objects 객체 배열 (0) 2020.01.29