33

lec12 [호환 모드] - Sangji Universitycompiler.sangji.ac.kr/lecture/java/2008_1/lec12.pdf · 2019. 2. 14. · Microsoft PowerPoint - lec12 [호환 모드] Author: Main Created

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

  • 제네릭제네릭 클래스제네릭 클래스제네릭 인터페이스제네릭 메소드제네릭 메소드형 매개변수의 제한

    어노테이션어노테이션 형태시스템 정의 어노테이션사용자 정의 어노테이션

    [email protected] 2

  • 제네릭(generic)클래스나 메소드에 자료형을 매개변수 형식으로 사용할 수 있는클래스나 메소드에 자료형을 매개변수 형식으로 사용할 수 있는기능자료형과 무관하게 알고리즘을 기술자 형과 무 하게 알 리 을 기술예전에 작성한 알고리즘을 쉽게 재사용 가능

    어노테이션(annotation)프로그램 요소에 다양한 종류의 속성 정보를 추가하기 위해서사용사용자바 클래스 파일에 저장개발도구나 자바 가상기계 애플리케이션에서 접근 가능개발도구나 자바 가상기계, 애플리케이션에서 접근 가능

    [email protected] 3

  • 제네릭이란?변수의 형을 매개변수로 하여 클래스나 메소드의 알고리즘을 자변수의 형을 매개변수로 하여 클래스나 메소드의 알고리즘을 자료형과 무관하게 기술하는 기법

    형 매개변수(type parameter)클래스 내의 필드나 메소드 선언시 자료형으로 사용클래 내의 필 나 메 선언시 자 형 사용'' 사이에 형 매개변수의 이름을 기술 :

    제네릭의 장점알고리즘의 재사용성을 높임자료형에 따른 프로그램의 중복을 줄임프로그램의 구조를 단순하게 만듦

    [email protected] 4

  • Object 클래스형을 사용한 유사 제네릭 기능Obj t 클래스형은 모든 객체의 최상위 클래스형이므로 자바의Object 클래스형은 모든 객체의 최상위 클래스형이므로, 자바의모든 객체를 참조할 수 있음타입에 따라 실행 시간 예외 발생타입에 따라 실행 시 예외 발생

    제네릭에 관한 형 검사는 컴파일 시간에 이루어짐제네릭에 관한 형 검사는 컴파일 시간에 이루어짐

    자바의 제네릭 프로그램의 단위클래스인터페이스메소드메소드

    [email protected] 5

  • 자바 이전 버전의 유사제네릭 기능의 사용 예형 불일치에 따른 실행 시간 예외 발생형 불일치에 따른 실행 시간 예외 발생

    [예제 10.1 - StackExample.java]

    import java.util.*;public class StackExample {

    public static void main(String[] args) {Stack stk = new Stack();tk h( St i ("H ll ")) // 스택에 문자열 객체를 넣음stk.push(new String("Hello")); // 스택에 문자열 객체를 넣음

    Integer i = (Integer)stk.pop(); // 스택에서 문자열 객체를 꺼냄// i가 가리키는 객체는 문자열 객체이므로,// 실행 중에 예외 발생

    System.out.println(i.intValue());}

    }

    실행 결과 :E i i h d " i " j l Cl C E i j l S iException in thread "main" java.lang.ClassCastException: java.lang.Stringcannot be cast to java.lang.Integer

    at StackExample.main(StackExample.java:7)

    [email protected] 6

  • 형 매개변수를 이용한 제네릭의 사용 예형 불일치에 따른 컴파일 시간 에러 발생형 불일치에 따른 컴파일 시간 에러 발생

    [예제 10.2 - TypedStackExample.java]

    import java.util.*;public class TypedStackExample {

    public static void main(String[] args) {Stack stk = new Stack();stk push(new String("Hello"));stk.push(new String( Hello ));

    Integer i = (Integer)stk.pop(); // 컴파일 에러System.out.println(i.intValue());

    }}

    컴파일 결과 :TypedStackExample.java:7: inconvertible typesfound : java.lang.String

    i d j l I trequired: java.lang.IntegerInteger i = (Integer)stk.pop();

    ^1 error

    [email protected] 7

  • 형 매개변수(type parameter)를 가지는 클래스형 매개변수를 이용하여 필드나 지역변수에 사용형 매개변수를 이용하여 필드나 지역변수에 사용실제 형 정보는 객체 생성 시에 전달받음

    정의 형태

    [modifiers] class ClassName {// ... class body

    }}

    [email protected] 8

  • 형식 매개변수 형(formal parameter type) 제네릭 클래스를 선언할 때 사용한 형 매개변수제네릭 클래스를 선언할 때 사용한 형 매개변수class SimpleGeneric { ... }

    실제 형 인자(actual type argument) 제네릭 클래스에 대한 객체를 생성할 때 주는 자료형제네릭 클래스에 대한 객체를 생성할 때 주는 자료형new SimpleGeneric(10);

    [email protected] 9

  • 제네릭 클래스 사용의 예 – 클래스 정의

    [예제 10.3 - GenericClassExample.java]

    class SimpleGeneric {p {private T[] values;private int index;SimpleGeneric(int len) { // Constructor

    values = (T[])new Object[len];index = 0;index = 0;

    }public void add(T ... args) {

    for (T e : args)values[index++] = e;

    }}public void print() {

    for (T e : values) System.out.print(e + " ");

    System.out.println();y p ();}

    }

    [email protected] 10

  • 제네릭 클래스 사용의 예 - 사용

    [예제 10.3 - GenericClassExample.java](cont.)

    public class GenericClassExample {bli i id i (S i [] ) {public static void main(String[] args) {SimpleGeneric gInteger = new SimpleGeneric(10);SimpleGeneric gDouble = new SimpleGeneric(10);

    gInteger.add(1, 2);g g ( , );gInteger.add(1, 2, 3, 4, 5, 6, 7);gInteger.add(0);gInteger.print();

    gDouble add(10 0 20 0 30 0);gDouble.add(10.0, 20.0, 30.0);gDouble.print();

    }}

    실행 결과 :실행 결과 :1 2 1 2 3 4 5 6 7 010.0 20.0 30.0 null null null null null null null

    [email protected] 11

  • 형 매개변수를 가지는 인터페이스형 매개변수의 선언 외에 일반 인터페이스를 구현하는 과정과형 매개변수의 선언 외에 일반 인터페이스를 구현하는 과정과동일

    정의 형태

    [modifiers] interface InterfaceName {[modifiers] interface InterfaceName {// ... interface body

    }

    [email protected] 12

  • 제네릭 인터페이스 구현의 예 – 인터페이스 정의 및 구현현

    [예제 10.5 - GenericInterfaceExmaple.java]

    interface GenericInterface {public void setValue(T x);public String getValueType();

    }class GenericClass implements GenericInterface {class GenericClass implements GenericInterface {

    private T value;public void setValue(T x) {

    value = x;}

    bli St i tV l T (){public String getValueType(){return value.getClass().toString();

    }}

    [email protected] 13

  • 제네릭 인터페이스 구현의 예 - 사용

    [예제 10.5 - GenericInterfaceExmaple.java](cont.)

    public class GenericInterfaceExample {public static void main(String[] args) {

    GenericClass gInteger = new GenericClass();GenericClass gString = new GenericClass();

    gInteger.setValue(10);gString.setValue("Text");

    System.out.println(gInteger.getValueType());System.out.println(gString.getValueType());

    }}

    실행 결과 :l j l I tclass java.lang.Integer

    class java.lang.String

    [email protected] 14

  • 형 매개변수를 가지는 메소드메소드 수정자와 반환형 사이에 형 매개변수를 삽입하여 정의메소드 수정자와 반환형 사이에 형 매개변수를 삽입하여 정의

    정의 형태정의 형태

    [modifiers] return type MethodName(parameters)[modifiers] return_type MethodName(parameters) {

    // ... method body}}

    [email protected] 15

  • 형 매개변수의 중첩제네릭 메소드의 형 매개변수의 이름과 제네릭 클래스의 형 매제네릭 메소드의 형 매개변수의 이름과 제네릭 클래스의 형 매개변수 이름이 같은 경우서로 독립된 형 매개변수의 개념을 가짐서 독립된 형 매개 수의 개념을 가짐

    제네릭 클래스는 객체 생성 시에 형 매개변수를 전달받음제네릭 메소드는 호출 시에 유추하여 형 매개변수가 결정됨

    [email protected] 16

  • 제네릭 메소드 사용의 예[예제 10.6 - GenericMethodExample.java]

    public class GenericMethodExample {public static void printArgInfo(T arg) {

    System out print("Argument Type is " + arg getClass());System.out.print( Argument Type is + arg.getClass());System.out.println(" / Value is " + arg.toString());

    }

    public static void main(String[] args) {Integer i = new Integer(10);char c = 'A';float f = 3.14f;

    printArgInfo(i); // void printArgInfo(Integer)printArgInfo(i); // Integer void printArgInfo(Integer)printArgInfo(c); // void printArgInfo(Character)printArgInfo(f); // void printArgInfo(Float)

    }}

    실행 결과 :Argument Type is class java.lang.Integer / Value is 10Argument Type is class java.lang.Character / Value is AArgument Type is class java.lang.Float / Value is 3.14

    [email protected] 17

  • 형 매개 변수의 범위프로그램의 유연성 신뢰성프로그램의 유연성 신뢰성

    프로그램의 신뢰성을 증진하기 위해 제네릭에 전달 가능프로그램의 신뢰성을 증진하기 위해 제네릭에 전달 가능한 자료형의 범위를 제한할 필요가 있음

    제네릭 클래스를 작성시 한정exetneds 키워드와 ‘&’ 문자 사용exetneds 키워드와 & 문자 사용

    - S 형의 서브클래스형으로 제한한다. S 형의 서브클래스형과 인터페이스 I를 구현한 - S 형의 서브클래스형과 인터페이스 I를 구현한형으로 제한한다.

    [email protected] 18

  • 형 매개변수 제한의 예[BoundedGenericExample.java]

    class GenericType {private T value;GenericType(T v) { value v; }GenericType(T v) { value = v; }public String toString() {

    return "Type is " + value.getClass() + " / Value is " + value.toString();}

    }public class BoundedGenericExample {

    public static void main(String[] args) {GenericType gInteger = new GenericType(10);GenericType gDouble = new GenericType(3.14);// GenericType gString = new GenericType("Error"); //에러// GenericType String gString new GenericType String ( Error ); //에러

    System.out.println(gInteger.toString());System.out.println(gDouble.toString());

    }}}

    실행 결과 :Type is class java.lang.Integer / Value is 10Type is class java.lang.Double / Value is 3.14

    [email protected] 19

  • 형 매개변수 사용시 한정'?' 문자'?' 문자

    '?' 문자와 super 키워드

    - 모든 형이 가능하다.

    문자와 p 키워

  • 프로그램 요소에 다양한 종류의 정보를 부여하는 것

    프로그램 요소램클래스필드메메소드

    시스템 정의 어노테이션과 사용자 정의 어노테이션으로 구분시스템 정의 어노테이션과 사용자 정의 어노테이션으로 구분

    추가된 정보는 실행 시간에 자바의 리플렉션(reflection)을 통추가된 정보는 실행 시간에 자바의 리플렉션(reflection)을 통해 다양한 용도로 사용

    JDK에서 어노테이션을 처리하기 위한 도구

    [email protected] 21

    - APT(Application Processing Tool)

  • 어노테이션 사용방법프로그래밍 단위의 수정자가 명시되는 위치에 표기프로그래밍 단위의 수정자가 명시되는 위치에 표기

    형식형식'@'(at) 기호 다음에 어노테이션 이름을 명시추가 정보는 '('와 ')' 사이에 ' '로 구분하여 기술추가 정보는 ( 와 ) 사이에 , 로 구분하여 기술

    @AnnotationTypeName@AnnotationTypeName ( elementValue )@AnnotationTypeName ( element = value, element = value, ... )

    [email protected] 22

  • 어노테이션이 갖는 추가 정보의 원소 개수에 따른 구분마커 어노테이션( k t ti )마커 어노테이션(marker annotation)

    이름만 있는 어노테이션@AnnotationTypeName@AnnotationTypeName

    단원소 어노테이션(single-element annotation)하나의 원소만을 가지고 있는 어노테이션@AnnotationTypeName(elementValue)'{'와 '}' 사이에 ' '로 구분하여 원소에 여러 개의 값을 줄 수 있'{'와 '}' 사이에 ','로 구분하여 원소에 여러 개의 값을 줄 수 있음

    일반 어노테이션(normal annotation)여러 개의 원소를 갖는 어노테이션

    [email protected] 23

    @AnnotationName(element=value, element=value, ...)

  • 자바 언어에서 제공하는 어노테이션으로 자바 언어와 실행 환경에서 사용함행 환경에서 사용함

    OverrideDeprecatedDeprecatedSuppressWarningsTargetRetention

    [email protected] 24

  • 서브클래스에서 슈퍼클래스의 메소드를 재정의하는 것을 명시적으로 지정하기 위해서 사용을 명시적으로 지정하기 위해서 사용

    Override 어노테이션이 명시된 메소드가 슈퍼클래스의 메소드를재정의하지 못하면 컴파일 에러가 발생함재정의하지 못하 컴파일 에러가 발생함

    [email protected] 25

  • 특정 클래스나 인터페이스, 메소드, 필드 등이 앞으로 사라질 수 있다는 것을 경고하기 위해서 사용라질 수 있다는 것을 경고하기 위해서 사용

    Deprecated 어노테이션이 명시된 프로그램 요소를 참조하면, 컴파일러는 경고 메시지를 출력함파일러 경 메시지를 출력함

    [email protected] 26

  • Deprecated 어노테이션의 사용 예

    [예제 10.10 - DeprecatedAnnotation.java]

    class OldAndNewClass {/*** @d t d l d ldM th d b M h td* @deprecated replaced oldMethod by newMehotd.*/

    @Deprecatedpublic static void oldMethod() {

    System.out.println("In the Old Method ...");y p}public static void newMethod() {

    System.out.println("In the New Method ...");}

    }}

    public class DeprecatedAnnotation {public static void main(String [] args) {

    OldAndNewClass o = new OldAndNewClass();M th d()o.newMethod();

    o.oldMethod();}

    }

    [email protected] 27

  • 컴파일 결과 :Note: DeprecatedAnnotation.java uses or overrides a deprecated API.Note: Recompile with Xlint:deprecation for detailsNote: Recompile with -Xlint:deprecation for details.

    컴파일 옵션(-Xlint:deprecation)을 추가한 후 결과 : DeprecatedAnnotation.java:17: warning: [deprecation] oldMethod() in OldAndNewClass has been deprecated

    o.oldMethod();^

    1 warning실행 결과 :

    In the New Method ...In the Old Method ...

    [email protected] 28

  • 컴파일러가 발생시키는 특정 경고 메시지를 억제하기 위해 사용해 사용

    unchecked 제네릭 형과 로우 형을 동시에 허용함에 따른 경고의 억제제네릭 형과 로우 형을 동시에 허용함에 따른 경고의 억제

    deprecation 데프리케이티드(deprecated)된 요소의 사용시 발생하는 경고의 억제

    @SuppressWarnings("unchecked")@SuppressWarnings("deprecation")@SuppressWarnings({"unchecked" "deprecation"})@SuppressWarnings({"unchecked", "deprecation"})

    [email protected] 29

  • 어노테이션을 정의 시 어노테이션이 사용 가능한 프로그램 요소를 결정하기 위해 사용램 요소를 결정하기 위해 사용

    ElementType의 상수로 프로그램 요소를 나타냄

    ElementType 상수 의미

    ANNOTATION_TYPE 어노테이션 형

    CONSTRUCTOR 생성자

    FIELD 열거상수를 포함한 필드

    LOCAL_VARIABLE 지역변수

    METHOD 메소드

    PACKAGE 패키지PACKAGE 패키지

    PARAMETER 매개변수

    TYPE 클래스, 인터페이스(어노테이션 형 포함), 열거형

    [email protected] 30

  • 어노테이션 정보의 유지 범위를 설정하기 위해 사용R t ti P li 의 상수로 나타냄RetentionPolicy의 상수로 나타냄

    RetentionPolicy 상수 의미

    CLASS어노테이션 정보를 컴파일러는 클래스 파일에 저

    장하지만 가상기계는 읽지 않음.

    RUNTIME어노테이션 정보를 컴파일러는 클래스 파일에 저

    장하고 가상기계는 저장된 정보를 읽음.

    어노테이션 정보를 클래스 파일에 저장되지 않고SOURCE

    어노테이션 정보를 클래스 파일에 저장되지 않고,

    소스를 처리하는 도구에서만 사용.

    [email protected] 31

  • 프로그래머가 정의하는 어노테이션어노테이션 형을 정의한 후 사용어노테이션 형을 정의한 후 사용이름 앞에 '@' 문자가 오는 것 외에는 기본적으로 인터페이스를선언하는 것과 동일하 것과 동일사용방법 : 시스템 정의 어노테이션과 동일

    어노테이션 형 정의

    [ difi ] @i t f A t ti T N {[modifiers] @interface AnnotationTypeName {// Declaration of Annotation elements

    }

    [email protected] 32

  • 어노테이션 원소의 형으로 사용 가능한 자료형기본형 스트링 클래스 형 열거형 어노테이션 형기본형, 스트링, 클래스 형, 열거형, 어노테이션 형사용 가능한 형의 배열형기본 값 설정기본 값 설정

    default "[default_value]"

    어노테이션 형 정의의 예

    public @interface ProgramTask {int id();String programmer() default "[unassigned] ";String date() default "[unimplemented] ";

    }

    [email protected] 33