오늘은 약간 힘들기 때문에 뇌를 약간 뺀 상태에서 공부기록을 해보겠다~!
공부기록 10일차
와 상위클래스 재정의하기 메서드 오버라이딩보다 쉽다!(같은 말 주의)
상위클래스에서 이미 정의된 메서드가 하위클래스에서 구현할 내용과 맞지 않다면 이를 재정의해 사용할 수 있다.
단, 메서드 오버라이딩을 하기 위해선 반환형
메서드 이름
매개변수 개수
매개변수 자료형
이 반드시 같아야 한다.
기억하자!
반환형!
메서드 이름!
매개변수 개수!
매개변수 자료형!
잊지말자 매개변수는 전달된 인자를 받아들이는 변수이다.
(인자는 어떤 함수 호출시 전달되는 값)
①직접 쓰기
먼저 @Override
라고 써준뒤 재정의할 코드를 써주면 된다.
(O만 대문자라는 것을 유의하자)
②이클립스 기능 쓰기.
set메서드와 get메서드를 이클립스 기능으로 썼던 것 처럼 오른쪽 마우스 → Souce → Override/Implement Methods...를 누르고 Override로 재정의할 메서드를 선택하고 ok를 누르면 된다.
이때 @Override
애노테이션은 '이 메서드는 재정의된 메서드입니다.' 라고 컴파일러에 알려주는 역할을 한다.
✍잠깐 메모
애노테이션(Annotation)은 주석이라는 뜻으로 컴파일러에게 특정한 정보를 제공해 주는 역할을 한다.
표준적으로 사용되는 애노테이션은 다음과 같다.
애노테이션 | 설명 |
---|---|
@Override | 재정의된 메서드라는 정보 제공 |
@Fuctionallnterface | 함수형 인터페이스라는 정보 제공 |
@Deprecated | 이후 버전에서 사용되지 않을 수 있는 변수, 메서드에 사용됨 |
@SuppressWarnings | 특정 경고가 나타나지 않도록 함 |
멤버변수와 메서드는 선언한 클래스형에 따라 호출된다. 그럼 상위클래스의 메서드가 호출될까 하위클래스의 메서드가 출력될까?
상속에서 상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정된다. 다시말해 선언한 클래스형이 아닌 생성된 인스턴스의 메서드가 호출되는 기술을 '가상 메서드'라고 한다.
자바의 클래스는 멤버변수와 메서드로 이루어져 있다.
다음 순서를 보자.
클래스 생성
→인스턴스 만들어짐 (멤버변수)
=힙메모리에 위치
그렇다면 메서드는?
멤버변수와 메서드는 사용하는 메모리가 다르다. 변수는 인스턴스가 생성될때 마다 새로 생성되지만, 메서드는 실행해야 할 명령 집합이기 때문에 인스턴스가 달라도 같은 로직을 수행한다.
즉, 같은 객체의 인스턴스를 여러 개 생성한다고 해서 메서드도 여러 개 생성되지 않는다.
간단한 예를 들어보자.
출력값은
aaa()출력
aaa()출력
이 나오게 된다.
위 코드가 실행되는 메모리의 상태를 나타내어 보면 다음과 같다.
main()함수가 실행되면 지역 변수는 스택 메모리에 위치한다. 그리고 각 참조변수가 가리키는 인스턴스는 힙 메모리에 생성된다.
여기까지는 배웠던 내용이다.
그리고 메서드의 명령집합은 메서드 영역(코드 영역)에 위치한다. 우리가 메서드를 호출하면 메서드 영역의 주소를 참조하여 명령이 실행된다. 주소를 링크라고 생각하면 이해하기 쉽다.
따라서 인스턴스가 달라도 동일한 메서드가 호출된다.
일반적으로 프로그램에서 메서드를 호출한다는 것은 그 메서드의 명령 집합이 있는 메모리 위치를 참조하여 명령을 실행하는 것이다. 그런데 가상 메서드의 경우에는 '가상 메서드 테이블'이 만들어 진다. 가상 메서드 테이블은 각 메서드 이름과 실제 메모리 주소가 짝을 이루고 있다.
어떤 메서드가 호출되면 이 테이블에서 주소 값을 찾아서 해당 메서드의 명령을 수행한다.
다음은 Customer클래스와 VIPCustomer클래스로 만든 가상 메서드 테이블이다.
그림에서 보듯이 calcPrice()메서드는 두 클래스에서 서로 다른 메서드 주소를 가지고 있다.
이렇게 재정의된 메서드는 실제 인스턴스에 해당하는 메서드가 호출된다.
(재정의된 메서드의 경우 클래스 이름으로 호출된 해당 메서드가 호출된다는 뜻인 것 같다. 이부분은 아직 이해가 되지 않아 다른 강의를 보며 더 공부하여 추가할 예정)
재정의되지 않은 메서드인 경우 메서드 주소가 같고 상위클래스 메서드가 호출된다.
정리하자면 상위클래스에서 선언한 메서드가 있고 이를 하위 클래스에서 재정의한 상태에서 하위 클래스 인스턴스(vc)가 상위 클래스로 변환되었다.
이때vc()메서드가 호출되면, vc변수를 선언할 때 사용한 자료형의 메서드가 호출되는 것이 아니라 생성된 인스턴스의 메서드가 호출되는 것이다.
이름 가상메서드라고 하고 자바의 모든 메서드는 가상 메서드이다.