diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..c043eea --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.2.1 diff --git a/_posts/2015-01-07-effective-java-4.markdown b/_posts/2015-01-07-effective-java-4.markdown index 4e07926..2775932 100644 --- a/_posts/2015-01-07-effective-java-4.markdown +++ b/_posts/2015-01-07-effective-java-4.markdown @@ -23,8 +23,8 @@ description: 제네릭 (23~29) - 무인자 자료형(raw type) : List - 한정적 형인자(bunded type parameter) : \ - 재귀적 형 한정(recursive type bound) : \\> - - 한정적 와일드카드 자료형(bounded wildcard type) : List - - 비한정적 와일드카드 자료형(unbounded wildcard type) : List + - 비한정적 와일드카드 자료형(unbounded wildcard type) : List + - 한정적 와일드카드 자료형(bounded wildcard type) : List - 제네릭 메서드(generic method) : static List asList(E[] a) - 자료형 토큰(type token) : String.class - diff --git a/_posts/2015-01-15-effective-java-5.markdown b/_posts/2015-01-15-effective-java-5.markdown index c378020..7e9071a 100644 --- a/_posts/2015-01-15-effective-java-5.markdown +++ b/_posts/2015-01-15-effective-java-5.markdown @@ -461,9 +461,10 @@ public enum ExtendedOperation implements Operation { } } {% endhighlight %} -- _ & Operation> void test(Class opSet, double x, double y)_ + +- _\ & Operation> void test(Class opSet, double x, double y)_ - 자료형의 class 리터럴을 사용, class 리터럴은 한정적 자료형 토큰 역활을 한다. - - ** & Operation>** : Class 객체가 나타내는 자료형이 enum 자료형인 동시에 Opertion 하위 자료형이 되어야한다. (Enum 자체는 상속이 안되고 같은 interface 를 상속하는 방식이므로 이런 한정적 방법이 필요함) + - **\ & Operation\>** : Class 객체가 나타내는 자료형이 enum 자료형인 동시에 Opertion 하위 자료형이 되어야한다. (Enum 자체는 상속이 안되고 같은 interface 를 상속하는 방식이므로 이런 한정적 방법이 필요함) - _void test2(Collection opSet, double x, double y)_ - EnumSet 이나 EnumMap 을 사용할수 있는 유연성이 가능하다. - **하지만 한정적 와일드 카드 자료형 특성상 특정 operation을 직접 수행할수는 없다.**, 실제로 연산을 수행할수 있으르면 한정적 자료형 토큰으로 사용하자! diff --git a/_posts/2015-09-19-java-generic.markdown b/_posts/2015-09-19-java-generic.markdown new file mode 100644 index 0000000..43488f3 --- /dev/null +++ b/_posts/2015-09-19-java-generic.markdown @@ -0,0 +1,76 @@ +--- +layout: post +title: "Java Generic" +date: 2015-09-19 00:00:00 +0900 +categories: JAVA +tags: JAVA +description: Java Generic Wildcard 자료 +--- + +### Java Generic +- 자바 제네릭을 많이 사용하지만 매번 햇갈리고 재대로 이해했는지 모를때가 많아서 햇갈리는 부분만 조금 정리해 보기 :cry: +사실은 그냥 블로그 너무 오래안해서..... :yum: +- 제네릭은 용어부터 햇갈려서 간단히 정리([이펙자바](../effective-java-4)) + - 간단히 말하면 + - \(`Gereric`) vs \(`Wildcard`) + - \(`unbounded`) vs \(`bounded`) + - 형인자(type parameter) + - 형인자 자료형(parameterized type) : **List \** + - 실형인자(actual type parameter) : **String** + - 제네릭 자료형(generic type) : **List\** + - 형식 형인자(Formal Type Parameter) : **E** + - 무인자 자료형(raw type) : **List** + - 한정적 형인자(bunded type parameter) : **\** + - 재귀적 형 한정(recursive type bound) : **\>** + - 비한정적 와일드카드 자료형(unbounded wildcard type) : **List\** + - 한정적 와일드카드 자료형(bounded wildcard type) : **List** + - 제네릭 메서드(generic method) : **static List asList(E[] a)** + - 자료형 토큰(type token) : **String.class** + +### Wildcard +- **자바 Generic은 컴파일 타임에서 형 안정성을 지원하기 위해 존재한다.** 따라서 Generic은 기본적으로 다형성(Polymorphism) 을 갖지 않는다. +- Gereric 에 다형성을 갖도록 만들기 위해 Wildcard 를 사용한다. List\ 에는 Dog, Cat 클래스는 add 할수가 없다. 따라서 List\ 로 선언해서 다형성을 갖을수 있도록 하는것이 Wildcard 의 핵심! +- extends 이외에 super 키워드도 존재한다 :worried: + +{% highlight java %} +// ? 가 extends Number 을 한다! (upper bound) +List foo3 = new ArrayList(); +List foo3 = new ArrayList(); +List foo3 = new ArrayList(); +// ? 는 Integer 에 super 클래스이다. (lower bound) +List foo3 = new ArrayList(); +List foo3 = new ArrayList(); +List foo3 = new ArrayList(); +{% endhighlight %} + +### Unbounded Wildcard \ +- Unbounded Wildcard 은 언제 쓰는것일까? 와일드 카드에 ? 는 결국에 컴파일 시간에는 결국 Object 객체 일뿐이다. 즉 List\ 에 String 객체를 넣을수는 없다(컴파일 에러) +- List\ 에는 String 객체를 넣을수가 있다. 컴파일 시간에 형 안정성을 보장하지 못하고 런타임에서 에러가 발생 할 수 있다. +- List\ 는 String 을 `add` 할수는 없지만 `contains(Object o)`, `remove(Object o)` 같이 형인자 를 사용하지 않은 함수들은 그대로 사용 할 수 있다. +- 즉 Unbounded Wildcard 는 컴파일 시간에 형 안정성을 보장하며 형인자에 대한 정보가 없으므로 형인자를 갖는 부분을 제외한 메소드만 사용이 가능하다. + - List\ 는 비구체화 타입이다. 런타임에서는 타입정보가 사라져서 컴파일 타임에서 런타임에서 보다 더 많은 정보를 갖는 타입이다. + - List\ 은 구체화 타입이다. 컴파일 타입에서는 타입 정보를 알수 없지만 런타임에서는 더 많은 정보를 갖는다. + +### Gerenic Stata Method + +{% highlight java %} +public class Test { + public static Test of(){ + return null; + } + public Test of2(){ + return null; + } +} +{% endhighlight %} +- Static 함수는 사용시점에 E 클래스에 대한 정보가 없으므로 static 옆에 정보가 있어야 한다. + - Test.of 로 사용, _컴파일러가 타입 추론을 해서 사실 위 경우는 해주지 않아도 컴파일 에러가 발생하진 않는다._ +- Instance 함수는 사용시점에 이미 인스턴스를 생성해서 클래스에 대한 정보를 가지고 있으므로 에 대한 정보가 없어도 된다. + - t.of2() 로 사용 + +### Generic Casting +- List 와 List 는 상속 관계에 있지 않다. + - List list = new List 는 불가능하다. + - List list; list.add(1) 이런식은 가능한데 Number 로 캐스팅이 되기 때문에 가능한거다. + +