JAVA-10

유명준·2024년 2월 1일

JAVA

목록 보기
9/15
post-thumbnail

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

1-1. 객체 형변환

  • java 기본 유형의 데이터들 처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어진다.

  • 서로 다른 클래스 유형으로부터 나은 참조변수들 간의 대입에는 일정한 규칙이 있다.
    Parent parent = new Child

  • 왼쪽 항 (parent)과 오른쪽 항(Chile)의 객체 유형이 서로 다른경우. 두 우형이 서로 상속관계에 있고
    왼쪽 객체(parent)가 오른쪽 객체(child)의 상위 클래스인 경우에만 암묵정인 형 변환이 일어난다

  • 하위 클래스에서 상위클래스 유형으로 할당하는 것은 가능하나. 그 반대의 경우에는 명시적 형 변환을 해야한다.
    ->그러나 상위 클래스 유형을 하위 클래스 유형으로 강제 형 변환하는 경우에는 할당되는 객체의 유형에
    따라서 실행 오류가 발생할 수 있다.

1-2. 객체간의 암묵적 형변환

<그림 >

  • 전부 다 가능한 케이스
    A a1 = new B();
    A a2 = new X();

A a3 = new C();
A a4 = new Y();

B b1 = new C();

C c  = new C ();
B b2 = c ;

Y y = new y();
X x2 = new B();

1-3. 암묵적 형변환과 메서드 오버라이드

  • 암묵적 형변환은 부모를 상속받는 자식객체의 기능을 부모에게 물려받은 기능만 사용하도록 제한한다.
  • 그러므로 암묵적 형변환이 발생하게 되면 오버라이드된 기능만 사용가능하고,
    추가적으로 구혀한 기능은 사용할 수 없다
  • 주의할 점은 기능의 제한이지 기능의 변경이 아니라는 것이다.

1-4.명시적 형변환

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

  • 하지만, 추가적으로 구현한 기능은 사용할 수 없게 되므로 원래의 기능을 다시 사용할 수 있는 방법이 필요해 졌다
    Unit u1 = new army();
    Unit u2 = new naby();
    Unit u3 = new airforce();

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

1-5. 명시적 형변환

  • 부모클래스의 객체를 자식 클래스 형태로 변환하는것

  • 형변환을 위해서는 다음과 같이 형변환할 클래스 이름을 명시적으로 지정해 주어야 한다.

    	ChildClass c =(ChildClass)parent

1=6. 명시적 형변환의 조건

  • 객체가 최초 생성될 때 자식 클래스 형태로 생성되고 부모 형태로 암묵적 형변환이 된 상태로 다시 원래의
    자식 클래스 형태로 되돌릴 경우에만 가능하다

    	ChildClass c1 = new ChildClass()
    	parentClass p = c1;
    	ChildClass c2 = (ChildClass)p

1-7. 명시적, 암묵적 형 변환 가능여부

 Army army1 = new Army()
Unit u = army1;               /// 2줄이 1한줄
Army army2 = (Army)u;

Unit u = new Navy();         /// 2줄이 1한줄
Navy navy =(naby)u;

- 불가능 : 최초 객체 생성이 부모형태로 만들어진 경우는 불가능 하다.
Unit u = new Unit() ;
Army army = (Army)u;

- 불가능 : 최초 생성된 것과 다른 형식으로 변환하는 것은 불가능하다.
Army army = new Army();
Unit u  = army; 
Navy navy = (Navy)u;
  • 위 두 경우 모두 문법적인 오류는 없기 때문에, 이클립스에서 에러를 검출하지 못한다.
    하지만 프로그램 실행시오류가 발생한다.

2. 객체배열

2-1. 객체배열

  • 일반 데이터 타입의 배열과 동일한 개념으로, 같은 클래스의 객체 여러개를 그룹화 할수 있다

  • 일반 데이터형의 배열 생성과 객체 배열 생성 비교

    	일반 데이터형 배열
    	int[] data =new int[3];
    
    	객체배열
    	Army[] data = new Army[3];
  • 각 경우에 대한 배열의 요소 할당처리
    -> 일반 데이터형은 단순히 값을 대입하지만,
    객체배열은 'new'를 사용하여 객체를 할당해야 한다

- 일반 데이텨형 배열
data[0] = 1;
data[1] = 2;
data[2] = 3;

- 객체 배열의 경우
data[0] = new Army();
data[1] = new Army();
data[2] = new Army();

2-2. 정리

  • 객체 형변환
    -> 같은 부모 클래스에서 파생된 서로 다른 자식 클래스의 객체들은 부모 형태로
    암묵적 형변환 되어 일관된 형식으로 사용 가능하다

  • 객체 배열
    -> 동일한 클래스의 객체는 배열로 묶어서 여러개를 한꺼번에 제어할 수 있다.

