자바 프로그래밍 입문#10

파핑·2022년 5월 10일
0

JAVA PROGRAMMING

목록 보기
12/12
post-thumbnail

오늘은 약간 힘들기 때문에 뇌를 약간 뺀 상태에서 공부기록을 해보겠다~!
공부기록 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변수를 선언할 때 사용한 자료형의 메서드가 호출되는 것이 아니라 생성된 인스턴스의 메서드가 호출되는 것이다.

이름 가상메서드라고 하고 자바의 모든 메서드는 가상 메서드이다.

profile
html/css공부 중(JAVA잠시 접어두는 중)

0개의 댓글