풀스택 과정 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( );
}
< 객체 배열을 이용한 배열의 기능 사용과 명시적 형변환 >
< 출력값 >
Author And Source
이 문제에 관하여(풀스택 과정 day12_Java), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@doby98/풀스택-과정-day12Java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)