java 기본 유형의 데이터들 처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어진다.
서로 다른 클래스 유형으로부터 나은 참조변수들 간의 대입에는 일정한 규칙이 있다.
Parent parent = new Child
왼쪽 항 (parent)과 오른쪽 항(Chile)의 객체 유형이 서로 다른경우. 두 우형이 서로 상속관계에 있고
왼쪽 객체(parent)가 오른쪽 객체(child)의 상위 클래스인 경우에만 암묵정인 형 변환이 일어난다
하위 클래스에서 상위클래스 유형으로 할당하는 것은 가능하나. 그 반대의 경우에는 명시적 형 변환을 해야한다.
->그러나 상위 클래스 유형을 하위 클래스 유형으로 강제 형 변환하는 경우에는 할당되는 객체의 유형에
따라서 실행 오류가 발생할 수 있다.
<그림 >
A a3 = new C();
A a4 = new Y();
B b1 = new C();
C c = new C ();
B b2 = c ;
Y y = new y();
X x2 = new B();

상속관계의 객체를 부모 형ㅇ태로 변경하면 클래스의 종류를 구분하지 않고 일관된 기능을 호출 할수있고
객체가 상위 클래스형태로 형변환 되더라고 Override 된 자신의 기능은 잃지 않는다
하지만, 추가적으로 구현한 기능은 사용할 수 없게 되므로 원래의 기능을 다시 사용할 수 있는 방법이 필요해 졌다
Unit u1 = new army();
Unit u2 = new naby();
Unit u3 = new airforce();
u1.attack();
u2.attack();
u3.attack();
부모클래스의 객체를 자식 클래스 형태로 변환하는것
형변환을 위해서는 다음과 같이 형변환할 클래스 이름을 명시적으로 지정해 주어야 한다.
ChildClass c =(ChildClass)parent
객체가 최초 생성될 때 자식 클래스 형태로 생성되고 부모 형태로 암묵적 형변환이 된 상태로 다시 원래의
자식 클래스 형태로 되돌릴 경우에만 가능하다
ChildClass c1 = new ChildClass()
parentClass p = c1;
ChildClass c2 = (ChildClass)p
Army army1 = new Army()
Unit u = army1; /// 2줄이 1한줄
Army army2 = (Army)u;
Unit u = new Navy(); /// 2줄이 1한줄
Navy navy =(naby)u;
- 불가능 : 최초 객체 생성이 부모형태로 만들어진 경우는 불가능 하다.
Unit u = new Unit() ;
Army army = (Army)u;
- 불가능 : 최초 생성된 것과 다른 형식으로 변환하는 것은 불가능하다.
Army army = new Army();
Unit u = army;
Navy navy = (Navy)u;
일반 데이터 타입의 배열과 동일한 개념으로, 같은 클래스의 객체 여러개를 그룹화 할수 있다
일반 데이터형의 배열 생성과 객체 배열 생성 비교
일반 데이터형 배열
int[] data =new int[3];
객체배열
Army[] data = new Army[3];
각 경우에 대한 배열의 요소 할당처리
-> 일반 데이터형은 단순히 값을 대입하지만,
객체배열은 'new'를 사용하여 객체를 할당해야 한다
- 일반 데이텨형 배열
data[0] = 1;
data[1] = 2;
data[2] = 3;
- 객체 배열의 경우
data[0] = new Army();
data[1] = new Army();
data[2] = new Army();
객체 형변환
-> 같은 부모 클래스에서 파생된 서로 다른 자식 클래스의 객체들은 부모 형태로
암묵적 형변환 되어 일관된 형식으로 사용 가능하다
객체 배열
-> 동일한 클래스의 객체는 배열로 묶어서 여러개를 한꺼번에 제어할 수 있다.
// 배열의 요소 할당 과정에서 암묵적 형변환이 이루어진다.
Unit[] unit = new Unit[3];
Unit[0] = new Army();
Unit[1] = new Naby();
Unit[2] = new AirFoece();
일괄 처리가 가능하다
-> 서로 다른 객체를 부모 형태의 배열에 담게 되면, 반복문으로 일괄처리가 가능하다
-> 이 때 배열의 각 요소를 통해 사용하는 메서드가 Override되어 있을경우, 부모의 메서드가
아니라 자신이 재정한 기능을 뜻한다.
for( int i=0; i<unit.length; i++) {
unit[i].attack();
}
원래의 기능으로 복귀하기
-> 배열의 각 요소가 확장한 기능을 사용하기 위해서는 원래의 클래스 형태로 명시적 형변환이
이루어 져야 한다
-> 하지만 반복적으로 처리되는 과정에서 몇 번째 요소가 어떤 클래스에서 최초 생성 되었는지
판단하기란 쉽지 않다
intaceof 연산자
-> intaceof연산자는 어던 객체에 대한 출처를 판단하여 boolean형으로 결과를 반환한다
if( Unit[0] instanceof Army){
Army temp = (Army)unit[0];
}
추상 메서드를 정의하기 위해서는 'abstract'키워드를 사용하여 메서드를 정의한다
추상 메서드는 자식 클래스가 구현해야 하는 메서드의 가이드라인만 제시하기 위한 목적으로
사용되기 때문에, 선언만 가능하고 구현부가 없다
public abstract void sayHello();
//추상 클래스의 정의
public abstract class Hello{
public abstract void sayHello();
}

-추상클래스
-> 멤버변수, 생성자, 메서드, 추상메서드를 포함할 수 있다
-> 이 클래스를 상속받는 자식 클래스는 다른 클래스를 상속받을 수 없다
-> 객체의 생성이 불가능
-인터페이스
-> 객체의 생성이 불가능
-> 추상 메서드만 포함할 수 있다
->인터페이스는 다중 상속이 가능하다
