day07 객체

JTH·2023년 1월 31일
0

gb_jth

목록 보기
17/56
post-thumbnail

1. overload

1-1. this 키워드를 사용한 생성자 overload

  • this 키워드를 메서드 처럼 사용할 경우, 현재 클래스의 다른 생성자를 의미한다.

1-2. this 키워드를 사용하여 생성자 overload를 간결하게 처리

  • 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여, 데이터의 초기화를 한곳에서
    일괄적으로 처리하도록 구현할 수 있다.
class Hello{
	public Hello(String.msg){
		System.out.println(msg);
	}

	public Hello(){
		this("Hello");
		// System.out.println("Hello");
	}

}

2. 객체 형변환과 객체 배열

2-1. 객체 형변환

  • java 기본 유형의 데이터들 처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어진다.
  • 서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는 일정한 규칙이 있다.
	Parent parent = new Child();
  • 왼쪽 항(parent)과 오른쪽 항(child)의 객체 유형이 서로 다른 경우, 두 유형이 서로 상속 관계에 있고
    왼쪽 객체가 오른쪽 객체의 상위 클래스인 경우에만 암묵적인 형 변환이 일어난다.
  • 하위클래스에서 상위 클래스 유형으로 할당하는 것은 가능하나 그 반대의 경우에는 명시적 형 변환을 해야한다.
    (왼쪽에 child 오른쪽에 parent일 경우)
  • 암묵적 형변환이 가능한 경우
 A a1 = new B();
 A a2 = new X();
왼쪽에 부모 오른쪽에 자식 가능
A a3 = new C();
A a4 = new Y();
왼쪽에 부모 오른쪽에 자식 가능
B b1 = new C();
X x1 = new Y();
가능
C c = new C();
B b2 = c;
가능
Y y = new Y();
X x2 = y;
가능

2-2 암묵적 형변환과 메서드 오버라이드

-암묵적 형변환은 부모를 상속받는 자식객체의기능을 부모에게 물려받은 기능만 사용하도록 제한한다.

  • 그로므로 암묵적 형변환이 발생하게 되면 오버라이드된 기능만 사용가능하고, 주가적으로 구현한 기능은 사용할 수 없다.
  • 주의할 점은 기능의 제한이기 때문에 기능의 변경은 아니라는 것
  • 상속관계의 객체를 부모 형태로 변환하면 클래스의 종류를 구분하지 않고 일관된 기능을 호출할 수 있다.
  • 객체가 상위 클래스형태로 형변환 되더라도 override된 자신의 기능은 잃지 않는다.
	Unit u1 = army;
	Unit u1 = navy;
	Unit u3 = airforce;

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

   - 추가적으로 구현한 기능은 사용할 수 없게 되므로 원래의 기능을 다시 사용할 수있는 방법이 필요해졌다.
	//부모 클래스가 가지고 있는 기능이 아니므로 에러
	u1.tank();
	u2.nucleus();
	u3.bomning();

2-3. 명시적 형변환

  • 부모 클래스의 객체를 자식 클래스형태로 변환하는 것
  • 형변환을 위해서는 다음과 같이 변환할 클래스이름을 명시적으로 지정해야한다.
	Child child = (Child)parent;

2.4. 명시적 형변환의 조건

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

2-5. 형변환 가능여부

-가능한경우

Army army1 = new Army(); // 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;

-> 불가능한 두가지 경우 문법적인 오류는 없기 때문에, 이클립스에서는 에러를 검출하지 못한다.
    하지만 프로그램을 실행시켰을 경우에는 에러가 발생한다.
profile
//

0개의 댓글