페이지

2015. 1. 12.

[JAVA] Day6.오버라이딩(Overriding)

2. 오버라이딩(Overriding)


2.1 오버라이딩(Overriding)이란?

조상 클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 오버라이딩이라고 한다.
즉, 변수는 그냥 쓰되 상속된 메서드를 현재 쓰임에 맞게 조금씩 수정하여 사용.


2.2 오버라이딩의 조건

 - 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)
 - 접근제어자를 좁은 범위로 변경할 수 없다.(조상의 메서드가 protected라면, 범위가 같거나 넓은 public으로만 변경할 수 있다.)
 - 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.


class A
{}
class B extends A
{    //오브젝트 클래스의 toString을 오버라이딩
    public String toString()
    {
        return "오버라이딩";
    }
}

class Test
{
    public static void main(String[] args)
    {
        B b = new B();
        System.out.println(b.toString());
        System.out.println(b);
    }
}



2.3 오버로딩 vs. 오버라이딩


오버로딩

 - 기존에 없는 새로운 메서드를 정의하는 것.

오버라이딩

 - 상속받은 메서드의 내용을 변경하는 것.



2.4 super - 참조변수


this

 - 인스턴스 자신을 가리키는 참조변수.
 - 인스턴스의 주소가 저장되어 있음.
 - 모든 인스턴스 메서드에 지역 변수로 숨겨진 채로 존재.

super

 - this와 같음
 - 조상의 맴버와 자신의 맴버를 구별하는데 사용.



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

class Parent
{
    int x = 10;
}

class Child extends Parent
{
    int x = 20;
    void method()
    {
        int x = 30;
        System.out.println("x = " + x);            //지역변수 30
        System.out.println("this.x = " + this.x);    //인스턴스변수 20
        System.out.println("super.x = " + super.x);    //부모인스턴스변수 10
        //변수에서는 오버라이딩 개념이 없고 모두 상속 받는다.
        //따라서 변수명이 중복되면 구분이 필요하다.
    }
}






2.5 super() - 조상생성자


 - 자손 클래스의 인스턴스를 생성하면, 자손의 맴버와 조상의 맴버가 합쳐진 하나의 인스턴스가 생성된다.
 - 조상의 맴버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.

주의 사항!!
 - 가장 첫줄에 써야한다.(Object클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 super();를 생성자의 첫줄에 삽입한다.)
 - 따라서!! this와 super는 같이 사용 불가능!!
 - 사실 잘 안쓰임

class Test
{
    public static void main(String[] args)
    {
        Point3D p3 = new Point3D(7,2,3);
        System.out.println(p3.getLocation());
    }
}
class Point
{
    int x, y;
    Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    String getLocation()
    {
        return "x = " + x + ", y = " + y;
    }
}
class Point3D extends Point
{
    int z;
    Point3D(int x, int y, int z)
    {
        super(x,y);    //첫 줄에 써야함!!
        this.z = z;
    }

    String getLocation()
    {
        return "x = " + x + ", y = " + y + ", z = " + z;
    }
}