JAVA

상속_메서드 오버라이딩

고민말고생각하는사람 2024. 1. 28. 18:37

상속을 통한 코드 재사용에 대해 계속해서 학습중이다.

public class SuperAnimal {

    int legCount;

    public void move() {
        System.out.println("동물은 움직입니다.");
    }

    public void eat() {
        System.out.println("먹습니다.");
    }

    public void breath() {
        System.out.println("동물은 숨도 쉬죠.");
    }
}

 

public class AnimalMain {
        public static void main(String[] args) {

            SubCheetah cheetah = new SubCheetah();	
            cheetah.eat();	// 먹습니다.
            cheetah.move();	// 동물은 움직입니다.
            cheetah.run();	// 치타는 달립니다.
            cheetah.breath(); // 동물은 숨도 쉬죠.
        }
    }

 

상속의 강점은 코드의 재사용에 있다고 했다.

동물은 움직인다.

그런데, 그냥 움직일까(move)?

거북이는 느리게, 토끼는 빠르게, 치타도 빠르게 움직인다.

이렇듯 같은 행동에 대해 다른 모양새를 띄게 될 때, 띄게 하고 싶을 때가 자연스럽게 발생하는데,

이러한 근심거리를 해결 해주는 것이 바로 '오버라이딩' 이다.

 

public class SubCheetah extends SuperAnimal {

    public void run() {
        System.out.println("달린다! 빠르다! 빠르게 달린다");
    }

    @Override
    public void move() {
        System.out.println("치타는 빠르게 움직입니다.");
    }
}

SuperAnimal 을 상속 받는 SubCheetah 에서 move() 를 정의하면 자연스럽게 SuperAnimal 의 move 내용이 덧씌워진다.

 

메서드를 오버라이드 한 후 재실행 해보면, 아래와 같아진다.

as is : cheetah.move();	// 동물은 움직입니다. 
to be : cheetah.move();	// 치타는 빠르게 움직입니다.

이(오버라이딩)를 통해 같은 동작에 대해 인스턴스별 개성을 살릴 수 있게 된다.

 

Override

중간에 @Override 라는 단어가 보일 것이다. @ 가 붙은 부분을 '애노테이션(Annotation)이라 한다.'

애노테이션은 주석과 비슷하지만 '프로그램이 읽을 수 있는 특별한 주석' 이다.

 

일반 주석은 개발자만 인식한다. 반면, 애노테이션은 '프로그램이 읽을 수 있다.' 

'읽을 수 있다' 는 것은 애노테이션에 의미가 담겨 있고, 프로그램은 그 의미를 해석할 수 있다는 뜻이다.

상세한 내용은 추후에 자세히 다뤄보기로 하자.

 

@Override 애노테이션은 해당 메서드가 '상위 클래스의 메서드를 오버라이드'하는 것임을 나타낸다.

컴파일러는 @Override 를 보고 메서드가 정확히 오버라이드 되었는지 확인한다. 

오버라이딩 조건을 만족시키지 않으면 컴파일러 에러가 발생한다.

 

 

따라서 실수로 오버라이딩을 못 하는 경우를 방지해준다.

@Override 는 안 붙여도 프로그램 동작상의 문제는 없어 필수는 아니고 '선택(옵션)' 이지만,

1. 오류를 빨리 발견할 수 있음.

2. 가독성 등의 측면에서 명확성이 좋아짐.

과 같은 장점이 있으므로 명시 해주도록 하자.

 

오버라이딩과 메모리 구조

 

1, 주소값을 통해 인스턴스에 접근.

2. 치타에 접근

3. 오버라이딩 된 move() 반환. 원하는 메서드를 찾아 반환했으므로, super 클래스를 굳이 참조하지 않음.

 

메서드 오버로딩(Overloading) ? 메서드 오버라이딩(Overriding)?

학습하던 중 오버 로딩, 오버 라이딩 이란 단어를 계속해서 보고 있다.

슬슬 헷갈리지 않나? 정리 해보자.

 

메서드 오버로딩

매개변수가 다른 메서드를 여러 개 정의 하는 것.

ㄴ 메서드 이름이 같아야 함.

ㄴ loading 은 과적. 물건을 쌓는다는 의미

ㄴ 칸마다 기능이 다른 기차를 생각하면 편함

 

YH 특급열차

머리 침실 짐칸 머리

 

필요에 의해(인기가 너무 좋아져서)  칸(파라미터)를 늘림.

 

YH 특급열차

머리 식당칸 침실 예체능실 영화관 객실 머리

 

 

메서드 오버로딩

하위 클래스에서 상위 클래스의 메서드를 재정의 하는 과정. 상속 관계에서 사용됨.

ㄴ 뭔가 얹어서 덮어씌운는 것.

ㄴ 위에서 내려다 본 케익 생각하면 편함.

ㄴ 시작은 초코 케잌으로 시작했으나, 끝은 딸기케잌 일지니!!

 

내용이 섞이기 시작한 느낌이 든다.

쪼개 보자.