자바 범 형 해석 (01): 범 형 인식

자바 범 형 해석 (01): 범 형 인식
What
     자바 는 1.0 버 전부터 현재 8 까지 중간 자바 5 에서 매우 중요 한 변화 가 발생 했다. 그것 이 바로 범 형 체제 의 도입 이다.자바 5 는 범 형 을 도 입 했 는데 주로 1999 년 에 지 정 된 최초의 자바 규범 중 하 나 를 만족 시 키 기 위해 서 이다.5 년 정도 의 시간 을 거 쳐 전문가 팀 은 범 형 규범 을 정 의 했 고 이 를 실현 한 후에 테스트 를 통 해 사용 에 투입 되 었 다.그 러 니까 범 형 은 자바 5 이후 에 나 있 는 거 야. 자세 한 내용 을 알 고 싶 으 면 계속 내 려 다 봐.
Why
     다른 측면 에서 볼 때 자바 5 가 범 형 을 도입 하 는 것 은 반드시 좋 은 점 을 가 져 올 것 이다. 그렇지 않 으 면 쇠고집 이 센 자바 전문가 엔지니어 가 구설 에 오 를 것 이다.범 형 이 없 는 프로그램 을 어떻게 썼 는 지 털 어 놓 자.
[code01]
           ArrayList al = new ArrayList();
           al.add("ysjian001");
           al.add(1);
           al.add(new Object());   

      이 코드 는 기능 이 강해 보 입 니 다. 왜 일 까요?집합 에 다양한 유형의 대상 을 추가 할 수 있 을 것 같 기 때문이다.우선 이런 견 해 를 부정 하지 않 고 다음 코드 를 살 펴 보 자.
[code02]
            //               ,           
            String first = (String) al.get(0);

    집합 에 저장 하 는 값 은 System. out. println (first) 이 아 닌 후기 에 사용 하기 위 한 것 입 니 다. 여기 서 강제 전환 문제 가 발생 합 니 다. 이런 유형의 강제 전환 은 컴 파일 러 에서 통과 할 수 있 고 프로그램 을 쓰 는 사람들 은 의도 치 않 은 오 류 를 저 지 르 며 오 류 를 강제 전환 하여 프로그램 운행 에 실 패 했 습 니 다.
     강제 형식 변환 으로 인 한 프로그램 실행 이 실패 한 이 유 는 컴 파일 러 에서 유형 을 제어 하지 않 았 기 때 문 입 니 다. code 01 에서 Array List 대상 을 호출 하 는 add 방법 을 보 세 요. 모든 유형 은 추가 할 수 있 고 컴 파일 러 는 오류 검 사 를 할 수 없 으 며 안전 위험 을 묻 었 습 니 다. 예 를 들 어:
[code03]
          ArrayList al = new ArrayList();
          //         ,File        ,            
          al.add(new File()); 
          String first = (String) al.get(0);  //             

일반적인 프로그램 이 없 으 면 두 가지 문제 에 직면 합 니 다.
     1. 컴 파 일 러 는 형식 검 사 를 할 수 없고 집합 에 임의의 유형의 대상 을 추가 할 수 있 습 니 다.
     2. 값 을 추출 할 때 형식 변환 에 실패 하여 프로그램 이 실 패 했 습 니 다.
일반적인 프로그램 으로 인 한 결과 가 없습니다.
     1. 프로그램의 가 독성 이 떨 어 집 니 다. 프로그래머 가 제한 을 받 지 않 고 집합 에 임의의 대상 을 추가 할 수 있 기 때 문 입 니 다.
     2. 프로그램의 안전성 이 의심 을 받 고 유형 전환 에 실패 하면 프로그램 이 실 패 했 습 니 다.
     자바 5 범 형 은 더 좋 은 해결 방안 을 제공 합 니 다. 유형 매개 변수 (type parameters) 는 범 형 프로그램 을 사용 하여 상기 코드 를 다음 과 같이 개선 합 니 다.
[code04]
          ArrayList<String> al = new ArrayList<String>();
          al.add( "ysjian001");
          // al.add(new Thread()); //    String    ,  File     
          String first =  al.get(0);//                

     ― 여기까지 앞 뒤 비 교 를 통 해 범 형의 장점 을 잘 알 지 않 을 까?왜 팬 타 입 으로 해요?
     답: 컴 파일 오류 가 발생 하 는 것 은 클래스 가 실 행 될 때 강제 형식 전환 이상 이 발생 하 는 것 보다 훨씬 좋 기 때문에 일반적인 장점 은 프로그램의 가 독성 과 안전성 을 향상 시 키 는 것 도 프로그램 설계 의 취지 이다.
