JAVA 그게 뭐야? 13. 상속2
전편 상속에서 이어지는 내용이다:)
https://turtlemoon.tistory.com/13
JAVA 그게 뭐야? 12. 변수와 상속1
1. 변수 변수의 종류 - 지역변수(Local Variable) : 메소드 영역에 선언된 변수 - 인스턴스 변수(Instance Variable) : 클래스 영역 = 메소드 외부에 선언된 변수 - 클래스 변수(Class Variable) : static이 붙은..
turtlemoon.tistory.com
클래스 배열(참조 변수 배열)
객체를 여러 개 선언해야 하는 경우 배열 타입으로 한 번에 선언 후 사용
각 객체들은 규칙성이 없기 때문에 규칙성을 부여하기 위해서 사용한다.
클래스 배열 선언
Car myCar = new Car();
Car momCar = new Car();
Car dadCar = new Car();
- 선언방법1
Car[] carArr = new Car[3]
carArr[0] = new Car;
carArr[1] = new Car;
carArr[2] = new Car;
클래스명[] 배열명(참조변수) = new 클래스명[칸 수]
클래스명[index] = new 생성자();
- 선언방법2
Car[] carArr = {new Car(), new Car(), new Car()};
클래스명[] 배열명(참조변수) = {new 생성자(), new 생성자(), ...};
(이렇게 주로 사용할 예정)
클래스 배열 사용
배열의 각 칸이 하나의 객체이다.
carArr[0].color;
carArr[0].keyOn();
배열명[index].변수;
배열명[index].메소드();
그림 설명🌹
Casting(다형성)
부모 타입의 참조변수로 자식 타입의 객체를 다루는 것
하나의 객체가 여러 가지 타입을 가질 수 있다.
캐스팅을 할 경우 사용할 수 있는 "멤버의 개수"가 달라진다.
부모와 자식 관계만 서로 형변환이 가능하다.(모든 자식 객체는 부모 타입이기 때문에 형변환 가능)
// 기본
Monkey mk = new Monkey();
// 상속 관계일 경우 참조변수의 타입과 객체의 타입이 불일치 해도 ok
Monkey hummon = new Human();
- 업캐스팅(up Casting)
부모 타입의 참조 변수로 자식 타입의 객체를 다루는 것(자식 > 부모)
필드의 사용범위가 부모 타입만큼 제한되기 때문에 자식 타입에서 추가된 내용을 사용할 수 없다.
부모클래스 참조변수(객체명) = new 자식생성자();
참조변수.부모필드
// Car 부모 클래스, SuperCar 자식 클래스
Car myCar = new SuperCar();
*** 자식 타입의 참조 변수로 부모 타입의 객체를 가리킬 수 없다. ***
ex. SuperCar myCar = new Car(); // error
사설. 즉, 부모 타입의 참조 변수는 자식 타입의 필드보다 무조건 작거나 같기 때문에 자식 타입의 필드에 들어갈 수 있지만, 부모 타입의 필드는 자식 타입의 필드보다 작거나 같기 때문에 자식 타입의 참조변수를 받아들일 수 없다.
큰 물그릇에는 작은 물그릇에 퍼올린 물을 담을 수 있지만 작은 물그릇에는 큰 물그릇에서 퍼올린 물을 다 담을 수 없는 걸 생각하면 되지 않을까...
- 다운캐스팅(down Casting)
업캐스팅된 객체(부모타입의 참조변수)를 다시 자식타입으로 바꾸는 기법(부모 > 자식)
다운캐스팅 시 다시 자식클래스의 필드를 사용할 수 있게 된다.
자식클래스 참조변수(객체명) = (자식클래스)업캐스팅 객체
참조변수.자식필드
- 형변환 시 중요 point!
만든 인스턴스(객체)가 무엇인지 중요!!! 실제 인스턴스의 멤버 개수를 넘어서는 안된다.
- Casting을 사용하는 이유?
여러 개의 자식 객체를 한 번에 관리해야할 때가 있다.
여러 자식 객체를 전달받기 위해서는 부모 타입의 저장공간으로 받아야 한다.
그래서 업캐스팅을 통해 서로 다른 타입의 자식 객체들을 부모타입으로 만들어 하나의 객체(부모 타입)에 받을 수 있게 한다.
> 그럼 부모클래스가 여러 자식 클래스들을 관리할 수 있게 된다.
> 그렇지 않으면 여러 자식들이 각자 객체를 생성하여 객체마다 필드를 사용하기 때문에 관리가 어려워짐
그림 설명🌹
instance of
객체 간 타입을 비교해 참조변수의 형변환이 가능한지 확인
객체 instance of 클래스명 : 객체가 뒤에 오는 클래스의 타입인지 비교
만약 객체가 해당 클래스 타입이라면 true, 아니라면 false 반환
부모객체 instanceof 부모클래스 : true
자식객체 instanceof 자식클래스 : true
부모객체 instanceof 자식클래스 : false
자식객체 instanceof 부모클래스 : true
업캐스팅된 객체 instanceof 부모클래스 : true
예제