IT

JAVA 업캐스팅 본문

개발

JAVA 업캐스팅

abcee 2019. 2. 25. 09:30


2015.03.07 지식in 작성글 이전


일단 상속 관계에 대해서 정확하게 알 필요가 있어요.

 

상속 관계에 있는 클래스들 중 부모의 위치에 있는 클래스를 즉, 상위 클래스를 슈퍼클래스라고 하고 자식의 위치에 있는 즉, 하위 클래스를 서브 클래스 혹은 자식 클래스라고 해요.

이 슈퍼 클래스는 수 많은 서브 클래스들의 공통적인 부분만 구현 해 놓은 클래스예요. 예를 들어 Speaker 라는 클래스를 모든 스피커들의 슈퍼 클래스라 한다면 모든 스피커들의 공통적인 부분 ( 소리가 나온다 ) 라는 부분만 구현된 클래스가 Speaker 라는 클래스가 되는거지요. 그리고 서브 클래스인 BaseSpeaker에선 더 구체적인 부분 즉, 몇 채널을 사용하는 스피커인지, 장치와 연결되는 부분이 어떤 형태인지, 전원은 어떻게 공급하는지 등에 대해서 구현해 놓는거지요.

 

따라서 슈퍼클래스는 개념적인 부분에서는 서브 클래스를 포함하는 집합이 맞아요.

하지만 기능적인 부분에선, 그리고 구체적인 부분에선 서브클래스가 슈퍼클래스의 모든 기능을 포함한다고 볼수 있죠.

 

1.         Speaker spe = new BaseSeaker(5); 

위 소스를 분석해 보면 좌항은 spe 라는 이름을 가진 Speaker 레퍼런스 값이 저장될 수 있는 변수이고 우항은 BaseSpeaker 객체를 new 라는 예약어를 통해 실제로 생성하고 그 객체가 저장된 곳의 레퍼런스 값을 리턴한 결과라고 볼 수 있지요.

 

그런데 둘 사이의 데이터 타입이 맞질 안아요. 좌항는 Speaker 타입이고 우항은 BaseSpeaker타입이지요. 하지만 자세히 보니 좌항은 슈퍼클래스 타입의 레퍼런스 변수이고 우항은 서브클래스 타입의 레퍼런스 값이네요. 위에서 서브클래스는 슈퍼클래스의 모든 기능을 포함한다고 했지요? , 서브객체의 데이터 일부분을( 슈퍼클래스가 사용할 수 있는 부분만) 사용하겠다고 하는것이니 전혀 문제가 되지 않는거에요.

 

이런걸 바로 업캐스팅 이라고해요.

 

업캐스팅을 사용하는 이유는 통상적으로 좀 더 공통적으로 할 수 있는 부분을 간단하게 만들기 위해서에요.

예를 들어 Speaker라는 슈퍼 클래스가 있고 SpeakerA, SpeakerB, SpeakerC 라는 서브 클래스가 있다고 해봐요. Speaker A,B,C 는 사용을 할려면 공통적으로 전원을 공급해주고, 알맞은 장치와 연결이 되어야하고 소리크기 조절도 되어야 하죠. A,B,C 모두 사용하는 과정에서 이런 공통적인 기능들을 A,B,C 따로 실행 한다면 매우 비효율적일 거에요. 그래서 슈퍼클래스에서 공통적인 기능들을 일부 구현해놓고 서브클래스에서는 오버라이딩하여 구체화한 후 다른 클래스에서 Speaker A,B,C 가 사용될 경우 Speaker 라는 슈퍼클래스 형태의 레퍼런스로 받아 공통적으로 실행될수있게 만드는거지요.

 

소스를 통해 설명하자면

1.         public class Speaker{ 

2.          public void 전원공급(){ 

3.         

4.         public void 장치연결(){ 

5.       

6.        public void 소리조절(){ 

7.       

8.       

9.        public class SpeakerA{ 

10.        public void 전원공급(){ 

11.           //// 오버라이딩 

12.       

13.       public void 장치연결(){ 

14.        //// 오버라이딩 

15.     

16.      public void 소리조절(){ 

17.        //// 오버라이딩 

18.     

19.     

20.     public class SpeakerB{ 

21.        public void 전원공급(){ 

22.         //// 오버라이딩 

23.      

24.      public void 장치연결(){ 

25.        //// 오버라이딩 

26.    

27.     public void 소리조절(){ 

28.       //// 오버라이딩 

29.    

30.    

31.      public class SpeakerC{ 

32.       public void 전원공급(){ 

33.         //// 오버라이딩 

34.      

35.      public void 장치연결(){ 

36.        //// 오버라이딩 

37.    

38.     public void 소리조절(){ 

39.       //// 오버라이딩 

40.    

41.    

42.     public class TestClass{ 

43.       public void 스피커On(Speaker 스피커){ 

44.        스피커.전원공급() 

45.         스피커.장치연결() 

46.     

47.    

48.    public class MainClassA{ 

49.       public static void main(String [] args){ 

50.         TestClass t = new TestClass(); 

51.          SpeakerA a = new SpeakerA(); 

52.         SpeakerB a = new SpeakerB(); 

53.         SpeakerC a = new SpeakerC(); 

54.         Speaker [] arr = {a,b,c} 

55.          for( int i = 0; i<3; i++) 

56.         t.스피커On(arr[i]); 

57.      

58.    

59.      public class MainClassB{ 

60.       public static void main(String [] args){ 

61.          SpeakerA a = new SpeakerA(); 

62.         SpeakerB a = new SpeakerB(); 

63.         SpeakerC a = new SpeakerC(); 

64.        a.전원공급(); 

65.         a.장치연결(); 

66.         b.전원공급(); 

67.         b.장치연결(); 

68.         c.전원공급(); 

69.         c.장치연결(); 

70.      

71.     

 

업캐스팅을 안하면 MainClassB 처럼 사용해야될 것이 업캐스팅을 하면 MainClassA 처럼 사용할 수가 있는거죠.

 

Comments