Java 18. 상속과 오버라이딩

업데이트:
2 분 소요

상속과 오버라이딩

1.상속(inheritance) 개념

  • 기존의 클래스를 확장하여 새로운 클래스를 작성하는 것

상속하는 클래스

  • 상위 클래스, parent class, base class, super class
  • 기반 클래스, 조상 클래스

상속 받는클래스

  • 하위 클래스, child class, derived class, subclass
  • 파생 클래스, 자손 클래스

  • 자손은 조상의 모든 멤버를 상속받음 (단 생성자, 초기화 블럭 제외)
  • 자손의 멤버개수가 조상보다 적을 수 없음.(같거나 많음)
   - 다형성 개념 적용
   - 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현할 때 기존 클래스를 상속함.
public class Bicycle {
	
	int id;
	String brand;
	String owner;
}
public class MountainBike extends Bicycle{
	
	String frame;
	int gear;
	int price;
	
	public void print() {
		System.out.println("id : "+ this.id);
		System.out.println("brand : "+this.brand);
		System.out.println("frame : "+ this.frame);
		System.out.println("gear : "+ this.gear);
		System.out.println("price : "+ this.price);
		System.out.println("owner :"+this.owner);
	}

	public static void main(String[] args) {
		MountainBike mBike = new MountainBike();
		mBike.id = 824;
		mBike.brand = "LESPO";
		mBike.frame = "알루미늄";
		mBike.gear = 33;
		mBike.price= 300000;
		mBike.owner ="이순신";
		
		mBike.print();
		
	}
}

상속의 문법

  • extends 키워드 뒤에 단 하나의 클래스만 올 수 있음.
  • 자바는 단일 상속(single inheritance)만 지원함.

  • is a 관계 : ~ 은 ~이다 (자손 클래스는 조상 클래스이다.)
   - 직접적 관계  
   - 만들어질 클래스에 영향을 가장 많이 주는 클래스는 상속함.  

2.상속을 구현하는 경우

  • 상위 클래스는 하위 클래스보다 더 일반적인 개념과 기능을 가짐
  • 하위 클래스는 상위 클래스보다 더 구체적인 개념과 기능을 가짐
  • 하위 클래스가 상위 클래스의 속성과 기능을 확장(extends)한다는 의미

3.포함 관계 (composite)

  • 다중 상속을 대체하는 방법
  • 클래스의 멤버변수로 다른 클래스를 선언하는 것
  • 규모가 적은 클래스를 먼저 만들고, 이것을 조합하여 규모가 큰 클래스가 만들어감.

  • has a 관계 : ~ 은 ~를 가지고 있다.
   - 보조적인 것은 포함관계로 정의

4.Object 클래스

  • 모든 클래스의 조상
  • 사용자 정의 클래스는 아무것도 상속을 받지 않더라도 자동으로 Object를 상속 받음.

5.상속에서 하위 클래스가 생성되는 과정

  • 하위 클래스를 생성하면 상위 클래스가 먼저 생성됨.
   - new VIPCustomer()을 호출하면 Customer()가 먼저 호출됨.
  • 클래스가 상속받은 경우 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 호출함.

  • Customer

public class Customer {

	protected int customerID;
	protected String customerName;
	protected String customerGrade;
	int bonusPoint;
	double bonusRatio;

	public Customer(int customerID, String customerName) {
		this.customerID=customerID;
		this.customerName=customerName;
		
		customerGrade = "SILVER";
		bonusRatio = 0.01;
		
		System.out.println("Customer(int, string) 생성자 호출");
		
	}
	public int calcPrice(int price) {
		bonusPoint +=price * bonusRatio;
		return price;
	}
	public int getCustomerID() {
		return customerID;
	}
	public void setCustomerID(int customerID) {
		this.customerID = customerID;
	}
	public String getCustomerName() {
		return customerName;
	}
	public void setCustomerName(String customerName) {
		this.customerName = customerName;
	}
	public String getCustomerGrade() {
		return customerGrade;
	}
	public void setCustomerGrade(String customerGrade) {
		this.customerGrade = customerGrade;
	}	
}
  • VIPCustomer
public class VIPCustomer extends Customer {

	private int agentID;
	double saleRatio;

	public VIPCustomer(int customerID,String customerName) {
		super(customerID,customerName);
		customerGrade = "VIP";
		bonusRatio= 0.05;
		saleRatio = 0.1;
		
		System.out.println("VIPCustomer() 생성자 호출");
	}

	public int getAgentID() {
		return agentID;
	}
	
	
}

6.this

  • 인스턴스 자기 자신의 주소를 가지고 있는 참조변수
  • 지역변수와 인스턴스 멤버변수 구별함(변수의 모호성)

7.super

  • 하위클래스에서 가지는 상위 클래스에 대한 참조 값
  • 근본적으로 this와 같음.
  • 조상의 멤버와 자신의 멤버를 구별 지을 때 사용함.

8.super()

  • 상위 클래스의 기본 생성자를 호출함
  • 하위 클래스에서 명시적으로 상위 클래스의 생성자를 호춯하지 않으면 super()가 호출됨. (자동)
   - 이때 반드시 상위 클래스의 기본 생성자가 존재해야 함.
  • 상위 클래스의 기본 생성자가 없는 경우 ( 다른 생성자가 있는 경우 )
- 하위 클래스에서는 생성자에서 super(x)를 이용하여 명시적으로 상위 클래스의 생성자를 호출 함.

9.오버라이딩 (Overiding) – 재정의

  • 조상클래스에서 상속받은 메서드를 자손한테 맞게끔 구현부를 수정하는 것.
  • 반드시 메서드 선언부는 동일해야 함 (리턴타입, 메서드명, 매개변수)
  • modify, change의 개념

10.오버로딩 (Overloading)

  • 매개변수의 갯수, 타입, 순서가 다른 경우임.
     매개변수의 이름과 리턴타입은 영향을 주지 않음.
  • 새로운 메서드를 만드는 것 (new의 개념)

댓글남기기