1. 메소드 오버라이딩이란?
상속 관계에 있는 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것 1. 메서드 이름, 매개변수 타입 및 개수, 반환 타입은 동일해야함. 2. 접근 제어자는 부모 클래스의 메서드와 동일하거나 더 넓은 범위로 변경 가능. 3. 예외 처리는 부모 클래스의 메서드와 동일하거나 더 좁은 범위로 변경 가능.
1. 멍멍이라고 출력되는 걸, 야옹으로 바꾸고 싶다.
고양이 객체를 생성했는데 멍멍이라고 출력된다. > 멍멍이 마음에 들지 않으니 재정의 하자!!
2. art + insert > 오버라이드 메소드 생성
나온 것 확인. 근데 super.speak() > 생성자가 가리키는건 부모클래스의 speak니까 멍멍은 그대로 나온다
3. 메소드 오버라이딩이란?
이렇게 메소드 오버라이딩을 하면 부모 메소드를 무효화 시켜버린다!! 출력에 멍멍은 사라지고 없음
4. 동적 바인딩이란?
자식 클래스가 들고있는 speak 메소드를 실행시킨다. > 야옹이 출력되는 것 확인!
이때!! 부모 클래스의 메소드 이름과 자식 클래스의 메소드 이름이 같아야한다.
(Animal의 speak 메소드 = Cat의 speak 메소드)
5. 다형성이란?
참조변수형을 Animal로 바꿔도 제대로 실행 됨! > heap에 Cat과 Animal이 같이 뜬다.
<표로 설명>
c1 참조변수는 참조변수 타입을 Animal로 하느냐, Cat으로 하느냐에 따라서 타입이 달라진다. 이게 바로 다형성! 다만, Animal은 부모 클래스가 없고, Cat은 Animal이라는 부모 클래스가 있기 때문에 생성자를 new Animal로 하면 부모가 없어서 같이 뜨지 않고, 생성자를 new cat으로 해야만 heap에 둘이 같이 붙어서 뜬다! (Animal, Cat 둘 다 사용 가능)
실행은 Animal의 멍멍이 됐는데, 정작 나오는건 Cat의 야옹으로 바뀌어서 나온다.
Animal의 speak는 Cat의 speak에게 가능 통로인 셈!
오버라이드 - 기각시키다, 무효화하다. > 부모가… 자식에게,, 양보한 것
상속을 했을 때, 객체를 여러 가지 타입으로 사용할 수 있음
(타입을 둘 중 하나를 선택할 수 있음)
<형태>
Animal c1 = new Cat(); > Animal, Cat 2개 붙어서 뜸 : (Animal클래스와 Cat클래스의 모든 메서드와 속성을 사용할 수 있음) Cat c1 = new Cat(); > Cat만 힙에 뜸 : (Cat클래스의 모든 메서드와 속성을 사용할 수 있음) Animal c1 = new Animal(); > Animal만 힙에 뜸 : (Animal클래스의 모든 메서드와 속성을 사용할 수 있음)
메서드의 이름이 동일해야지만 재정의라고 함
2. 메소드 오버라이딩을 사용하는 이유
재정의는 주목적이 아니다. speak를 speak2로 이름만 바꿔서 c1.speak2로 호출해도 되기 때문. 진짜 목적은 동적바인딩을 하기 위해서!
3. 용어 정리
펼쳐보기
3-1. 다형성
내가 부를 수 있는 이름이 많아짐, 다양하게 부를 수 있음 = 다형성 참조 변수형 타입이 2가지가 있으니까, 그걸 내가 원하는 걸로 바꿀 수 있다 = 다형성 ex) 너 고양이야? ㅇㅇ / 너 동물이야? ㅇㅇ / 너 털 달린 무언가야? ㅇㅇ 3가지로 부를 수 있네 = 다형성
3-2. 재정의
멍멍이 마음에 안들어서 동일한 메소드 이름을 만들어 그 내용만 야옹으로 바꾸는 것
3-3. 오버라이딩
자식과 부모 클래스가 이름과 타입, 파라미터가 동일한 메소드를 들고 있을 때, 부모 클래스가 가지고 있는 메소드를 무효화 하는 것.
3-4. 동적바인딩
자식이 들고 있는 메소드를 실행!
4. 정적 메소드를 오버라이드하면?
static 있는 메소드
package test; class Animal { public static void Ask() { System.out.println("static method in Animal"); } } public class Dog extends Animal { public static void Ask() { System.out.println("static method in Dog"); } public static void main(String[] args) { Dog dog = new Dog(); //new 띄움 Animal a = dog; // a에 dog 주소값을 대입 (객체 저장) a.Ask(); dog.Ask(); } }
어떤 참조변수를 통하여 호출되는지에 따라 결과가 다르다. Dog 로 호출하면 자식 클래스의 정적 메소드가 출력 Animal로 호출하면 부모 클래스의 정적 메소드가 출력 > static이 아니었으면 원래대로 자식 클래스의 메소드가 호출 됨.
static은 상속되지 않는다!
5. Object
모든 객체는 object 클래스를 상속받는다. Object 타입을 사용하면 자바에서 생성되는 모든 객체를 전부 전달받을 수 있는 메소드가 됨 ex) public static void print (Object ruru) { }
Share article