본문 바로가기

코딩 공부/Java

상속

상속

기대효과 

  • 반복적인 코드줄임(리팩토링)
  • 유지보수의 편리성
  • 기존 코드를 활용함으로서 개발시간 단축

많은 사람과 협업해야 하기 때문에 최대한 다른 사람이 편할 수 있도록 중복을 피하는 것이 좋다.

*다중상속 불가능하다.

*private접근제어자는 상속이 불가능하다.

자기 자신의 생성자혹은 부모의 생성자를 호출하는 경우 단 하나만 호출할 수 있다.

**부모의 생성자 호출은 첫번째 줄만 가능하다.**

 

extends로 class를 상속받을 수 있다.

 

-자동차클래스

package inheritance;
public class Car {
	private int maxSpeed;
	private double distance;
	
	public Car(int maxSpeed){
		this.maxSpeed = maxSpeed;
	}
	
	public void drive() {
		this.distance=this.distance+this.maxSpeed*0.5;
	}
	
	public int getMaxSpeed() {
		return maxSpeed;
	}
	
	public void setMaxSpeed(int maxSpeed) {
		this.maxSpeed = maxSpeed;
	}
	
	public double getDistance() {
		return distance;
	}
	
	public void setDistance(double distance) {
		this.distance = distance;
	}
	
}

자동차 클래스를 상속받은 새로운 자동차.

package inheritance;

public class Newcar extends Car{
	private boolean booster;
	public Newcar(int maxSpeed) {
		super(maxSpeed);
		this.booster = false;
	}
	public Newcar(int maxSpeed,boolean booster) {
		super(maxSpeed);
		this.booster = booster;
	}

	@Override  //어노테이션 애노테이션 부모를 재정의 한다는 뜻 JVM에게 알려준다.
	public void drive() {
		if(booster==true) {
			setDistance(getDistance()+getMaxSpeed()*0.75);
		}else 
		super.drive();//부모의 drive의 기능 메서드 이름이 바뀌지 않아 코드 작성시 불편함이 최소화 될 수 있다
	}
}

메인클래스

package inheritance;

public class CarMain {
	public static void main(String[] args) {
		Car car = new Car(200);
		
		car.drive();
		System.out.println("거리 : "+car.getDistance());
		car.drive();
		System.out.println("거리 : "+car.getDistance());
		
		Newcar newCar = new Newcar(200,true);//부스터 모드를 추가 하고 싶다.
		
		car.drive();
		System.out.println("거리 : "+car.getDistance());
		car.drive();
		System.out.println("거리 : "+car.getDistance());
	}
}

 

Super 연산자

부모객체에 접근할 경우 사용

부모객체의 생성자 호출 시 사용

 

Override

부모 클래스의 메소드를 상속받은 자식 클래스에서 재정의하여 사용

반환자료형 인자형식 개수등 모든 구조가 같아야 한다

내부 코드만 재구성하는 것 { 이 안 부분 }



다형성

instanceof

 

자식클래스가 부모 인스턴스에 접근 하기 위해서는 업캐스팅을 해 준후 해야한다.

package inheritance4;

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));
		
		
		Child1 c1 = new Child1();
		c1.method01();//부모메서드
		c1.method02();//부모-자식 메서드(이 경우 자식메서드가 우선선택됨)
		c1.method03();//자식메서드
		
		Parent p = new Parent();
		p.method01();
		p.method02();
		//p.method03(); 자식의 메서드는 올 수 없다.
		
		int intData1 = 10;
		double doubleData = intData1;//큰 공간에 작은 공간의데이터를 입력
		int intData2 = (int)doubleData;//작은 공간에 큰 공간 데이터를 입력(다운 캐스팅)
		
		Parent p2 = c1; //하위객체의 참조값을 상위객체의 참조변수에 입력(업캐스팅)
		p2.method01();
		p2.method02();//c1을 받아왔기 때문에 자식 메소드를 호출한다.
		System.out.println("주소"+p2+","+c1);
		
		Child1 c11 = (Child1)p2; //다운캐스팅을 한다.(상위객체의 참조값을 하위객체의 참조변수에 입력)
		c11.method01();
		c11.method02();
		c11.method03();
		System.out.println();
		System.out.println(c11);
		
		//Parent인스턴스에 접근은 자식의 자료형으로는 안된다.
		//Child1 c111 = (Child1)p;
		//c111.method01();
		//c111.method02();
		//c111.method03();
		//childPrint(new Child1());
		//childPrint(new Child2());
		//부모가 같다면 메서드를 하나로 합칠 수 있다.
	}
	public static void childPrint(Parent p) {
		//instanceof
		p.method01();
		p.method02();
		if(p instanceof Child1) {
			Child1 c1 = (Child1)p;
			c1.method03();
		}
		if(p instanceof Child2) {
			Child2 c2 = (Child2)p;
			c2.method03();
		}
	}
	
//	public static void ChildPrint(Child1 c) {
//		c.method01();
//		c.method02();
//		c.method03();
//
//	}
//	public static void ChildPrint(Child2 c) {
//		c.method01();
//		c.method02();
//		c.method03();
//
//	}
}
//Child1클래스
package inheritance;

public class Child1 extends Parent  {
	public void method02() {
		System.out.println("Child1 method02");
	}
	public void method03() {
		System.out.println("Child1 method03");
	}
}
//==============================================================
//Child2클래스
package inheritance;

public class Child2 extends Parent {
	public void method02() {
		System.out.println("Child2 method02");
	}
	public void method03() {
		System.out.println("Child2 method03");
	}
}
//==============================================================
//Child1,Child2의 부모클래스
package inheritance;

public class Parent {
	public void method01() {
		System.out.println("Parent method01");
	}
	public void method02() {
		System.out.println("Parent method02");
	}
	
}



추상클래스 

추상 메서드를 가지고 있는 클래스

추상 메서드 구현부분이 없고 그 부분을 자식에게 넘긴다.

 

인터페이스

기능이 없는 메소드들만 있다. 상속받을 때는 implements

 

'코딩 공부 > Java' 카테고리의 다른 글

MVC Pattern  (0) 2022.08.25
생성자  (0) 2022.08.23
클래스  (0) 2022.08.22
HashMap  (0) 2022.08.21
Hash Set  (0) 2022.08.20