4주차 - 상속 inheritance (4), 추상 메서드

2022. 9. 3. 14:20Java/java

클래스에는 추상 클래스, 추상 매서드 라는 것이 있다.

추상 메서드는 메서드의 생성은 하지만 실제 구현 내용은 자식 클래스에서 하도록 만드는 것이다.

추상 클래스는 이러한 추상 메서드를 가지고 있는 클래스를 부른다.

추상 메서드의 생성은 일반적으로 public과 반환 자료형 사이에 abstract를 입력하면 된다.

추상 메서드의 작성 예시)

public abstract void method03(); 

 

추상 클래스도 이와 비슷하게 class 앞에 abstract를 입력하면 된다.

추상 클래스의 작성 예시)

public abstract class Parent{}

 

아래는 추상클래스인 부모클래스의 생성

// 추상클래스 : 추상메서드를 가지고 있는 클래스
public abstract class Parent {
	public void method01() {
		System.out.println("Parent method01");
	}
	
	public void method02() {
		System.out.println("Parent method02");
	}
	
	//추상메서드 : 구현 내용은 자식에게 넘김
	public abstract void method03(); 
}

이 아래는 4주차 - 상속 inheritance (3) 에서 다루었던 코드와 동일

 

아래는 자식 클래스의 생성 1

public class Child1 extends Parent{
	
	public void method02() {
		System.out.println("Child1 method02");
	}
	public void method03() {
		System.out.println("Child1 method03");
	}
}

자식 클래스의 생성 2

public class Child2 extends Parent{
	public void method02() {
		System.out.println("Child2 method02");
	}
	public void method03() {
		System.out.println("Child2 method03");
	}
}

메인 클래스

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Main {

	public static void main(String[] args) {
		List<String> list1 = new ArrayList<>();
		List<String> list2 = new LinkedList<>();
		
		list1.add("ArrayList");
		list2.add("LinkedList");
		
		System.out.println(list1.get(0));
		System.out.println(list2.get(0));
		System.out.println();
		
		Child1 c1 = new Child1();
		c1.method01(); // 부모 메서드
		c1.method02(); // 부모 - 자식 메서드
		c1.method03(); // 자식 메서드
		System.out.println();
		
		Parent p = new Parent() {
			@Override
			public void method03() {}
		};
		p.method01();
		p.method02();
//		p.method03();
		System.out.println();
		
		int intData1 = 10;
		double doubleData = intData1; //큰 공간에 작 공간의 데이터 입력
		int intData2 = (int) doubleData; // 작은 공간에 큰 공간의 데이터 입력
		
		// 업캐스팅 : 하위 객체의 참조 값을 상위 객체의 참조변수에 입력.
		Parent p2 = c1; 
		p2.method01();
		p2.method02();
		System.out.println();
		
		// 다운 캐스팅 : 상위 객체의 참조 값을 하위 객체의 참조변수에 입력.
		System.out.println("c11");
		Child1 c11 = (Child1)p2; 
		c11.method01();
		c11.method02();
		c11.method03();
		
		System.out.println();
//		Parent 인스턴스에 접근은 자식의 자료형으로는 안됨.
//		Child1 c111 = (Child1)p;
//		c111.method01();
//		c111.method02();
//		c111.method03();
//		
		
		childPrint(new Child1());
		childPrint(new Child2());
		
		parentPrint(new Child1());
		parentPrint(new Child2());
	}
	public static void childPrint(Parent p) {
		System.out.println("\nchildPrint");
		p.method01();
		p.method02();
		
		if(p instanceof Child1) {
			Child1 c1 = (Child1)p;
			c1.method03();
		}else if(p instanceof Child2){
			Child2 c2 = (Child2)p;
			c2.method03();
		}
	}
	public static void parentPrint(Parent p) {
		System.out.println("\nparentPrint");
		p.method01();
		p.method02();
		p.method03();
	}
	
//	public static void childPrint1(Child1 c) {
//		c.method01();
//		c.method02();
//		c.method03();
//	}
//	public static void childPrint2(Child2 c) {
//		c.method01();
//		c.method02();
//		c.method03();
//	}
}