Inheritance(상속)

접근제한자

package day0629_different;

public class SuperObj {

	protected String name;
	protected int age;
	
	public SuperObj(String name,int age) {
		this.name=name;
		this.age=age;
	}
}
  • 별개의 package 설정
  • public, protected : 부모 class가 다른 package에 있어도 변수에 접근 가능
  • default : 같은 package에 있으면 변수에 접근 가능
  • private : 같은 package에 있어도 변수에 접근 불가
package day0629;

import day0629_1.SuperObj;

public class SubObj_03 extends SuperObj{

	String addr;
	
	public SubObj_03(String name, int age,String addr) {
		super(name, age); //반드시 첫줄,부모생성자 호출
		this.addr=addr;
	}
	
	public void write() {
		System.out.println(this.name+"\n"+this.age+"\n"+this.addr);
	}
}
  • SuperObj와 다른 package 설정 후 SuperObj(부모 class) 호출
  • command : (class 속성) (class명) “extends (super class명)”{ }
  • 부모 class 호출하면 반드시 부모 생성자 호출 필요
  • 자식 class의 부모 생성자 호출 시 부모 생성자의 인자가 무조건 첫 줄에 위치
package day0629;

public class TestObj_03 {

	public static void main(String[] args) {

		//생성
		SubObj_03 s=new SubObj_03("이민규", 29, "seoul");
				
		//메서드호출
		s.write();
	}
}
  • 자식 class의 method만 호출해도 부모 class의 것까지 중복 호출

OverRiding(Return Method)

package day0629;

public class Employee_04 {

	String sawonName;
	int salary;
	
	public Employee_04(String name,int sal) {
		this.sawonName=name;
		this.salary=sal;
	}
	
	//리턴 메서드
	public String getEmp() {
		return sawonName+","+salary;
	}
}
  • method를 만들어 return 값을 지정
public class Manager_04 extends Employee_04{

	String buseo;
	public Manager_04(String name, int sal,String b) {
		super(name, sal); //부모생성자 호출
		buseo=b; //초기화
	}
	
	@Override
	public String getEmp() {
		return super.getEmp()+","+buseo;
	}
}
  • 하위 class에서 부모 class의 method를 수정해서 사용
  • method명과 return type은 부모 class의 method와 반드시 동일
  • OverRiding은 부모, 자식 순서 무관
public class EmpMain_04 {

		public static void main(String[] args) {
			
		Manager_04 man=new Manager_04("최지우", 2500000, "기획경영부");
		
		System.out.println(man.getEmp());//재정의된 메서드 호출
	}
}
  • 자식 class에서 수정된(재정의된) method를 호출

Default 생성자 & 명시적 생성자 구분 사용

class Point {
	int x;
	int y;
	
	//디폴트 생성자
	public Point() {} //super_디폴트 생성자
	
	//명시적 생성자
	public Point(int x,int y) {
		this.x=x;
		this.y=y;
	} //super_인자있는 생성자
	
	//메서드
	public void write() {
		System.out.println("x좌표="+x+"y좌표="+y);
	}
}
  • default 생성자와 명시적 생성자를 각각 생성(Super)
class SubPoint extends Point{
	String msg;

	public SubPoint() {
		super(); //생략되어있음
	}	//sub_디폴트 생성자

	public SubPoint(int x, int y,String msg) {
		super(x, y);
		this.msg=msg;
	} //sub_인자있는 생성자

	//오버라이딩..부모의 메서드 재구현할 목적
	@Override
	public void write() {
		super.write();
		System.out.println("메세지: "+msg);
	}
}
  • default 생성자와 명시적 생성자를 각각 생성(Sub)
  • default 생성자 생성 시 super( ); 이 생략되어 있는 상태
  • 부모 class에서 명시적 생성자를 만든 경우 하위 class에서 반드시 명시적 생성자를 만들어야 함
  • 부모 class에서 명시적 생성자를 만들지 않은 경우(default 생성자가 생략된 경우) 하위 class에서도 default 생성자가 생략되어 있음 (but 하위 class에서 명시적 생성자 만들 수 있음)