Who
     범 형 류 를 사용 하 는 것 은 매우 쉬 운 일이 다. 집합 프레임 의 종 류 는 모두 범 형 류 로 사용 하기에 매우 편리 하 다.유형 제한 을 생각 하 시 는 분 들 이 있 는데 저희 가 왜 직접 배열 을 안 쓰 죠?이 문 제 는 집합 이 배열 보다 좋 은 이 유 를 묻 는 것 과 같다. 배열 은 고정 적 이 고 집합 은 자동 으로 확장 할 수 있다.또 실제 적 으로 하나의 범 형 을 실현 하 는 것 은 쉽 지 않다.직원 과 매니저 의 계승 구 조 를 살 펴 보 자.
[code05]
          public class Employee {
                //......
          }
          public class Manager extends Employee {
                // ......
          }

우리 가 직원 의 집합 을 만 들 고 사용 할 때 사용 하 는 것 은 복잡 하지 않다.
[code06]
          ArrayList<Employee> employees = new ArrayList<Employee>();
          employees.add(new Employee());       //       
          employees.add( new Manager());         //       ,        

     상술 한 사용 은 문제 가 없다. 왜냐하면 Manager is a Employee 는 전형 적 인 계승 관계 이기 때문이다. 그러나 반대로 할 때 순 조 롭 지 못 할 수도 있다. 예 를 들 어:
[code07]
          ArrayList<Manager> employees = new ArrayList<Manager>();
          employees.add(new Manager());          //           
          // employees.add(new Employee());     //        Employee

위의 코드 에 문제 가 생 겼 는데 이런 수요 가 존재 하지 않 는 것 도 아니 고 어 떡 하지?조급해 하지 마 세 요. 똑똑 한 자바 디자이너 가 혁신 적 인 새로운 개념 을 발 명 했 습 니 다. 마스크 유형 (wildcard type) 은 이 개념 만 알 고 나중에 상세 하 게 설명 할 것 입 니 다.
     대부분의 응용 프로그래머 들 이 범 형 에 대한 숙련 도 는 범 형 을 사용 하 는 데 만 머 물 러 있다. 예 를 들 어 집합 류 의 List, Set, Map 등 범 형 집합 은 많이 사용 되 는데 그들 은 이러한 범 형 집합 작업 방식 과 원 리 를 고려 할 필요 가 없다.그러면 서로 다른 범 형 류 를 혼합 하여 사용 하거나 자바 5 이전의 남 겨 진 코드 를 연결 할 때 애매 한 오류 메 시 지 를 볼 수 있 습 니 다.이렇게 되면 프로그래머 는 프로그램 에서 함부로 추측 하 는 것 이 아니 라 자바 범 형 을 배 워 서 문 제 를 해결 해 야 한다.결국 일부 프로그래머 들 은 자신의 범 형 류 와 범 형 방법 을 실현 하고 싶 어 할 수도 있다.
     범 형 프로 그래 밍 을 추출 하 는 세 가지 숙련 도 는:
     1. 범 형 만 사용한다.
     2. 일반적인 문 제 를 해결 하 는 것 을 배운다.
     3. 범 형 을 파악 하고 자신의 범 형 을 실현 한다.
How
     팬 타 입 을 어떻게 사용 하 는 지 는 듣 기 쉬 운 일이 다. Sun 회사 의 엔지니어 들 은 이미 많은 노력 을 했 기 때문에 수 요 는 항상 약간 까다 로 울 것 이다. 유형 적 매개 변수 가 모호 하고 명확 하지 않 은 문 제 를 해결 해 야 하거나 우 리 는 자신의 팬 타 입 을 실현 하여 업무 수 요 를 만족 시 킬 필요 가 있 기 때문에 팬 타 입 을 배우 고 파악 하 는 것 이 필요 하 다.
범용 클래스:
     간단 한 것 부터 시작 하여 일반적인 종 류 를 정의 합 니 다.
[code08]
     public class Couple<T> {
           private T wife ;
           private T husband ;

           public Couple(T wife, T husband) {
                    this.wife = wife;
                    this.husband = husband;
          }
           public void setWife(T wife) {this. wife = wife;}
           public void setHusband(T husband) {this. husband = husband;}
          
           public T getWife() {return wife;}
           public T getHusband() {return husband;}
     }

     Couple 부부 클래스 는 하나의 유형 매개 변수 T 를 도입 합 니 다. 주의 하 세 요. 유형 매개 변 수 는 괄호 (< >) 로 묶 고 클래스 이름 뒤에 놓 습 니 다. code 08 의 Couple 클래스 는 하나의 유형 매개 변수 가 있 습 니 다. 여러 가지 유형 매개 변 수 를 정의 할 수 있 습 니 다. 형식 은 < T, K, V > 입 니 다. 형식 매개 변 수 는 방법의 반환 유형, 매개 변수 유형, 그리고 정의 영역 또는 부분 변 수 를 정의 할 수 있 습 니 다. 예 를 들 어 아래 코드 와 같 습 니 다.
