Develop/Java

Java 기초 문법(파트7. 상속)

춘하형 2021. 5. 10. 12:05

파트7 강의리스트

상속

부모 객체를 자식 객체에서 사용가능하도록 물려주는 것

상속 받는 법은 자식 객체 뒤에 extends [부모 객체명]

부모로부터 자식이 상속을 받으면 자식은 부모의 변수, 메소드 사용가능.

반대로 부모는 자식의 변수, 메소드 사용불가능

접근제한자

public 어디든 사용가능
protected 동일 패키지내 또는 상속
default 동일 패키지내
private 자신 클래스에서만 사용
추상클래스

구체적이지 않은 클래스(?)

내부에 추상메소드가 있을 경우 그 클래스는 추상클래스

추상클래스를 상속받은 자식 클래스는 추상클래스의 추상메소드를 반드시 선언해야함

추상클래스 선언/추상메소드 선언

클래스명 앞에 abstract

public abstract class Food{

   public abstract void meat();

}

추상클래스를 사용하는 이유

추상 클래스는 상속을 강제하기 위한 것이다. 즉 부모 클래스에는 메소드의 시그니처만 정의해놓고 그 메소드의 실제 동작 방법은 이 메소드를 상속 받은 하위 클래스의 책임으로 위임하고 있다. 사실 코드를 이런 식으로 작성하는 경우는 작은 규모의 프로젝트에서는 거의 없다. 예제를 통해서 추상 클래스의 용도를 생각해보자.

출처 : 생활코딩

https://edu.goorm.io/learn/lecture/41/%EB%B0%94%EB%A1%9C%EC%8B%A4%EC%8A%B5-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94-java/lesson/734/%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

super와 부모생성자

클래스가 인스턴스될 때 객체를 초기화함. 이 때 만약 부모클래스 상속을 받았을 경우 자식클래스 인스턴스시 부모생성자->자식생성자 순으로 실행됨.

이 때 부모를 super로 명명

오버라이딩

상속받은 자식클래스에서 부모와 동일한 메소드명을 가지는 것

ex)

부모클래스

public class Food{
	public int meat(String str){
    	System.out.println(str+"부모 클래스입니다");
    }
}

자식클래스

public class FoodSon extends Food
	public int meat(String str){
    	System.out.println(str+"자식 클래스입니다");
    }
}

실행클래스

public class OverridingExam{
	public static void main(String[] args){
      FoodSon fs = new FoodSon();
      fs.meat("돼지고기");
      Food fd = new Food();
      fd.mead("소고기");
    }
}

결과

돼지고기자식 클래스입니다.

소고기부모 클래스입니다.

클래스형변환

자식클래스 선언시 부모타입으로 선언했을 경우 부모메소드만 사용가능함.

이때 자식 메소드를 사용하고자 할 경우에는 클래스형변환해줘야함.

ex)

부모클래스

public class Food{
	public void meat(){
    	System.out.println("고기고기고기");
    }
}

자식클래스

public class FoodSon extends Food{
	public void vegetable(){
    	System.out.println("채소채소채소");
    }
}

실행클래스

public class exam{
	public static void main(String[] args){
      Food fd = new FoodSon();	//부모타입으로 자식객체 선언
      fd.meat();				//부모타입으로 선언했기때문에 부모메소드만 사용가능
      FoodSon fs = (FoodSon)fd;	//클래스형변환
      fs.vegetable();			//자식객체 메소드 사용가능
    }
}