단일상속

  • 자바에서는 단일상속만 가능하다. (= 두개이상불가)
  • 클래스 간의 관계가 명확해진다.
class TVCR extends Tv, VCR{ // 허용하지않는다
		  
}
  • Tv와 VCR에 동일한 메소드가 존재한다면 어떤 메서드를 상속받는 지 알 수 없다.
  • Tv의 메서드명을 변경한다면 그동안 사용해온 모든 곳을 수정해주어야 한다.

Object클래스

  • 모든 클래스의 조상 = 최상위 클래스
  • 다른 클래스를 상속받지 않는 클래스는 Object클래스를 상속 받는다.
class A extends Object{

}
  • 모든 클래스는 Object클래스를 상속받게 되어 있다.
    • toString()나 equals()를 사용할 수 있는 것은 Object클래스의 메서드이기 때문이다.

toString()

  • 인스턴스의 정보를 제공할 목적으로 사용된다.
  • 참조변수를 출력하면 참조변수가 가르키고 있는 인스턴스의 toString()를 호출한다.
Tv t = new Tv();
System.out.println(t.toString()); 
//toString()이 평소에 숨어있는 것
//최상위 클래스 Object의 11가지 필수항목 중 하나 (ex. equals())
//Override 하여 사용하는 경우도 있음 -> DeckTest.java

참조변수 super

  • 조상클래스의 멤버와 자손클래스의 멤버가 중복정의되어 있을 때 구분할 목적으로 사용된다.
    • 멤버 = 변수+메서드
  • 조상의 멤버와 자손의 멤버를 구분한다는 점을 제외하고는 this.과 동일하다.

super 예시

public class Ex3_13 {
    public static void main(String[] args) {
        Child c = new Child();
        c.method(50);
    }
}

class Parent {
    int x = 10;
    void method(){
        System.out.println("Parent");
    }
}

class Child extends Parent {
    int x = 30;
    
    void method(int x){
        System.out.println("x : "+x); //50
        System.out.println("this.x : "+this.x); //30
        System.out.println("super.x : "+super.x); //10
        super.method(); //메서드도 호출가능, this는 인스턴스변수만
    }
    //지역변수 -> 클래스 내 전역변수 -> 부모클래스의 변수
}

super() - 조상클래스의 생성자

  • this()와 마찬가지로 super()도 생성자 호출이다.
  • this(): 같은 클래스의 생성자 내에서 다른 생성자를 호출할 때 사용한다.
  • super(): 자손클래스의 생성자 내에서 부모클래스의 생성자를 호출할 때 사용한다.
  • 맨위에올려줘야되기때문에 둘다같이는 못쓰지만 일반적으로 super()가 올라가있다.
public class PointTest {
    public static void main(String[] args) {
        Point3D p3 = new Point3D(1,2,3);
    }
}

class Point{
    int x;
    int y;
    
    Point(int x, int y){
        this.x = x;
        this.y = y;
    }
    //주의! 부모에 기본생성자가 없으면 자손클래스 컴파일시 부모 기본생성자를 호출함.
}

//컴파일러가 만들어주는 기본생성자에는 부모 기본생성자가 숨겨져있음.
class Point3D extends Point2 { 
    int z;
    
    Point3D(int x, int y, int z) {
        super(x,y); //super로 부모꺼 먼저 초기화하고 자손꺼 해야함
        this.z=z;
    }
    
    /*
    
    Point3D(int x, int y, int z) { //컴파일 에러. 
        //생성자 첫줄에서 다른 생성자를 호출하지 않기 때문에 컴파일러가 super()를 호출하나 부모클래스에 기본생성자가 없음.
        this.x = x;
        super.y = y;
        this.z = z;
    }
    */
    
    Point3D(int t){
        super(t,0); //그냥 super(); 못씀. 기본없음. 자동컴파일 안됨.
    }


}

오버라이딩 (Overriding)

  • 조상클래스로부터 상속받은 메서드의 '내용'을 '재정의'하는 것
    • 선언부는 똑같이, 구현부는 내가 원하는대로
  • !!오버로딩: 한 클래스 내같은 이름의 메서드를 여러 개 정의하는 것, 매개변수 타입과 갯수가 중요

오버라이딩 조건

제어자 void method() 예외처리 { //선언부
	//구현부
}
  • 선언부가 동일하면 된다.
    • 메서드명이 동일해야 한다.
    • 매개변수의 갯수와 타입이 같아야 한다.
    • 반환타입이 같아야 한다.
  • 부모클래스로부터 상속받는 자손클래스의
    • 접근제어자는 부모보다 좁은 범위를 설정할 수 없다.
    • 예외의 갯수는 부모클래스의 메서드가 가진 예외보다 많이 선언할 수 없다.

오버라이딩 예시

public class OverTest{
    public static void main(String[] args){
        OverGo og = new OverGo();
        String result = og.overMethod();
        System.out.println(result);
        
        System.out.println(og.value);
        
        //오버업의 객체 생성 없이 OverUp 클래스의 메소드를 호출
        int result2 = og.getOverUpValue();
        System.out.println(result2);
    }
}

class OverUp{
    int value = 10;
    
    String overMethod(){
        return "OverUp Method";
    }
}

class OverGo extends OverUp{
    int value = 20;
    
    @Override //상속받아 오버라이드한 메서드라고 타인에게 알림
    String overMethod();
        return "OverGo Method";
    }
    
    //오버라이드한 것을 오버로딩
    String overMethod(int k){
        return k+"OverGo Method";
    }
    
    int getOverUpMethod(){
        return super.value;
    }
    
}


  
profile
갈 길이 멀다

0개의 댓글