오버로딩(overloading): 동일 클래스내의 동일 메소드에 매개변수(parameter) 등을 추가(과적), 상속과 관련 없음(부모 자식 어디서든지 가능)
class Cal{
public int sum(int v1,int v2){
return this.v1+v2;
}
}
class Cal3 extends Cal{
public int minus(int v1, int v2){
return v1-v2;
}
// 오버라이딩
public int sum(int v1, int v2){
System.out.println("cal3!!!")
return v1+v2;
}
}
public class InheritanceApp {
public static void main(String[] args) {
Cal c = new Cal(2,1);
Cal3 c3 = new Cal3(2, 1);
System.out.println(c3.sum()); // 3
System.out.println(c3.minus()); // 1
}
}
class Cal{
public int sum(int v1, int v2){
return this.v1+v2;
}
//오버로딩
public int sum(int v1, int v2, int v3){
return this.v1+v2+v3;
}
}
class Cal3 extends Cal{
public int minus(int v1, int v2){
return v1-v2;
}
// 오버라이딩
public int sum(int v1, int v2){
System.out.println("cal3!!!")
return v1+v2;
}
}
public class InheritanceApp {
public static void main(String[] args) {
Cal c = new Cal(2,1);
Cal3 c3 = new Cal3(2, 1);
System.out.println(c3.sum()); // 3
System.out.println(c3.minus()); // 1
}
}
this: 자기 자신의 인스턴스, 현재 클래스 안의 개체를 가져오는 참조 변수
(예시: 부모, 자식 클래스에서 부모 클래스의 같은 변수가 있어도 this를 사용하여 자식 변수의 데이터를 가져옴)
super: 부모의(상속받는 class) 것을 뜻함, 자식 클래스에서 부모 클래스의 개체를 가져오는 참조 변수, 부모 클래스의 클래스 멤버 앞에 붙임
두 용어는 필드를 지칭할 때 사용.
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; // 오버로딩 전 작성된 기존의 cal클래스의 sum 메소드
}
}
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); // 상속받는 cal 클래스의 sum 메소드를 칭함
}
}
public class InheritanceApp {
public static void main(String[] args) {
Cal c = new Cal();
System.out.println(c.sum(2,1));
System.out.println(c.sum(2,1,1));
Cal3 c3 = new Cal3();
System.out.println(c3.sum(2,1));
System.out.println(c3.minus(2,1));
System.out.println(c3.sum(2,1));
}
}
class Cal2{
public int sum(int v1, int v2){
return v1+v2;
}
public int minus(int v1, int v2){
return v1-v2;
}
}
상속과 관련하여서 상속받은 부모클래스가 생성자가 있다면 자식 클래스는 반드시 그 생성자를 실행시켜야 한다!!
class Cal{
int v1,v2;
Cal(int v1, int v2){
System.out.println("Cal init!!");
this.v1 = v1; this.v2 = v2;
}
public int sum(){return this.v1+v2;}
}
class Cal3 extends Cal{
Cal3(int v1, int v2) {
super(v1, v2); // 상속받은 Cal 클래스를 뜻함, 부모클래스의 생성자
System.out.println("Cal3 init!!");
}
public int minus(){return this.v1-v2;}
}
public class InheritanceApp {
public static void main(String[] args) {
Cal c = new Cal(2,1);
Cal3 c3 = new Cal3(2, 1);
System.out.println(c3.sum()); // 3
//c3은 Cal3의 인스턴스이며 상속받은 Cal클래스의 sum메소드에 (이때, this는 현재 만들어진 인스턴스를 뜻함) 인자값을 넘겨서 실행
System.out.println(c3.minus()); // 1
}
}