다형성과 생성자 호출: 부모 클래스 매개변수 생성자 호출 방법
public class MainClass {
public static void main(String[] args) {
Parent par = new Child();
}
}
: 부모 타입 참조 변수(par)가 자식 클래스(child)의 객체를 참조
: 다형성을 통해 부모 클래스의 메서드만 접근 가능
public class Parent {
private int number;
public Parent(){
System.out.println("Parent 기본생성자");
}
public Parent(int number) {
this.number = number;
System.out.println("Parent(int number) 기본생성자");
}
}
public class Child extends Parent{
String name;
public Child() {
super();
System.out.println("Child 기본생성자");
}
}
출력값 : Parent 기본생성자, Child 기본생성자
: 여기서 " Parent 기본생성자 " 이게 아닌 "Parent(int number) 기본생성자" 이것을 출력하고 싶으면 아래 코드처럼 수정
public class Child extends Parent{
String name;
public Child() {
super(0);
System.out.println("Child 기본생성자");
}
}
: super() 호출을 super(int number)로 변경하여 부모 클래스의 매개변수 생성자를 호출해야 한다.
부모 메서드 호출과 자식 메서드 오버라이딩의 결과 이해
public class MainClass {
public static void main(String[] args) {
Parent par = new Child();
par.parent_method();
par.method();
}
}
public class Parent {
private int number;
public void parent_method(){
System.out.println("Parent 클래스의 parent_method()");
}
public void method(){
System.out.println("Parent 클래스의 method()");
}
}
public class Child extends Parent{
String name;
@Override
public void method() {
System.out.println("Child 클래스에서 오버라이드된 method()");
}
}
: Parent 클래스의 method()를 호출하지만 출력값은 Child의 Override된 결과값이 출력 된다.
: 고쳐(추가) 기입이 진행되기 때문이다.
: "Parent 클래스의 method()" -> "Child 클래스에서 오버라이드된 method()" 이렇게 된 것
instanceof와 형변환을 활용한 자식 클래스 고유 메서드 호출
public class MainClass {
public static void main(String[] args) {
Parent par = new Child();
if(par instanceof Child){
System.out.println("Child class로 생성");
Child chi = (Child) par;
chi.child_method();
}
}
}
: par에는 child_method()가 없기 때문에 child로 형변환을 해준다.
public class Parent {
private int number;
public void parent_method(){
System.out.println("Parent 클래스의 parent_method()");
}
public void method(){
System.out.println("Parent 클래스의 method()");
}
}
: main에서 호출한 것을 보면 부모클래스인 Parent에는 없는 메서드이다.
: 그런데 어떻게 호출이 되었는가? 형변환을 해줘서!
public class Child extends Parent{
String name;
public void child_method() {
System.out.println("Child 클래스의 고유 메서드: child_method()");
}
}
: par이 실제로 child 클래스의 인스턴스이므로 조건이 참이라 첫 번째 행 출력
: 형변환된 chi 객체로 child 클래스의 고유 메서드 child_method()를 호출 두 번째 행 출력
부모-자식 클래스 관계와 생성자 활용
public class MainClass {
public static void main(String[] args) {
Child ch = new Child(13, "일지매");
System.out.println(ch.toString());
}
}
: Child 객체를 생성한 뒤, toString() 메서드를 호출하여 객체 정보를 출력
public class Parent {
private int number;
public Parent(int number){
this.number = number;
}
public int getNumber() {
return number;
}
}
: 정수형 필드를 가지고 있으며, 매개변수 생성자를 통해 초기화 된다.
: getNumber() 메서드는 number 값을 반환한다.
: Parent 클래스는 객체의 공통 속성을 정의하는 부모 클래스 역할
public class Child extends Parent{
private String name;
public Child(int number, String name) {
super(number);
this.name = name;
}
@Override
public String toString() {
return "Child{" +
"number : " + getNumber() + " " +
"name : '" + name + '\'' +
'}';
}
}
: Parent 클래스를 상속받아 number 필드를 물려받고, 추가적으로 name이라는 문자열 필드를 정의
: 생성자를 통해 부모 클래스의 필드(number)와 자식 클래스의 필드(name)을 초기화
: toStirng 메서드를 오버라이드하여 number와 name을 포함한 객체 정보를 문자열로 출력
'Java' 카테고리의 다른 글
Java) 인터페이스와 다중 상속 예제 코드 (0) | 2025.01.09 |
---|---|
Java) 추상 클래스와 추상 메서드의 이해 및 활용 예제 (0) | 2025.01.09 |
Java) 객체지향 프로그래밍 : 상속성 및 다형성(2) (0) | 2025.01.08 |
Java) 객체지향 프로그래밍 : 상속성 및 다형성 (0) | 2025.01.08 |
Java) 생성자(constructor)와 객체 생성 및 초기화 (0) | 2025.01.06 |