이론/자바 풀스택 국비수업

220323 객체형변환2, 객체배열

달거북씨 2022. 3. 28. 22:20

흐엑... 정리가 밀렸당...

자바 프로젝트에 정신이 팔려서 수업 정리를 소홀히 했는데,

그랬다간 프로젝트 기간(2주) 동안 한도 끝도 없이 미뤄질 것 같아 우선 정리부터 해야겠다. 

참고로 달거북씨의 자바 프로젝트 주제는 '방탈출 게임'이다.

이것저것 많이 조사하며 방황했는데, 이미 수업 끝내고 취직준비 중인 친구님 왈,

어차피 앞으로 있을 프로젝트는 계속 웹페이지 만드는 거라고 하고 싶은 거 하라고 해서 게임을 만들어 보기로 했다.  

+

시험공부한다고 늦게 잤다가 지각하고,

프로젝트 조금만 더 해야지 하다가 밤 샜다가 지각하고 지난 한 주가 아주 난리법석이었다.

때문에 장기적인 안목으로 생활패턴을 바꾸기로 했다.

일찍 자고 일찍 일어나기로... 핳

새벽까지 공포라디오 들으면서 코딩하고 수업 정리하는 게 낙이었지마나 할 수 없지ㅠ

 

- 하고는 오늘 밤샘. 핳

지난 주중에 제대로 못 잔 거 주말에 몰아 잤더니 잠이 오질 않았다. 나는 세 시간 넘게 노력했어.

 


 

1. 객체형변환

그림 상에는 없지만, 각 자식클래스 별로 tank(), nucleus(), bumbing()이라는 메소드를 가지고 있다.

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

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

// 부모클래스(Unit)가 지니고 있는 기능이 아니므로 에러
u1.tank();
u2.nucleus();
u3.bumbing();

→ 상속관계의 객체를 부모 형태로 변환하면, 클래스의 종류를 구분하지 않고 일괄된 기능을 호출할 수 있다. 객체가 상위클래스의 형태로 형변환 되더라도 Overeride된 자신의 기능은 잃지 않는다.

→ 하지만 추가적으로 구현한 기능은 사용할 수 없게 되므로, 원래의 기능을 다시 사용할 수 있는 방법이 필요해졌다.

 

1-1. 명시적 형변환

  • 부모 클래스의 객체를 자식 클래스 형태로 변환하는 것
  • 형변환을 위해서는 다음과 같이 변환할 클래스 이름을 명시적으로 지정해 주어야 한다.
ChildClass child1 = new ChildClass();
ParentClass parent = child1;		// 암묵적 형변환
ChildClass child2 = (ChildClass)parent;	// 명시적 형변환

 

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 AirForse();

▶ 형태만 배열이 되었을 뿐 업캐스팅과 동일한 기능

 

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

  • 배열의 각 요소가 확장한 기능을 사용하기 위해서는 원래의 클래스 형태로 명시적 형변환이 이루어져야 한다.
  • 하지만 반복적으로 처리되는 과정에서 몇 번째 요소가 어떤 클래스에서 최초 생성되었는지를 판단하기란 쉽지 않다.
  • instanceof 연산자
    → instanceof 연산자는 어떤 객체에 대한 출처를 판단하여 boolean형으로 결과를 반환한다.
if(units[0] instanceof Army){
	Army temp1 = (Army)units[0];
	temp1.tank();
}

 


2022.03.06 - [이론/자바 기초] - JAVA 그게 뭐야? 13. 상속2

 

JAVA 그게 뭐야? 13. 상속2

전편 상속에서 이어지는 내용이다:) https://turtlemoon.tistory.com/13 JAVA 그게 뭐야? 12. 변수와 상속1 1. 변수 변수의 종류 - 지역변수(Local Variable) : 메소드 영역에 선언된 변수 - 인스턴스 변수(Instan..

turtlemoon.tistory.com

▶ 명시적 형변환은 다운캐스팅 부분 참고!

instanceof 내용도 있음!


 

▶ 아래 예제의 부모 클래스와 자식 클래스는 상속에서 했던 그대로 가지고 옴

부모클래스
자식클래스
자식클래스
자식클래스
암묵적형변환(업캐스팅)
명시적형변환(다운캐스팅)
객체배열

 

728x90