2-3. 부모 클래스의 배열에 자식 클래스의 객체 넣기

  • 배열의 생성이 부모 클래스로 지정되었을 경우, 모든 자식 클래스의 객체들은
    그 배열에 포함될 수 있다.

// 배열의 요소 할당 과정에서 암묵적 형변환이 이루어진다.
Unit[] unit = new Unit[3];
Unit[0] = new Army();
Unit[1] = new Naby();
Unit[2] = new AirFoece();

2-4. 객체 배열 활용

  • 일괄 처리가 가능하다
    -> 서로 다른 객체를 부모 형태의 배열에 담게 되면, 반복문으로 일괄처리가 가능하다
    -> 이 때 배열의 각 요소를 통해 사용하는 메서드가 Override되어 있을경우, 부모의 메서드가
    아니라 자신이 재정한 기능을 뜻한다.

    	for( int i=0; i<unit.length; i++) {
    		unit[i].attack();
    	}

2-5. 객체 배열활용2

  • 원래의 기능으로 복귀하기
    -> 배열의 각 요소가 확장한 기능을 사용하기 위해서는 원래의 클래스 형태로 명시적 형변환이
    이루어 져야 한다
    -> 하지만 반복적으로 처리되는 과정에서 몇 번째 요소가 어떤 클래스에서 최초 생성 되었는지
    판단하기란 쉽지 않다

  • intaceof 연산자
    -> intaceof연산자는 어던 객체에 대한 출처를 판단하여 boolean형으로 결과를 반환한다

    	if( Unit[0]  instanceof Army){
    		Army temp = (Army)unit[0];

}

3.추상화

3-1. 상속성과 다향성의 필요성

  • 상속성은 객체간의 공통적인 기능을 관리하기 위한 기법으로, 코드의 재사용을 통하여 프로그램의
    유지보수를 편리하게 한다.
  • 다형성(Override, Overload)은 서로 다른 기능이지만 메서드의 이름을 공통되게 처리함으로서
    전체 프로그램의 일관성을 유지하게 한다

3-2. Override 처리의 문제 발성 가능성

  • @Override 키워드를 사용하지 않고 메서드를 재정의 하는 과정에서 메서드 이름에서 실수가 발생하더라도
    에러가 아닌 새로운 메서드의 정의로 인식되므로 의도하지 않은 실행결과를 가져올수 있다.
  • @Override키워드를 사용하더라도 자식 클래스를 구현하는 개발자의 실수로 인하여 부모의 기능을 재정의
    하지 않았다면 다향성의 구현은 이루어지지 않게 된다

3-3. 상속 처리 시, Override 강제하기

  • 추상화 기법은 특정 클래스를 상속받은 경우, 부모의 특정 메서드들을 무조건 재정의하도록 강제하는 기법이다
  • 특정 메서드를 재정의하도록 강제함으로써, 자식 클래스들을 작성하기 위한 가이드 역활을 할 수 있다
  • 즉, 추상화 기법은 java클래스를 작성하기 위한 설계도를 소스코드 형태로 제시하는 역활을 한다

3-4. 추상 메서드 만들기

  • 추상 메서드를 정의하기 위해서는 'abstract'키워드를 사용하여 메서드를 정의한다

  • 추상 메서드는 자식 클래스가 구현해야 하는 메서드의 가이드라인만 제시하기 위한 목적으로
    사용되기 때문에, 선언만 가능하고 구현부가 없다

    	public abstract void sayHello();

3-5. 추상 메서드를 포함하는 클래스

  • 추상 메서드를 하나 이상 포함하고 있는 클래스는 반드시 '추상 클래스'로 정의되어아 한다
  • 추상 클랫느느 'abstract'키워드를 사용하여 정의할수 있다

//추상 클래스의 정의
public abstract class Hello{
public abstract void sayHello();
}

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

4.인터페이스

  • 추상클래스인 Unit의 기능을 용도별로 분할하여 나누어 놓고 주인공과 몬스터가 각각 기능에서 자신에게
    필요한 것들만 상속받도록 하는 방법을 필요로 한다.

4-1. 추상클래스의 한계

  • 자바 클래스간에 상속에서 하나의 부모만 존재할 수 있기 떄문에, 앞의 상황에서 요구하는 다중 상속의
    구현은 불가능하다.

    4-2. Interface란?

  • 완벽한 추상화를 구현하기 위한 Java Class의 한 종류
  • 다중 상속이 가능하기 떄문에 용도별로 세분화 하여 필요한 요소만 상속할 수 있다

-추상클래스
-> 멤버변수, 생성자, 메서드, 추상메서드를 포함할 수 있다
-> 이 클래스를 상속받는 자식 클래스는 다른 클래스를 상속받을 수 없다
-> 객체의 생성이 불가능

-인터페이스
-> 객체의 생성이 불가능
-> 추상 메서드만 포함할 수 있다
->인터페이스는 다중 상속이 가능하다

0개의 댓글