FIF's 코딩팩토리

자바 기초 NCS교육과정(20)-캐스팅과 바인딩 본문

Back-End/국비 NCS교과과정

자바 기초 NCS교육과정(20)-캐스팅과 바인딩

FIF 2019. 7. 30. 17:19
반응형

 데이터 타입
  1 기본 데이터타입 : byte,short,int,long,float,double,boolean,char


  2 참조 데이터타입 : array, class, interface
   
  인자전달방식
  1 call by value : 값복사 - 기본 데이터타입
     void add(int a, int b){}
     add(10, 20);


  2 call by reference : 주소복사 -참조 데이터타입
    void process(int[] arr){}
    process(new int[]{1,2,3});
     
     
  형변환(casting) - 기본 데이터타입
  1 묵시적형변환 : 작 -> 큰


  2 명시적형변환 : 큰 -> 작   
    int num=3;
    double data=num; //묵시적형변환
    short val=(short)num;  //명시적형변환
    
  객체형변환-참조데이터타입
  1 상속관계일때 형변환이 가능하다.(is a)


  2 업캐스팅 발생된후 다운캐스팅을 할 수 있다.
    업캐스팅(up-casting) : 부모객체로 자식객체를 참조하도록 형변환하는 기술


    다운캐스팅(down-casting) : 업캐스팅을 다시 원상복귀해주는 형변환하는 기술

 

 

Java109_casting.java

class Parent {
	void process() {
		System.out.println("Parent");
	}
}

class Child extends Parent {
	void call() {
		System.out.println("Child call");
	}

	@Override
	void process() {
		System.out.println("Child process");
	}
}

class Sun extends Parent {
	void prn() {
		System.out.println("Sun prn");
	}

	@Override
	void process() {
		System.out.println("Sun process");
	}
}

class Outer{
	void prn() {
		System.out.println("Outer prn");
	}
}

public class Java109_casting {

	public static void main(String[] args) {
		Parent p=new Parent();
		Outer t=new Outer();
		//독립적인 참조데이터타입(객체)은 형변환이 안된다.
		//p=t;
		
		Child c=new Child();
		p=c;
		//Parent영역에 process()검색후->Child영역에 process()검색을 해서 오버라이딩이 되여있으면 Child영역에 process()메소드를 실행한다.
		p.process();
		//p.call();
		
		//객체생성 및 업캐스팅
		Parent pt=new Child();
		
		//다운캐스팅(down-casting)
		Child cn=(Child)pt;
		cn.process();
		cn.call();
		
		Parent pe=new Sun();
		pe.process();
	}

}

출력결과

 

 

 다형성(polymorphism)
  1 사전적 의미는 '여러가지 형태를 가질 수 있는 능력'을 의미한다.


  2 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조하는 기술이다.
   
   void add(Parent a, Parent b){}
   
    add(new Child(), new Child());
    add(new Sun(), new Sun());
   
  바인딩(binding) : 메소드 호출을 실제 메소드의 몸체와 연결하는 기술이다.
  1 정적바인딩(static binding) : 컴파일단계에서 어떤 클래스의 어떤 메소드가 호출되는지  연결하는 기술


  2 동적바인딩(dynamic binding) : 실행단계에서 어떤 클래스의 어떤 메소드가 호출되는지 연결하는 기술

 

Java110_binding.java

class BindTest extends Object {
	String stn;

	public BindTest() {

	}

	public BindTest(String stn) {
		this.stn = stn;
	}

	@Override
	public String toString() {
		return stn;
	}
}

public class Java110_binding {

	public static void main(String[] args) {
		BindTest bt = new BindTest();
		//정적바인딩
		System.out.println(bt.toString());
		
		//업캐스팅
		Object obj=bt; //Object obj=new BindTest;
		//동적바인딩
		System.out.println(obj.toString());
		process(new String("java"));
		//Object->Number->Integer
		process(new Integer(10));
	}
	//is a (상속관계) ->up-casting(업캐스팅)->dynamic binding(동적바인딩)
	public static void process(Object obj) {
		System.out.println(obj.toString());//동적바인딩
	}

}

