풀스택 과정 day12_Java

2022.3.23.(수)


1. 객체 형변환

Unit u1 = army;
Unit u2 = navy;
Unit u3 = airforce;

u1.attack( );
u2.attack( );
u3.attack( );

// 부모 클래스가 가지고 있는 기능이 아니므로 에러
u1.tank( );
u2.nucleus( );
u3.bombing( );
-> 상속관계의 객체를 부모 형태로 변환하면, 클래스의 종류를 구분하지 않고
    일괄된 기능을 호출할 수 있다. 객체가 상위클래스의 형태로 형변환 되더라도
    Override된 자신의 기능을 잃지 않는다.
    
-> 하지만, 추가적으로 구현한 기능은 사용할 수 없게 되므로, 원래의 기능을
    다시 사용할 수 있는 방법이 필요해졌다.

1-1. 명시적 형변환

- 부모 클래스의 객체를 자식 클래스 형태로 변환하는 것

- 명시적 형변환을 위해서는 다음과 같이 변환할 클래스 이름을 명시적으로 지정해 주어야 한다.
ChildClass child = (ChildClass)parent;


< 부모 클래스에서 자식 클래스의 형태로 할당할 때 명시적 형변환이 필요하다. >

1-2. 명시적 형변화의 조건

- 객체가 최초로 생성될 때 자식 클래스 형태로 생성되고, 부모 형태로 암묵적 형변환이 된 상태를
  다시 원래의 자식 클래스 형태로 되돌릴 경우에만 가능해진다.
ChildClass child1 = new ChildClass( );
ParentClass parent = child1;		// 암묵적 형변환
ChildClass child2 = (ChildClass)parent;	// 명시적 형변환 
- 가능한 경우
Army army1 = new Army( );
Unit u = army1;
Army army2 = (Army)u;

- 가능한 경우
Unit u = new Navy( );
Navy navy = (Navy)u;	

- 불가능한 경우 : 최초 객체 생성이 부모 형태로 만들어진 경우 불가능하다.
Unit u = new Unit( );
Army army = (Army)u;

- 불가능한 경우 : 최초 생성된 것과 다른 형식으로 변환하는 것은 불가능하다.
Army army = new Army( );
Unit u = army;
Navy navy = (Navy)u;


< 부모 클래스 Unit >

< 자식 클래스 Army >

< 자식 클래스 Navy >

< 자식 클래스 AirForce >


< 객체의 고유 기능 사용과 암묵적 형변환 >

< 명시적 형변환을 사용한 객체 고유 기능의 사용 가능 >


2. 객체 배열

- 일반 데이터 타입의 배열과 동일한 개념으로, 같은 클래스의 객체 여러 개를
  그룹화 할 수 있다.

- 일반 데이터형의 배열 생성과 객체 배열 생성 비교
- 일반 데이터형의 배열
int[] data = new int[3];

 - 객체 배열의 경우
Army[] data = new Army[3]; 
- 각 경우에 대한 배열의 요소 할당 처리

	-> 일반 데이터형은 단순히 값을 대입하지만, 객체 배열은 'new'를
       사용하여 객체를 할당해야 한다.
- 일반 데이터형 배열의 경우
data[0] = 10;
data[1] = 20;
data[2] = 35;

- 객체 배열의 경우
Army a1 = new Army( );
data[0] = new Army( );
data[1] = new Army( );
data[2] = new Army( );

2-1. 정리

- 객체 형변환

	-> 같은 부모 클래스에서 파생된 서로 다른 자식 클래스의 객체들은
       부모 형태로 암묵적 형변환 되어 일관된 형식으로 사용 가능하다.

- 객체 배열

	-> 동일한 클래스의 객체는 배열로 묶어서 여러 개를 한 번에 제어할 수 있다.

2-2. 부모 클래스의 배열에 자식 클래스의 객체를 넣기

- 배열의 생성이 부모 클래스로 지정되었을 경우, 모든 자식 클래스의 객체들은
  그 배열에 포함될 수 있다.

Unit[] unit = new Unit[3];
// 배열의 요소 할당 과정에서 암묵적 형변환이 이루어진다.
unit[0] = new Army( );
unit[1] = new Navy( );
unit[2] = new AirForce( );

2-3. 원래의 기능으로 복귀하기

- 배열의 각 요소가 확장한 기능을 사용하기 위해서는 원래의 클래스 형태로
  명시적 형변환이 이루어져야 한다.

- 하지만 반복적으로 처리되는 과정에서 몇 번째 요소가 어떤 클래스에서 최초
  생성되었는지를 판단하기란 쉽지 않다.
 
- instanceof 연산자

	-> instanceof 연산자는 어떤 객체에 대한 출처를 판단하여 boolean형으로
	   결과를 반환한다.

if( units[0] instanceof Army ) {		// True of False
	Army temp1 = (Army)units[0];
	temp1.tank( );
}


< 객체 배열을 이용한 배열의 기능 사용과 명시적 형변환 >

< 출력값 >

좋은 웹페이지 즐겨찾기