상속
: 어떤 클래스가 있을 때 그 클래스가 가지고 있는 변수와 메서드를 확장(상속)해서 다른 클래스가 갖도록 하는 것
(자바의 모든 클래스는 object 클래스를 반드시 상속받음!)
재사용성을 높이고 유지보수의 편의성을 높이고 가독성을 높이고 코드의 양을 줄이는 목적 달성 가능
extends 키워드
Cal3 클래스는 Cal 클래스를 상속한다
class Cal3 extends Cal{}
상속받은 클래스에 새로운 기능 추가
class Cal{
public int sum(int v1, int v2) {
return v1+v2;
}
}
class Cal3 extends Cal{
public int minus(int v1, int v2) {
return v1-v2;
}
}
상속받은 클래스에서 부모 클래스 기능 수정 (오버라이딩)
class Cal{
public int sum(int v1, int v2) {
return v1+v2;
}
}
class Cal3 extends Cal{
public int sum(int v1, int v2) {
System.out.println("Cal3!!!");
return v1+v2;
}
}
오버라이딩
: 상속받은 클래스에서 부모 클래스의 기능을 올라타서 덮어쓰기. (부모 클래스의 메서드 재정의)
오버로딩 = 과적하다, 너무 많이 탑재 하다
: 메서드에서만 가능하고, 상속과는 상관없음
(자바에서는 형태만 다르면 같은 이름의 여러 메서드를 과적할 수 있음)
class Cal{
public int sum(int v1, int v2) {
return v1+v2;
}
}
class Cal3 extends Cal{
public int minus(int v1, int v2) {
return v1-v2;
}
//overriding
public int sum(int v1, int v2) {
System.out.println("Cal3!!!");
return v1+v2;
}
//overloading
public int sum(int v1, int v2, int v3) {
return v1+v2+v3;
}
}
상속과 관련된 중요한 키워드
: this키워드는 자기자신을 (특히 인스턴스를), super키워드는 부모클래스를 가리킨다
class Cal{
public int sum(int v1, int v2) {
return v1+v2;
}
//overloading
public int sum(int v1, int v2, int v3) {
return this.sum(v1,v2)+v3;
}
}
class Cal3 extends Cal{
public int minus(int v1, int v2) {
return v1-v2;
}
//overriding
public int sum(int v1, int v2) {
System.out.println("Cal3!!!");
return super.sum(v1,v2);
}
}
생성자가 있는 클래스를 상속받았다면,
자식 클래스에다 생성자를 만들어서 부모 클래스의 생성자를 반드시 호출해야 한다
class Cal{
int v1, v2;
Cal(int v1, int v2){
System.out.println("Cal init!!");
this.v1 = v1; this.v2 = v2;
}
}
class Cal3 extends Cal{
Cal3(int v1, int v2){
super(v1,v2);
System.out.println("Cal3 init!!");
}
}
public class InheritanceApp{
public static void main(String[] args) {
Cal c = new Cal(2,1); //Cal init!!
Cal3 c3 = new Cal3(2,1); //Cal init!! Cal3 init!!
}
}