티스토리 뷰

 

이 콘텐츠는 아래와 같은 사전 지식이 필요합니다.

 

  • 상속

 

이 콘텐츠는 아래와 같은 내용을 담고 있습니다.

 

  • 오버 라이딩이란
  • 오버 로딩이란
  • 실전 예제

 


 

이 콘텐츠는 다음과 같은 포스팅과 연관이 있습니다. 참조하십시오.

 

  •  상속에 대한 포스팅 https://j-sik.tistory.com/27?category=958167

 


  두 단어를 정리하기 위해, 상속관계에 있는 클래스 2개를 미리 정의하겠다. 나는 요즘 Pop cat에 빠져있으므로 고양이 클래스로 아래와 같은 두 클래스를 정의했다.

 

public class ParentCat {

    private int age ;
    
    public ParentCat(){
        this(10);
    }

    public ParentCat(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println("엄마냥 밥이다아아옹");
    }

    protected void hit(){
        System.out.println("냥냥 펀치");
    }

    private void careMyKids(){
        System.out.println("아기냥을 챙긴다.");
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

 

public class ChildCat extends ParentCat{

    private String sound ;

    public ChildCat() {
        this(1,"으냐아아ㅏ아아아옹!");
    }

    public ChildCat(int age, String sound) {
        super(age);
        this.sound = sound;
    }



    public void shouting(){
        System.out.println("소리친다 - " + sound);

    }
}

 Overriding

 '우선하다'라는 의미를 갖고 있는 오버 라이딩은 상속관계에서 메서드가 재정의 됨을 말한다. 부모가 정의한 메서드의 내용을 자식이 자신에게 맞게 재정의하여 쓰게 된다는 것이다. ParentCat을 상속받은 ChildCat이 먹는다는 행동을 상속받아한다고 하자. 그런데 eat() 메서드는 엄마 냥이 먹는 행위가 기재되어있다. 본인이 먹는다라는 행동으로 바꾸기 위해서는 이미 있던 eat()이라는 메서드를 수정(재정의)해야 한다. 그래서 ChildCat은 eat() 행위를 수정(재정의)했다.

 

 

public class ChildCat extends ParentCat{
	
    //...생략

    @Override
    public void eat() {
        System.out.println("아기냥이 먹는다");
    }

	//...생략
}

 

두 클래스를 생성한 뒤 먹는 행위를 지켜보자.

public class CatSimulator {

    public static void main(String[] args) {
        ParentCat pCat = new ParentCat();
        ChildCat cCat = new ChildCat();

        pCat.eat();
        cCat.eat();

    }
}

결과는 아래와 같다.

 

메서드 오버라이딩

 분명 같은 eat()이라는 메서드를 사용하고 있지만, 다르다. ChildCat에 입장에서 본다면, 부모의 eat()을 재정의 했기 때문에 eat()을 호출했을 때, 재정의한 메서드가 '우선' 되기 때문이다.

 

 

c.f)

더보기

 오버 라이딩이 같은 특징 중 하나는 부모 클래스의 변수에 자식 클래스 인스턴스로 타입 캐스팅되어도, 여전히 오버 라이딩된 메서드를 가져온다. 

 

 

public class CatSimulator {

    public static void main(String[] args) {
  


        //부모 클래스 변수를 자식 고양이 인스턴스와 매핑 
        ParentCat pretendingMotherCat = new ChildCat();
        //eat 호출 
        pretendingMotherCat.eat();

    }
}

 

출력 결과 오버라이드 된 ChildCat의 메서드가 호출된다. 자식의 메서드가 '우선되기(Override)' 때문이다.

오버 라이딩은 상속을 받은 메서드를 재정의 하는 것이므로, 반드시 상속관계에서 일어난 다는 것을 기억해야 한다.

 

 

 

Overloading

 오버 로딩은 그 의미 자체로 '과적하다'라는 뜻을 지니고 있다. 메서드의 반환 타입이 같지만, 인자 값(Parameter)이 다른 경우에도 같은 이름을 사용하여 메서드를 호출 할 수 있는 것을 오버 로딩이라 한다. 이를 통해 이름은 갖지만 다른 기능을 할 수 있다. 같은 이름에 여러 기능을 '과적'한다는 의미로 보면 좋을 것 같다. 오버 라이딩과는 다르게 상속관계에서 발생하는 일이 아니다. 특정 케이스에 발생할 수 있지만, 대체로 같은 메서드지만, 다른 인자 값과 기능이 핵심이다.

 

public class ChildCat extends ParentCat{
	//.... 생략
    @Override
    public void eat() {
        System.out.println("아기냥이 먹는다");
    }

    public void eat(String something){
        System.out.println("아기냥이가 " +something+"을/를 먹었다!");
    }

}

ChildCat 클래스에 다음과 같은 메소드를 추가한 뒤 main에서 불러보겠다.

오버로딩의 예

위의 스크린숏과 같이 eat이라는 이름이 같은 메서드지만 인자 값이 다르다. 이 두 메서드는 이름만 같을 뿐 행동이 전혀 다르다. 두 메서드를 모두 호출해본 결과 다음과 같다.

돼지 아기냥

 

 

오버 라이딩과 오버 로딩 모두 기능을 확장하여 쓸 수 있게 하므로 다형성과 관련된 주된 개념이니 꼭 숙지하자.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함