음..

 

 업캐스팅이 처음 들어 보는 단어라고 그러셨는데..

 

 상속을 알고 있다면 그리고 인터페이스 와 추상 클래스, 매서드 오버라이딩의 개념을

 알고 있다면 이미 업캐스팅을 사용하는 겁니다.

 

 아니 이미 업캐스팅은 문장에 만들어져 있습니다

 

 모든 자바는 Objdec 클래스에서 상속받습니다.

 명시적으

 

    class A {

 

 

} 라는게 있다면

 이미 묵시적으로

 

  class A extends Object 가 형성되는 거죠.

 

자 그럼 업태스팅은 무엇인지 알아보죠.

 

 대표적인 구문을 하나 보여드리겠습니다.

 

 

 class A{

 public void draw(){

  System.out.println(" A번입니다");

 }

 }

 

 class B extends A{

 public void draw(){

 System.out.println("B클래스입니다.");

}

}

 

class C extends B{

  public void draw(){

 System.out.println("C클래스입니다");

 }

  public void set(){

  System.out.pirnln("set매서드입니다");

}

 

 

실행부

 

 main(String[] args){

 A  a=new A();

 a.draw();

 

 // 이경우는  A클래스의 A 클래스입니다. 출력

 

 B b=new B();

 b.draw();

 

// B클래스입니다. 출력

 

 C c=new C();

 c.draw();

 c.set(); 

 

 //C클래스의 C클래스입니다. set 매서드입니다. 출력

 

 A ab=new C();

 c.draw();

 c.set();

 

 이경우는 C클래스입니다. 출력 c.set()는 에러.

 

 

 자 마지막을 보죠.

 A  ab=new C();

 라는 것을 만들었죠.

 A클래스는 C클래스로 상속이 되 있습니다.

 그런데 이 클래스를 풀이해보면

 A클래스 형을 가지는 ab는 C클래스의 메모리를 사용한다. 라는 뜻이됩니다.

 

 여기서 매서드 오버라이드 개념이 사용됐죠. draw()는 오버라이드 됐습니다.

 오버라이드가 되면 재정의를 통해 아들의 매서드를 사용합니다. 이미 알고 계시니 오버라이드는

 생략하죠.

 이상하게 c.set()은 에러가 나왔습니다. c클래스이 메모리를 사용하면서 왜 C 클래스의 매서들르

 사용 못할까요?

 

 수행순서를 생각해 보죠.

 A ab=new C(); 가 만들어지면

 상속 받은 클래스 A 에 대해 재정의 된 매서드가 있는지 검사합니다.

 draw()는 재정의가 됐으니 당연히 사용가능합니다.

 하지만 set() 은 재정의가 이루어지지 않았죠. 당연히 사용 불능입니다.

 

 

 하지만 이것이 무얼 의미하는지 진정한 의미를 파악하는게 중요합니다.

 인터페이스와 추상클래스 개념에서 업캐스팅은 무하한 위력을 발휘죠.

 또한 우리가 쉽게 사용하는 구문들 중에서 캐스팅 관련에서 업캐스팅은 많이 일어납니다.

 무심코 사용하는 구문들 대부분이 업 캐스팅의 개념을 포함하고 있습니다.

 

 실용적인 예로 인터페이스의 리스너의 들면

 마우스 리스러는 마우스의 조작을 처리합니다.

 우리는 리스터를 통해 마우스의 여러가지 특성을 부여하면

 

 자바 vm은 알아서 마우스를 제어하는 컴퓨터의 드라이버를 찾아 그 실행에 맞게

 마우스를 조작하는 역활을 해주죠. 우선 이 의미를 파악하고 리스너를 사용하십시오

 

모든 리스너는 다 이런 식입니다.

 마우스가 컴퓨터의 윈도우 환경에서 동작하려면 드라이버를 깔아야죠? ps/2나 usb드라이버를

 찾지 않습니까? 하지만 자바는 vm기반 언어기에 일일이 드라이버에 대한 정의를 해쥐 않아도 됩니다.

 리스너라는 편리한 도구가 있고, 그 리스너에서 제공하는 메서드를 사용해  마우스의 조작을

 해주는 겁니다.

 키보드 리스너의 경우도 마찬가지입니다. 이것 오에 리스너는 상당 종류가 있습니다면

 그 원리를 이해한다면 이미 반은 이해한 겁니다.

 

 

 

 그런데 아시다시피 인터페이스도 클래스의 한 종류 입니다.

 하지만 인터페이스는 껍데기입니다. 메모리를 가지지 않습니다. 메모리가 없기에 구현을 통해

 사용하는 것이죠. (메모리가 없다는 것은 그것을 동작한 자료를 넣을 공간이 없다는 겁니다.)

 

 

 마우스 리스너의 형을 가지고

 A 라는 클래스를 만들면 (A 클래스는 마우스 리스너를 구현했고, 메모리도 가지고 있게 되겠죠.)

 

 우리는 A  라는 클래스에서 리스너의 메서드를 모두 적어줘야 합니다. (그걸 방지하는게 아답터죠.) 여기서 일단 매서드 오버라이딩이 일어나고 (오버라이딩이 일어나지 않으면 구현받은 인터페이스에 접근하는게 불가능하니까요.)

 

 우리는 A클래스를 가지고 인터페이스 마우스 리스너의 제어담당 매서드에 접근해 그것을

 사용하게 해주는 겁니다.

 왜 그럴까요?

 

 인터페이스는 클래스이지만 메모리가 없습니다.

 그래소 implemets를 통해 구현하죠.

 느낌이 오십니까? (이런것이 여러가지 제작툴에서 사용되는 업캐스팅의 예입니다. 사실... 업캐스팅이 진짜 의미는 이정도를 넘어섭니다. 엄청난 아주 대단한 위력이 있죠. 남의 소스를 고치거나

 클래스를 고치고 할때도 업캐스팅은 강력합니다.)

 

 제 설명이 부족하다면 책을 찾아 보시길 바랍니다.

 아주 자세히 설명된 책도 많습니다.

 

 

 

 추상클래스의 경우도 마찬가지입니다.  추상 클래스는 클래스이지만 껍데기 입니다.

 상속 받아 클래스 안에 메모리를 만들어 줘야 사용가능하죠.

 

 업캐스팅을 처음 들어보셨다면... 책을 좀 더 보야 될것 같습니다.

 아주중요한 개념이고 이 개념을 이해해야 뒤에가서도 막히지 않습니다.

 상속 과 캐스팅이 자바의 전부라 해도 과헌이 아닙니다.

 자바는 기초가 아주 중요합니다. 지금도 계속 책을 찾아 보고 있죠.

 

 사실 그림 맞추기 게임에서 진짜 알야될 부분은 이런 기초적인 것에 대한 확실한 이해를 다지는 겁니다.

 이것 외에 배열에 대해서도 상당히 많으 부분을 알야 될겁니다.

 애플릿은 단지 툴입니다. 솔직히 제 생각에 에플릿은 그리 대단치 않습니다. 차라리 플래쉬가

 백배 낫죠.  하지만 애플릿은 그 자체로도 상당히 복잡합니다.

 버튼 하나를 넣기 위해서 여러가지 틀을 생각해서 순서에 맞게 구현해야 되지 않나요?

 그걸 외우는건 나중일입니다. 일단 기초적인 공부가 받쳐주면 왜 그런 순서로 작성해야 되는지가

 자연스럽게 들어오고 해당 클래스와 매서드들이 자연스럽게 머리에 들어오게 됩니다.

 

 

 

 

 한가지 더 예를 든다면

 무심코 사용하는 super에 대한 것을 들죠

 슈퍼는 아버지 클래스의 생성자를 참조하는 방법입니다.

 하지만 이게 어떤 의미인지 왜 그런지에 대해서는 자세히 알지 못하면 사용하는 의미가 없습니다.

 

 부모 클래스를 상속 받은 아들 클래스는 부모 클래스의 모든 기능을 가집니다.

 오버라이딩을 통해서, 업캐스팅을 통해서 모든 기능을 다 구현할 수 있죠.

 그런데 여기서 생성자를 생각해 봅시다.

 

 부모도 생성자가 있겠고, 아들도 생성자가 있겠죠. 표현하지 않더라도 디폴트 생성자라는 것을 무조건적으로 가지니까요.

 

 상속시 매소드처럼 오버라이드되어 부모 클래스의 생성자가 호출되지 않는다면 어떨까요?

 그렇다면 부모 클래스의 초기화 작업을 아들 클래스에서 모두 해줘야겠죠.

 이런 불편함이 있어서 super가 존재합니다.

 하지만 super의 명확한 의미는 이게 다가 아닙니다.

 

 상속시 생성자의 순서를 살펴보죠.

 일단 아버지 의 디폴트(매개변수가 없는 생성자)가 생성되고

 그다음 아들의 생성자가 생성됩니다.

 

 아버의 생성자는 무조건적으로 생성되지만, 오직 디폴트 생성자만 가능합니다.

 만약 매개 변수를 가지고 아버지 생성자에 접근하려 해도, 디폴트 생성자 밖에

 나오지 않게 됩니다.

 

 이것은 c++ 의 개념과 똑 같습니다. 하지만 자바는 이 문제를 super를 통해 해결합니다.

 인자가 붙은 부모 클래스의 생성자에 나는 접근하고 싶다.라고 할때

 super();를 사용하는겁니다.

 

 즉 인자가 없는 부모 클래스의 생성자에 접근할 때는 super를 사용할 필요가 없습니다

 오직 인자(매개변수)가 있는 부모 클래스에 접근할 때 super를 사용하는 것이죠

 

 이것이 주는 것은 상상합니다.

 방금 생성자 생성 순서를 알아봤죠?

 생성자는 초기화의 기능을 합니다.

 그리고 무조건 적으로 아버지 클래스 부터 생성하고 그다음 아들 클래스를 생성합니다.

 

 

 왜 super()를 가장 처음에 쓰는지 이것으로 이해됐겠죠?

 일단 아버지 클래스가 초기화 되야, 상속받을 수 있고, 그래야 아들 클래스도 구현할 수 있죠.

 

 

그렇다면 우리는 상속 받은 상태에서 아버지 클래스의 초기값을 마음대로 바꾸어 프로그램

 전반을 제어하는 기능을 가질 수 있는 겁니다.

 이 의미까지 이해했다면 상속에 대해 거의 다 이해한 겁니다.

 

 초기값을 바꾼다는 것은 프로그램 자체를 변화시키를 수 있는 거죠.

 그것이 바로 자바가 가지는 가장 큰 장점입니다 상속을 통해 아버지 클래스의 내용을

 변화 시킬 수 있다는 거죠.

 

 사실 이것 외에도 여러가지가 더 있습니다. 하지만 이정도만 알아도 어지간한 개념은 다 이해되어

 넘어갈 것같습니다. 기회가 되면 다음에는 자료구조와 디자인 패턴에 대한 이야기를 더 해보죠.

 그럼 공부 열심히 하세요.

+ Recent posts