public class ExObTest_05 {

	public static void main(String[] args) {

		SubPoint sp=new SubPoint();
		sp.write(); //x좌표=0y좌표=0\n메세지=null
		
		SubPoint sp1=new SubPoint(43, 213, "hello");
		sp1.write(); //x좌표=43y좌표=213\n메세지=hello
	}
}
  • 각각 출력

Abstract Class & Method

abstract class Fruit {
	static final String MESSAGE="Hello!";
	
	//일반메서드
	public void getTitle() {
		System.out.println("Abstract Class");
	}
	
	//추상메서드(미완의 메서드..선언문만 있고 구현부인 몸통이 없다)
	abstract public void showMessage(); //오버라이딩
}
  • abstract method가 하나라도 존재하면 abstract class
  • Abstract class는 일반 변수(인스턴스 변수)를 내재 불가. 즉, 상수(static 변수), 일반 method, 추상 method를 내재 가능)
  • Abstract class는 new로 생성 불가
  • 추상 method가 하나라도 존재하면 추상 class
class Apple extends Fruit{

	@Override
	public void showMessage() {
		System.out.println("Apple_Message");
		System.out.println(Fruit.MESSAGE);
	}
}
  • 추상 class를 상속받은 하위 class Apple
  • 부모 class의 미완인 추상 method를 상속 받으면 반드시 그 method를 overriding해야 함
public class ExAbstract_08 {

	public static void main(String[] args) {

		//일반생성_메서드 호출
		Apple a=new Apple();
		a.showMessage();
  • 생성을 통한 호출 및 출력

다형성

public class ExAbstract_08 {

	public static void main(String[] args) {

		Fruit fruit; //Fruit fruit=null;
		
		fruit=new Apple();
		fruit.showMessage(); //Apple_Message

		fruit=new Banana();
		fruit.showMessage(); //Banana_Message
		
		fruit=new Orange();
		fruit.showMessage(); //Orange_Message

		fruit.getTitle();	 //Hello!
	}
}
  • 각 다형성은 바로 위의(가장 가까운) 생성된 자식 class의 method를 실행
  • command : (부모 class명) (참조변수명)=new (자식 class명)( ); \n (참조변수명).(method명);
  • 하나의 변수로 여러가지 일을 처리할 때 사용
  • 다형성은 부모와 자식 class 모두에 있는 method를 사용 가능
  • 주의 : 자식 class의 method에서 부모 class의 method를 overriding한 경우 자식 class의 method를 기준으로 실행

Interface

public interface FoodShop {

	String SHOPNAME="보슬보슬"; //final
	
	public void order(); //abstract
	public void beadal();
}
  • Interface는 상수(final 변수)와 추상 method만 선언이 가능
  • 즉, 모든 멤버 변수는 final이 생략, 모든 method는 abstract이 생략
public class Food_10 implements FoodShop {

	@Override
	public void order() {
		System.out.println(SHOPNAME);
		//SHOPNAME="돈까스집";(final이라 변경안됨)
		System.out.println("음식을 주문합니다");
	}

	@Override
	public void beadal() {
		System.out.println(SHOPNAME);
		System.out.println("음식을 배달합니다");
	}
}
  • 인터페이스를 상속하고 overriding 하지 않으면 추상 class가 되어버린다
  • implements는 다중구현이 가능
  • class → class : extends
  • class → interface : implements
  • interface → interface : extends
  • 주의 : interface 상속 시(implements) 추상 method를 상속 받기 때문에 반드시 override 해야 함
public class FoodBeadalMain {

	public static void main(String[] args) {

		Food_10 food=new Food_10();
		food.order();
		food.beadal();
		
		FoodShop f=new Food_10();
		f.order();
		f.beadal();
	}
}
  • 위의 경우 일반생성과 다형성으로 method 호출 결과는 모두 같다
profile
초보개발자

0개의 댓글