Parent parent = new child(); 이렇게 오른쪽에 자식이 놓이면 암묵적 형변환이 일어난다.
위의 대입 연산에서 왼쪽항(parent)와 오른쪽항(child)의 객체 유형이 서로 다른경우,
두 유형이 서로 상속 관계에 있고
왼쪽 객체(parent)가 오른쪽 객체(child)의 상위 클래스인 경우에만 암묵적인 형변환이 일어난다.
하위 클래스에서 상위 클래스 유형으로 할당하는 것은 가능하나 그 반대의 경우에는 명시적인 형변환 필요
형변환은 앞에서도 내가 형변환에 대해 설명한 적이 있지만, 지금 작성중인 이 형변환은 자료형의 변환보다는 조금 더 깊은 개념이다.
결론부터 말하자면 암묵적인 형변환이 일어난 후 명시적 형변환이 일어나야 한다는 것이다.
ChildClass child1 = new ChildClass();
ParentClass Parent = child; ///암묵적 형변환
ChildClass child2 = (ChildClass)parent;//명시적 형변환
위의 코드에서 볼 수 있듯이 암묵적 형변환이 일어난 후에 명시적 형변환이 일어난다.
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;///객체배열 ...
간단히 말해 인스턴스의 형이 맞는지 여부를 체크하는 키워드이다.
어떤 객체에 대한 출처를 판단하여 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하여 사용 가능하다.
public abstract class Hello{
public abstract void sayHello();
}
추상 클래스는 객체를 생성할 수 없고, 반드시 상속을 통해서만 사용될 수 있다. 즉, 추상 클래스는 다른 자식 클래스를 위한 '가이드라인'의 역할을 한다.