본문 바로가기
Java (국비)/Java 이론

클래스에서의 타입 변환

by Hwanii_ 2023. 5. 16.
728x90

 

조상 클래스
자손 클래스
main

피카츄 객체 2개를 비교해서 같으면 알을 획득 하고,

다르면 알을 못얻는 상황일 때,

 

기존에 equals 메서드는 String 타입을 비교할 때 사용했었다.

String은 기본형 타입이 아니라, 참조형 타입이기 때문에

즉, equals 메서드는 주소를 비교한다.

 

참고로, (비교)연산자 (==) 의 대상은 객체가 될 수 없다.

 

암튼, 참조변수 pika1과 참조변수 pika2는 주소값이 서로 다르므로

절대로 같다는 결과를 얻을 수 없게 된다.

 

같지 않음.

 

그런데, 서로 다른 객체지만 객체가 가지고 있는 인스턴스 변수인 이름이

서로 같으면 알을 획득 하는 것을 요구 했다.

즉, 피카츄 이름이 같으면, 알을 얻는것 이다.

 

여기서 이러한 생각을 해볼 수 있다.

상위 클래스의 메서드를 유사한 기능으로 내 입맛대로 사용하고 싶다.

=> 오버라이딩 이다.

즉, 메서드를 하위 클래스 에서 재정의 하는것이다.

 

equals 메서드는 어디 클래스에서 나온것인데 이런 메서드가 보이는걸까 ?

이클립스에서 확인 할 수 있다.

어쩌구저쩌구 나오는데, 자세히 보면 Object.equals(Object obj) 라는것을 볼 수 있다.

 

개념 : 

★★★ object 클래스 ★★★

JAVA 에서 기본 제공 해주는 최상위 클래스

 

만약에, A라는 클래스를 만들었는데, 그 안에 어떤 멤버변수나 어떤 메서드도

존재 하지 않는다고 가정 해보자.

이때, A라는 클래스로 객체를 만들었을 때 참조변수를 aaa 라고 한다면,

aaa. 이라고 코드를 치면 이것 저것 사용할 수 있는것들을

이클립스에서 확인할 수 있다.

그 메서드들이 바로 최상위 클래스인 object에서 상속을 받는 메서드 라고 보면 된다.

 

정리하자면, 최상위 클래스인 object 에 있는 equals 메서드를 

하위 클래스인 Pokemon 에서 오버라이딩을 해서 기능을 바꾸는 작업을 하면 된다.

 

우선 오버라이딩을 하기 위해서는 메서드의 시그니쳐가 같아야 한다.

즉, 인자의 개수, 아웃풋의 개수, 타입까지도 모두 같아야 한다.

 

근데, equals() 메서드의 시그니쳐가 뭔지 알면 좋지만, 알지 못한다면 ?

 

이클립스 화면에서 마우스 우클릭 - Source - Override Methods 클릭 -

그림과 같이 equals(Object) 클릭 - OK 

를 누르면 자동으로 해당 메서드가 생성 된다.

 

리턴값은 boolean 타입 이였다.

해서, 위와 같이 equals 메서드를 재정의 했다.

 

1. @Override : 어노테이션 (Annotation) - 프로그램이 인지하는 주석.

 

참고 : (Object obj) 는 equals가 비교할 대상을 의미 한다.

 

2. Object 타입의 변수 obj는 최상위 클래스 이기 때문에

Pokemon 클래스에서 사용하는 상황이므로, Pokemon 타입으로

강제형변환을 해줘야 한다. == 명시적 형변환

이때 일어나는 상황을 보고 다운 캐스팅 이라고 하며,

즉, 넓은 범위에서 좁은 범위로 캐스팅이 되는것 이다.

 

3. 정리 :

Object 타입의 변수 obj 앞에 (Pokemon) 을 붙혀 강제형변환

그리고, Pokemon 타입의 변수 pokemon에 

강제형변환 된 obj 변수를 저장하여 사용 한다.

 

4. 재정의된 메서드의 기능 : 

만약 부모 클래스인 Pokemon의 this.name 이랑

부모 클래스인 Pokemon의 pokemon.name 이랑

같으면 ?

리턴값 true

다르면 ?

리턴값 false

Pokemon.equals로 오버라이딩이 된것을 확인 할 수 있다.

 

결과 : 

객체 pika1의 이름 피카츄와

객체 pika2의 이름 피카츄와

같기 때문에

 

 

 

 

4번 내용 복습

반응형

'Java (국비) > Java 이론' 카테고리의 다른 글

추상 클래스 와 추상 메서드  (0) 2023.05.17
(접근)제어자 private 과 getter,setter  (0) 2023.05.17
상속 4  (0) 2023.05.15
상속 3  (0) 2023.05.15
상속 2  (0) 2023.05.15