[code09]
          public class Couple<T, K, V> {......} //            
          private T wife ;  //        
          public T getWife() {return wife;}//              

     자바 라 이브 러 리 에서 유형 변 수 는 일반적으로 대문자 로 표시 되 며, E 는 집합 요소 유형 을 표시 하고, K 와 V 는 매 핑 테이블 의 키워드 와 값 의 유형 을 표시 하 며, T (U 또는 S) 는 임의의 유형 을 표시 한다.
     간단 한 범 형 커 플 이 정의 되 었 는데 어떻게 사용 합 니까?조급해 하지 마 세 요. 저 희 는 이 Couple 류 를 사용 할 때 Person 류: Couple < Person > 과 같은 구체 적 인 매개 변수 유형 을 지정 합 니 다.
[code10]
          Couple<Person>(Person,Person);
          setWife(Person);
          setHusband(Person);
          Person getWife();
          Person getHusband();

     code 10 의 코드 는 Person 형식 을 매개 변수 형식 으로 사용 한 후 Couple 형식의 변화 입 니 다. 여기 주의 하 세 요.    진정한 변화 가 이렇게 된 것 이 아니 라 우리 가 사용 할 때 이렇게 이해 하 는 것 이다. 왜 일 까?뒤에서 자세히 설명 하고 지 울 게 요.
일반적인 방법:
     범 형 류 를 정의 하면 어떤 좋 은 점 이 있 습 니까?앞의 예 를 통 해 이 범 형 류 는 이 종 류 를 사용 하 는 사용자 가 사용 할 때 구체 적 인 유형 을 지정 하여 어느 정도 유연성 을 높 일 수 있다.그럼 범 형 방법의 정의 가 어떻게 되 는 지 볼 까요?
[code11]
     public class GenericMethod {
           public static <T> T getFirstValue(T[] values) {
                    return values[0];
          }
     }

     이미 배 운 범 형 류 와 code 11 의 범 형 방법의 정의 에서 하 나 를 요약 하면 모든 범 형 은 반드시 < T > (여러 가지 유형의 매개 변 수 는 쉼표 로 분리 되 어야 한다. 예 를 들 어 < K, V >) 의 형식 으로 정 의 를 내 려 야 한다. 이것 은 필요 한 전제 이다. 고 개 를 돌려 상기 범 형 방 법의 정 의 를 살 펴 보고 방법 에 유형 적 인 매개 변수 T 를 정의 했다. 지정 한 방법의 반환 값 은 T 이다.방법의 매개 변 수 는 T 형식의 배열 입 니 다.
     방법 에 대한 호출 은 비교적 직관 적 이다.
[code12]
          String[] values = { "JavaSE","CoreJava" ,"EffectiveJava"};
          String firstValue = GenericMethod.<String>getFirstValue(values);

     어떻게 보면 호출 이 좀 복잡 한데, 왜 방법 호출 전에 < String > 을 사용 합 니까?사실 이것 은 필요 한 것 이 아 닙 니 다. 우리 가 String [] 형식의 values 를 방법 에 전달 할 때 컴 파 일 러 는 T 의 구체 적 인 유형 을 String 유형 으로 판단 할 수 있 기 때문에 < String > 은 생략 할 수 있 습 니 다.
[code13]
          String firstValue = GenericMethod.getFirstValue(values);

요약:
     이 절 에서 범 형 에 대해 전체적인 인식 을 가지 게 되 었 는데 그것 이 무엇 인지 아 십 니까?이 걸 왜 써 요?누가 그것 을 쓸 수 있 습 니까?그리고 그것 을 어떻게 사용 합 니까?범 형 류 와 범 형 방법의 실천 을 통 해 자신의 범 형 을 어떻게 실현 하 는 지 느 꼈 다. 다음 절 은 범 형 중의 어댑터 에 대해 설명 하고 가상 기기 가 범 형 류 와 범 형 방법 에 대한 지우 기 를 할 것 이다.
자바 범 형 해석 (01): 범 형 인식
자바 범용 해석 (02): 어댑터 한정
자바 범 형 해석 (03): 가상 컴퓨터 에서 범 형 코드 자바 범 형 해석 (04): 제약 과 한계 성 = = = =

좋은 웹페이지 즐겨찾기