관리 메뉴

드럼치는 프로그래머

[JAVA] 오버로딩, 오버라이딩, 추상클래스. 인터페이스 본문

★─Programing/☆─JAVA

[JAVA] 오버로딩, 오버라이딩, 추상클래스. 인터페이스

드럼치는한동이 2007. 10. 29. 11:34

1. 오버로딩

오버로딩이란 메서드의 중복을 말하는데, 같은 이름으로 여러 역할을 하도록 만드는 기술이다. 예를 들어

public class Poly {

    public void width(int r){

        float wid=3.14f*r*r;

        System.out.println("원의 넓이 : " + wid);

    } 

    public void width(int garo, int sero){

        int wid=garo*sero;

        System.out.println("사각형의 넓이 : " + wid);

    }

    public static void main(String args[]){

        Poly poly = new Poly();

        poly.width(10);

        poly.width(20, 10);   

}


  위에서 width()를 보자. 그러면 width(r)과 width(garo, sero)가 보이는데 이 두 메서드가 오버로딩되었다고 말할 수 있는 것이다.

  만약 width(10)으로 호출하게 되면 이 10이라는 것을 받을 수 있는 int 형 중 인수가 하나이기 때문에 width 메서드 중 위에 것이 호출되게 된다. 이것은 절차지향 프로그래밍과는 달리 객체지향 프로그래밍에서는 메서드의 이름으로 메서드가 같은 지를 판단하는 것이 아닌 메서드 인수의 타입이나 개수로 판단하기 때문에 가능한 것이다.



2. 오버라이딩

  오버라이딩은 간단히 정의해서 부모 클래스에서 정의되어 있는 메서드를 같은 이름으로 다른 역할을 재정의하고 싶을때 사용하게 된다.

  객체지향 프로그래밍은 유지보수에 초점이 맞추어져 있다. 그러다보니 비슷한 역할이라는 메서드의 이름을 통일하는 것을 더욱 좋게본다. 예를 들어 넓이를 구하는 의미인데, 어떤 메서드에서는 'width'라는 이름을 사용하고 어떤 메서드에서는 '넓이'라는 이름을 사용하면 나중에 같은 의미지만 헤메이게 될 소지가 있기 때문이다. 그러면 아래의 예를 보자.

public class Poly {

    private int garo;

    private int sero;

    public Poly(int garo, int sero) {

        this.garo=garo;

        this.sero=sero;

    }

    public void width(){

        int wid=garo*sero;

        System.out.println("사각형의 넓이 : " + wid);

    }

}

public class Tri extends Poly {

    public Tri(int garo, int sero) {

        this.garo = garo;

        this.sero = sero;

    }

    public void width() {

        float wid=garo*sero*0.5f;

        System.out.println("삼각형의 넓이 : " + wid);

    }

    public static void main(String[] args) {

        Tri tri = new Tri(20, 10);

        tri.width();

    }

}


  위의 예에서 보듯, 부모에 있는 width는 사각형을 구하기 위한 메서드였다. 그러나 Poly로부터 상속받은 Tri에서는 삼각형을 구하고자 했다. 그렇기 때문에 width라는 이름으로 넓이를 통일시키고자 Poly의 width를 Tri에서 재정의를 통해 구현한 것이다.



3. 추상 클래스

  추상 클래스는 선언만 되어 있고, 구현은 되어 있지 않은 메서드를 추상 메서드라고 하는데 추상 메서드를 하나라도 포함하게 되는 클래스를 추상클래스라고 한다. 추상메서드와 클래스는 항상 abstract라는 키워드를 붙여 줌으로서 선언하게 된다. 그럼 추상 클래스를 왜 사용해야할까? 아래의 예를 보면서 얘기해보자.

public abstract class Poly {

    int garo;

    int sero;

    public abstract void width();

}


  우리는 Poly 클래스에 이미 가로와 세로가 선언되어져 있고, 사각형의 넓이를 구할 수 있는 메서드가 정의되어 있다는 것을 알고 Poly를 이용해서 사각형 뿐만이 아닌 삼각형의 넓이도 구하려고 한다. 그런데 Poly에서는 삼각형과 사각형의 공식이 서로 틀려 어떻게 구현되어야 할지 감을 잡을 수가 없다. 그렇기 때문에 상속받는 자식에서 구현하라는 의미로 우리는 여기서 선언만 되어 있는 width를 선언하게 된것이다. 그리고 abstract라는 키워드가 메서드와 클래스의 앞에 각각 붙어져 있는 것을 확인할 수 있다.

  가장 중요한 것은 추상 클래스로부터 상속받는 클래스에서는 추상 메서드는 반드시 오버라이딩 시켜서 사용해야 한다는 것이다. 그럼 상속받은 삼각형과 사각형 클래스를 각각 정의해보자.

public class Tri extends Poly {

    public Tri(int garo, int sero) {

        this.garo=garo;

        this.sero=sero;

    }

    public void width(){

        float wid=garo*sero*0.5f;

        System.out.println("삼각형의 넓이 : " + wid);

    }

    public static void main(String[] args) {

        Tri tri = new Tri(20, 10);

        tri.width();

    }

}

public class Rect extends Poly {

    public Rect(int garo, int sero) {

        this.garo=garo;

        this.sero=sero;

    }

    public void width(){

        int wid=garo*sero;

        System.out.println("사각형의 넓이 : " + wid);

    }

    public static void main(String[] args) {

        Rect rect = new Rect(20, 10);

        rect.width();

    }

}



4. 인터페이스

  자바에서는 원칙적으로 다중 상속을 금하고 있다. extends 키워드로는 두 개 이상의 클래스로부터 상속받을 수 없다는 의미이다. 그러나 다중 상속을 꼭 해야하는 경우가 있다. 이럴때 사용할 수 있는 것이 인터페이스이다. 인터페이스는 추상메서드와 변수가 아닌 상수만을 소유할 수 있다. 인터페이스에서 변수를 선언하게 되면 상수화되기 때문에 상수 선언시 값초기화를 해주어야 한다. 또한 인터페이스로부터 상속받을 때는 extends 키워드가 아닌 implements 키워드를 사용한다. 역시 인터페이스에 있는 추상메서드도 반드시 오버라이딩 시켜야 하며, 추상 메서드라고 해서 abstract를 붙이지는 않는다.

public interface Poly {

    float PI=3.14f;

    public void width(int r);

}

public class Circle implements Poly {

    public void width(int r) {

        float wid = 3.14f * r * r;

        System.out.println("원의 넓이 : " + wid);

    }

    public static void main(String[] args) {

        Circle circle = new Circle();

        circle.width(10);

    }

}


Comments