1. 제네릭이란 무엇이고, 왜 사용하는 걸까??


- 컬렉션, 람다식, 스트림 등 등 잘못된 타입이 들어오는 것을 방지

- API 도큐먼트에 자주 보인다.

- *실행 시 타입 에러가 나는 것보다 컴파일 시에 미리 타입을 강하게 체크해서 에러를 사전에 방지

- 컬렉션에서 elements를 가져올 때 항상 타입 변환을 해야하는데, 제네릭으로 타입을 한정 짓게 되면 타입 변환을 할 필요가 없이 고정적이기 때문에 프로그램의 성능이 향상된다.



2. Object로 쓰면 되지 않나요?

Object를 쓰게 되면 위에서 언급했던 것과 같이 타입을 반환을 할 때 Object로 반환하기 때문에 이에 다시 타입을 강제 변환시켜야 한다. 때문에 타입 변환이 빈번해지면 전체 프로그램 성능에 좋지 못한 결과를 가져올 수 있다. 특히 자주 쓰이는 것이라면..



3. 제네릭 메소드

제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드입니다. 리턴 타입과 매개 타입으로 타입 파라미터를 사용하면 됩니다.


public <타입 파라미터> [리턴 타입] [메소드명(매개 변수...)] {

...

}


기존 메소드에서 타입 파라미터가 추가되었습니다.


4. 제한된 타입 파라미터

제네릭을 사용하되 그 타입 파라미터에 지정되는 구체적인 타입을 제한할 수 있습니다.

< T extends 최상위타입> 이런식으로 선언하여 상위 타입 혹은 하위, 또는 구현 클래스만 지정할 수 있게 할 수 있습니다.

단, 이렇게 제한을 하고 난 후 {} 중괄호 안에서 타입 파라미터 변수로 사용 가능한 것은 상위 타입의 필드, 메소드로 제한됩니다.



5. 와일드카드 타입<?>

<?> : 제한 없음.

<? extends 상위타입> : 상위 클래스 제한

<? super 하위 타입> : 하위 클래스 제한



추가.


제네릭은 전체적으로 타입 변환을 사라지게 하고, 오류를 줄임으로 프로그램의 성능을 향상시킨다. 하지만 제네릭을 사용할 때 인지하고 있어야 하는 점이 있다.


"자바의 제네릭 자료형은 객체를 생성할 수 없다"


이는 제네릭스의 "자료형 지우기"라는 특성에서 발생한다. 자료형 지우기란 컴파일러가 컴파일시 자료형에 대한 정보를 모두 검사하여 이에 문제가 없을시 제네릭에 관한 정보가 전혀 없는 바이트코드를 생성한다.

(* 제네릭을 사용하기 전의 코드와 호환성을 유지하기 위해 제네릭에 대한 정보를 삭제한다)


때문에 컴파일된 바이트코드에는 존재하지 않는 제네릭 자료형의 객체는 생성을 할 수 없게 된다.

  1. 2018.09.04 15:09

    비밀댓글입니다

    • 2018.10.19 16:23

      비밀댓글입니다

메이븐, 스프링 부트 cli 설치 후 이클립스에서 spring boot 프로젝트를 만들 때 났었던 에러입니다.



Error ====================================================================================

ArtifactTransferException: Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:3.0.2 from https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.apache.maven.plugins:maven-resources-plugin:pom:3.0.2 from/to central (https://repo.maven.apache.org/maven2): The operation was cancelled.

java.lang.reflect.InvocationTargetException

========================================================================================



원인 : *.lastUpdated 파일이 업데이트에 대한 메이븐 검사를 차단하고 필요한 jar파일을 다운로드하지 못하게 하는 것.


해결 : /{user}/.m2/repository 안에 있는 .lastUpdated 파일을 삭제하는 것.


cd %userprofile%\.m2\repository 
for /r %i in (*.lastUpdated) do del %i



1. 람다식이란 무엇인가?


자바에서 함수적 프로그래밍을 위해 자바 8부터 람다식을 지원하게 되었다.


람다식을 사용함으로써 코드가 매우 간결해지고, 필터링을 통해 결과를 쉽게 집계할 수 있게 되었다.


람다식은 ()->{....};의 형식으로 괄호안에는 매개변수가, 중괄호 안에는 실행코드가 들어가게 된다.



2. 람다식은 인터페이스 변수에 대입이 가능하다.


람다식은 기본적으로 인터페이스의 익명 구현 객체를 생성하게 된다. 하지만 모든 인터페이스에 대하여 사용할 수는 없다. 두 개 이상의 


추상 메소드가 존재하는 인터페이스는 람다식을 이용하여 구현할 수 없다(오직 한 개의 메소드만 있는 인터페이스만 가능하다는 소리)



3. 람다식은 클래스의 필드 , 메소드 및 로컬 변수를 사용할 수 있다. 


클래스의 필드나 메소드의 경우 제약 없이 사용이 가능하지만, 로컬 변수는 제약이 있다. 로컬 변수 혹은 매개 변수를 읽는 것 까지는 가능


하지만 이 변수의 값들을 변경할 수 없다.



4. 표준 API의 함수적 인터페이스에 관하여 사용이 가능하다.


즉 하나의 메소드만을 가지고 있는 인터페이스 또한 익명 구현 객체로 표현이 가능하다는 소리이다. 



5. 람다식은 메소드를 참조할 수 있다.


예를 들어 두 개의 값을 더하는 람다식이라고 하면 (a,b)->{return a+b};라는 익명 구현 객체를 만들수도 있지만, Math::max; 라는 식으로도 


Math의 메소드를 참조할 수 있다.


참조할 때에도 법칙이 있다.


정적 메소드(static)를 참조하는 경우 [클래스 :: 메소드], 일반 메소드일 경우 [인스턴스 :: 메소드]로 표현이 가능하다.



6. 람다식은 생성자 참조도 가능하다


생성자를 참조할 경우에는 [클래스 :: new]의 형태로 기술한다 

학습목표

  • 커맨드 패턴을 통해 얻을 수 있는 이점에 대하여 생각해보자

커맨드 패턴 = 요청을 객체의 형태로 캡슐화하여 사용한다 정도랄까?


예를 들어 게시판을 만들 때 요청을 생각해보자. 요청은 여러 개로 나뉠 수 있다. 삭제 요청, 삽입 요청, 수정 요청 등 등 ..


이를 아래와 같이 각 요청에 따라 다르게 수행할 수 있는 객체로 만들 수 있다. 




다양한 요청들을 처리할 때는 요청을 받은 쪽은 Command의 어떠한 내부 흐름이 있는지 몰라도 되고, execute()만 실행해주면 된다.




이를 큐에 응용한다면 큐는 어떤 요청이 오더라도 execute()만 호출하면 될 것이다


[소스 : https://github.com/kimjongmo/DesignPattern/tree/master/021CommandPattern]

학습목표

  • 프록시를 왜 사용하는지 이해해본다.

proxy pattern = "대신 처리 해준다"


스프링의 AOP 개념을 듣다 보면 프록시라는 개념이 나옵니다. 핵심 기능과 공통 기능을 나누고 공통 기능과 다른 기능들을 설정해두고 프록시가 처리하도록 하는 패턴인 것 같습니다.


동영상에 "대리"라는 단어로 비유 하듯이 간단한 업무는 프록시(대리)에게 맡기는 것을 의미합니다.



구조도는 다음과 같습니다


[출처 : https://www.youtube.com/watch?v=Nc-3QUJicvo]

[소스 : https://github.com/kimjongmo/DesignPattern/tree/master/020ProxyPattern]



+ Recent posts