출력결과

 

 

LgTv.java

public class LgTv {
	String maker;

	public LgTv() {

	}

	public LgTv(String maker) {
		this.maker = maker;
	}

	public void turnOn() {
		System.out.println(maker + " TV-전원을 켠다.");

	}

	public void turnOff() {
		System.out.println(maker + " TV-전원을 끈다.");
	}

	public void soundUp() {
		System.out.println(maker + " TV-소리를 높인다.");
	}

	public void soundDown() {
		System.out.println(maker + " TV-소리를 줄인다.");
	}

}

SamsungTv.java

public class SamsungTv {
	String maker;

	public SamsungTv() {

	}

	public SamsungTv(String maker) {
		this.maker = maker;
	}

	public void turnOn() {
		System.out.println(maker + " TV-전원을 켠다.");

	}

	public void turnOff() {
		System.out.println(maker + " TV-전원을 끈다.");
	}

	public void soundUp() {
		System.out.println(maker + " TV-소리를 높인다.");
	}

	public void soundDown() {
		System.out.println(maker + " TV-소리를 줄인다.");
	}

}

Java111_binding.java

public class Java111_binding {
	public static void display(double x, double y) {
		System.out.println(x+y);
	}
	
	//결합도가(의존성이)높다 - 유지보수와 확상정이 약하다.
	public static void processLg(LgTv lg) {
		lg.turnOn();
	}
	
	public static void processSamsung(SamsungTv ss) {
		ss.turnOn();
	}

	public static void main(String[] args) {
		display(4.5,6.3);
		display(10,20);
		LgTv lg = new LgTv("LG");
		processLg(lg);
		
		SamsungTv ss=new SamsungTv("SAMSUNG");
		processSamsung(ss);

	}

}

출력결과

 

 

LgTv2.java

public class LgTv2 extends HomeTv {
	public LgTv2() {
		
	}
	public LgTv2(String maker) {
		this.maker=maker;
	}
	
	public void call() {
		System.out.println("lg call");
	}

}

SamsungTv2.java

public class SamsungTv2 extends HomeTv {
	public SamsungTv2() {
		
	}
	
	public SamsungTv2(String maker) {
		super(maker);
	}

	public void loc() {
		System.out.println("samsing loc");
	}
}

Java112_binding.java

public class Java112_binding {
	// 결합도가(의존도가) 낮아졌다
	public static void process(HomeTv tv) {
		tv.turnOn();
		if(tv instanceof LgTv2) {
			LgTv2 lg=(LgTv2)tv;
			lg.call();
		}else if(tv instanceof SamsungTv2) {
			SamsungTv2 ss=(SamsungTv2)tv;
			ss.loc();
		}
	}

	public static void main(String[] args) {
		LgTv2 lg = new LgTv2("LG");
		process(lg);
		
		SamsungTv2 ss = new SamsungTv2("SAMSUNG");
		process(ss);

	}

}

출력결과

 

 
  instanceof : 객체를 비교하기 위한 비교연산자이다.


  a instanceof A


  : a객체가 A타입이면  true, 아니면 false 리턴한다.
 

Java113_binding.java

class ExamA {
	void prn() {

	}
}

class ExamB extends ExamA {
	void prn() {

	}
}

class ExamC extends ExamB {

}

public class Java113_binding {

	public static void main(String[] args) {
		//객체 instanceof 비교 데이터타입과 같거나 조상 데이터타입
		ExamB bb=new ExamB();
		System.out.println(bb instanceof ExamA);//true
		
		ExamA aa=new ExamA();
		System.out.println(aa instanceof ExamB);//false
		
		ExamA ea=new ExamB();
		System.out.println(ea instanceof ExamA);//true
		System.out.println(ea instanceof ExamB);//true
		System.out.println(ea instanceof ExamC);//false
	}

}

출력결과

반응형
Comments