[자바] 9일차 - interface, 상속관계에 있는 클래스간의 형변환 :: 소림사의 홍반장!

9일차


인터페이스, Interface
 - 클래스들의 인터페이스 요소를 정의하는 상위클래스

 - public abstract는 생략하여 선언한다

 

Ex94_Interface 예제


참조형의 형변환, Up & Down Casting 
 - 참조형의 형변환
  : 목적 >> 형제뻘 되는 클래스의 객체들을 일괄처리하기 위해서!
  : 상속관계에 있는 클래스간의 형변환
  : 부모 <--> 자식간에는 형변환 가능(자식끼리는 형변환불가)
  
  1. 업캐스팅, Up Casting
   - 자식형 -> 부모형
   - 100% 가능 (암시적 형변환)
   - 모든 클래스는 System.lang.Object로 형변환이 가능


  2. 다운캐스팅, Down Casting
   - 부모형 -> 자식형
   - 상황따라서 가능, 불가능
   - 명시적 형변환


 

Ex95_Casting예제

 

 

Up Casting & Down Casting 활용

import java.util.*;

public class Ex97_Casting 
{
	public static void main(String[] args)
	{
		//Ex97_Casting.java

		// 프린터 대리점 운영
		// 1. 매달 1회 모든 제품을 작동 테스트
		// 2. 재고 HP640 x 5대
		//		   LG550 x 3대
		
		m3();	// 가장 효율적인 방법(업캐스팅 이용)
		
	}//end main

//case 1. 각각의 객체로 처리
	public static void m1() {
		HP640 hp1 = new HP640();
		HP640 hp2 = new HP640();
		HP640 hp3 = new HP640();
		HP640 hp4 = new HP640();
		HP640 hp5 = new HP640();

		LG550 lg1 = new LG550();
		LG550 lg2 = new LG550();
		LG550 lg3 = new LG550();

		//한달 -> 점검
		hp1.print();
		hp2.print();
		hp3.print();
		hp4.print();
		hp5.print();

		lg1.print();
		lg2.print();
		lg3.print();
	}//end m1()

//case 2. 배열을 이용하여 처리
	public static void m2() {
		HP640[] hps = new HP640[5];
		for(int i=0; i< hps.length; i++) {
			hps[i] = new HP640();
		}

		LG550[] lgs = new LG550[3];
		for(int i=0; i< lgs.length; i++) {
			lgs[i] = new LG550();	//인스턴스
		}

		//1달에 1번 체크
		for(int i=0; i< hps.length; i++) {
			hps[i].print();
		}

		for(int i=0; i< lgs.length; i++) {
			lgs[i].print();
		}
	}//end m2()

//case 3. 
	public static void m3() {

		//업캐스팅
		//Printer p = new Printer();	//객체생성X
		//추상클래스나 인터페이스는 스스로 인스턴스를 만들지못하지만
		//	참조변수는 생성할 수 있다.
/*
		Printer p1 = new HP640();	//가능
		Printer p2 = new LG550();	//가능
		Object p3 = new HP640();	//가능
		Object p4 = new LG550();	//가능
*/
		Printer[] list = new Printer[8];
		list[0] = new HP640();
		list[1] = new HP640();
		list[2] = new HP640();
		list[3] = new HP640();
		list[4] = new HP640();

		list[5] = new LG550();
		list[6] = new LG550();
		list[7] = new LG550();

		//1달에 1번 출력
		for(int i=0; i< list.length; i++) {
			list[i].print();

			System.out.println(list[i] instanceof HP640); //현재 객체 확인

			if(list[i] instanceof HP640) {
				//list[i].call();	//부모는 자식멤버를 모름!!
				//자기 자신의 고유기능이 필요한 경우에는
				//	자신의 타입으로 형변환시켜 고유멤버를 사용한다.
				//	--> 다운캐스팅

				HP640 hp = (HP640)list[i];
				hp.call();
			}

			if(list[i] instanceof LG550) {
				((LG550)list[i]).selfTest();
			}
		}

		//추상클래스(인터페이스)와 참조형 형변화의 사용
		//	- 형제뻘 되는 클래스의 객체들을 일괄처리하기 위해서!
	}//end m3();
}//end Ex97_Casting


//추상클래스(멤버구현 + 규칙선언)
abstract class Printer
{
	public String model;	//모델명

	public abstract void print();	//프린터로써 가져야할 최소한의 행동규칙

}//end Printer

class HP640 extends Printer
{
	public void print() {
		System.out.println("HP640출력 : "+this.model);
	}

	public void call() {
		System.out.println("자동으로 상담원 연결...");
	}
}//end HP640

class LG550 extends Printer
{
	public void print() {
		System.out.println("LG550출력 : "+this.model);
	}

	public void selfTest() {
		System.out.println("자가 진단 테스트...");
	}

}//end LG550

제네릭, Generic
 - 내부구조나 알고리즘을 동일하게 구현하되, 취급되는 데이터의
  자료형만 다른 메서드나 클래스를 구현하는 경우에 사용
 - 즉, 일반화된 클래스나 메서드를 정의하는 기법
 - 컴파일때 자료형이 결정됨.
 - 타입 변수를 사용

 1. 제네릭 클래스
 2. 제네릭 매서드
  - 메서드 오버로딩과 구분할것!

 

Ex98~100_Generic 소스 참고

 


컬렉션, Collection

 - 데이터 집합(데이터를 넣을 수 있는 공간의 집합)


배열 VS 컬렉션
 - 길이가 고정(불변) VS 길이가 가변
 - 타입이 고정 VS 타입이 Object
 - 컬렉션은 배열에 비하여 종류가 다양하고 기능이 풍부

Ex101_ ArrayList 예제

다른 카테고리의 글 목록

Dev. 640시간 뭉개기/강의내용정리 카테고리의 포스트를 톺아봅니다