객체 형변환

  • 객체 형변환이란?
    java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어진다.
    서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는 일정한 규칙이 있다.
        Parent parent = new child(); 이렇게 오른쪽에 자식이 놓이면 암묵적 형변환이 일어난다.

위의 대입 연산에서 왼쪽항(parent)와 오른쪽항(child)의 객체 유형이 서로 다른경우,
두 유형이 서로 상속 관계에 있고
왼쪽 객체(parent)가 오른쪽 객체(child)의 상위 클래스인 경우에만 암묵적인 형변환이 일어난다.
하위 클래스에서 상위 클래스 유형으로 할당하는 것은 가능하나 그 반대의 경우에는 명시적인 형변환 필요

형변환은 앞에서도 내가 형변환에 대해 설명한 적이 있지만, 지금 작성중인 이 형변환은 자료형의 변환보다는 조금 더 깊은 개념이다.

결론부터 말하자면 암묵적인 형변환이 일어난 후 명시적 형변환이 일어나야 한다는 것이다.

  • 명시적 형변환의 조건
    객체가 최초 생성될 때 자식 클래스 형태로 생성되고, 부모형태로 암묵적 형변환이 된 상태를 다시 원래의 자식 클래스 형태로 되돌릴 경우에만 가능하다.
ChildClass child1 = new ChildClass();
				ParentClass Parent = child; ///암묵적 형변환
				ChildClass child2 = (ChildClass)parent;//명시적 형변환

위의 코드에서 볼 수 있듯이 암묵적 형변환이 일어난 후에 명시적 형변환이 일어난다.

  • 불가능한 경우
  1. 최초 객체 생성이 부모 형태로 만들어진 경우
  2. 최초 생성된 것과 다른 형식으로 변환하는 경우

1번 예시 코드

Unit u = new Unit();
Army army = (Army)u;////이건 불가능한 경우

2번 예시코드

Army army = new Army();
Unit u = army;
Navy navy = (Navy)u;///불가능. 
가능하고 싶었으면 navy가 아닌 army가 왔어야 한다. 
navy에 대한 형변환이 일어나지 않은채 무작정  navy가 와버림

객체 배열

개념 자체는 일반 데이터 타입과 동일하다고 할 수 있다.
int[]data = new int[3];
Army[] data = new Army[3];
-각 경우에 대한 배열의 요소할당처리를 한 것으로, 같은 클래스에 여러개의 객체를 그룹화한 것이다.

다른점이 있다면 일반 데이터 형은 단순히 값을 대입하지만 객체 배열은 new를 사용해 객체를 할당한다.

data[0] = 1;//일반배열
data[1] =2;
...

-----------------------
data[0] = new Army;///객체배열
data[1] = new Army;///객체배열
...
  • 정리
    객체 형변환
    ->같은 부모 클래스에서 파생된 서로 다른 자식 클래스의 객체들은 부모 형태로 암묵적 형변환되어 일관된 형식으로 사용가능
    객체 배열
    ->동일한 클래스의 객체는 배열로 묶어서 여러개를 한꺼번에 묶어서 제어할 수 있다.

instanceof연산자

간단히 말해 인스턴스의 형이 맞는지 여부를 체크하는 키워드이다.
어떤 객체에 대한 출처를 판단하여 boolean형태로 결과를 반환한다.
if(unit[0] istanceof Army){
Army temp = (Army)unit[0];
} 기본 로직은 이러한 형태

추상화

추상화란 공통적인 속성과 기능들을 정의함으로써 코드 중복을 막고 클래스간 관계를 효과적으로 설정해 유지보수를 쉽게 하기 위함에 목적을 두고 있다.

다짜고짜 예시 코드부터 우선 보였는데, 사진에서 보면 알 수 있듯이 우선 부모 class인 unit이 존재한다. unit이 getset을 이용해 정보를 가져오고 attack과 move라는 메서드를 abstract를 이용해 추상으로 명시한다.

아래의 사진은 하위 클래스인 Army를 나타낸다. extends를 추가해 줌으로써 Unit에서 상속받아 attack과 move를 사용 가능하다. source에서 constructor using feild를 사용하면 보다 편리하게 override하여 사용 가능하다.

  • 추상클래스
    추상메서드를 포함한 클래스
    추상 메서드를 하나 이상 포함하고 있는 클래스는 반드시 '추상클래스'로 정의되어야 한다.
    추상 클래스는 abstract키워드를 사용해 정의할 수 있다.
public abstract class Hello{
	public abstract void sayHello();
}

추상 클래스는 객체를 생성할 수 없고, 반드시 상속을 통해서만 사용될 수 있다. 즉, 추상 클래스는 다른 자식 클래스를 위한 '가이드라인'의 역할을 한다.

profile
초보 개발자 이야기

0개의 댓글