csrf.pdf


정리한 파일입니다.

자바의 특징을 다시금 공부해야함을 느꼈다.


먼저 인터페이스와 추상 클래스(abstract)의 차이점을 생각해보면


 인터페이스

추상 클래스 

  •  implements(구현)을 함으로써 반드시 정의되어야 하는 메서드를 선언한다.
  • 다중 상속이 가능하다.
  • 추상 메서드뿐만 아니라 기본 메서드(default)도 가능( 버전 8이상)
  • default와 public 외에 접근제한을 가지지 못한다.
  • 상수를 가질 수 있다.
  • extends(상속)받음으로 반드시 정의되어야 하는 메소드를 선언한다.
  • 다중 상속이 불가능하다.
  • 기본 메서드(default)가 가능.
  • protected, public을 사용할 수 있다.
  • 상수 외에 필드를 가질 수 있다.



내가 다시금 배우면서 중요하다 생각했던 부분은 다음과 같다. 추상 클래스는 접근 제한(protected)을 이용하여 캡슐화의 특징을 이용할 수 있다는 것이였다. 


인터페이스는 기본적으로 public 메서드들밖에 정의하지 못하기에 이를 구현한 클래스들은 모두 public의 접근제한을 가지게 되고, 이는 외부에 제공하지 말아야 할 혹은 보여지면 안되는 것들에 대해 상관없이 공개되는 특징을 가지고 있다.


그래서 어제 다시 생각하게 되었던 점은 추상 클래스와 인터페이스를 이용하여 공개되어도 되는 메서드와 공개 되지 말아야 할 메서드들을 분리하여 구현할 수 있다는 점이다.


(*테스트할 때 주의해야 할점은 protected 접근제한자는 동일 패키지 및 상속 클래스에 한하여 접근이 가능하기 때문에 패키지를 따로 둘것.)



이렇게 세팅을 해놓은 상태에서 따로 패키지를 만들어 테스트를 진행한다.





전략 패턴과 같이 다형성을 이용하여 테스트를 해보면 인터페이스의 경우 실행이 잘 되지만, 캡슐화된 메서드들은 실행하지 못함을 알 수 있다.  


'Programming > JAVA' 카테고리의 다른 글

Comparison with Lambda  (0) 2018.10.29
자바 8 - Map  (0) 2018.10.19
캡슐화, 추상화, 인터페이스  (0) 2018.10.10
자바8 - List  (0) 2018.10.02
자바8 - 제네릭  (2) 2018.09.03
ArtifactTransferException: Failure to transfer ...  (0) 2018.08.27

 인터페이스

 설명

List 

 순서가 있음, 중복 허용

 Set

 순서가 없음, 중복 허용하지 않음

 Map<K,V>

 순서가 없음, Key의 중복을 허용하지 않음.



이 프레임워크중에서 List의 구현체들을 알아보자.



1) ArrayList


- 내부적으로 배열을 사용하여 요소들을 관리합니다.

- 배열을 사용함으로 검색 속도가 좋다.

- 값이 추가 혹은 삭제될 때 내부적으로 배열을 새로 만들어놓고 옮긴다.

- 추가 및 삭제에 대하여 시간이 오래걸림. (ex. 총 5개의 요소 중 3번째 요소를 삭제하면 뒤에 부분을 다시 앞으로 옮기고 옮기고..)


2) LinkedList


- 요소들끼리 링크를 통해 연결됨으로 삽입 삭제가 용이.(= 이중 연결리스트)

- 검색에는 불리하다. ( 앞, 뒤로 계속 링크를 타고 가야함으로..)


3) Vector


- ArrayList와 자주 비교되는데, 차이점은 동기화 여부에 있다.

- 싱글 스레드 환경에서는 ArrayList가 성능이 좋지만, 다중 스레드 환경에서는 ArrayList는 동기화를 보장하지 못하기 때문에, Vector를 사용하면 될 것 같지만... Vector 보다 성능이 우월하면서 동기화를 보장해주는 다른 방법들이 있기에 잘 사용하지 않는다

(궁금하면 한번 봐보시길)





ADD : capacity에 대해서 안썻구나.


capacity ->배열을 늘릴 때 얼만큼씩 늘릴 건지


ex) List가 공간이 부족하여 확보할 때 capacity만큼 확보한다.

'Programming > JAVA' 카테고리의 다른 글

자바 8 - Map  (0) 2018.10.19
캡슐화, 추상화, 인터페이스  (0) 2018.10.10
자바8 - List  (0) 2018.10.02
자바8 - 제네릭  (2) 2018.09.03
ArtifactTransferException: Failure to transfer ...  (0) 2018.08.27
자바 8 - 람다식  (0) 2018.08.19

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]



오라클XE를 설치하면 부팅시 자동으로 켜져서 은근히 불편함을 느끼게 된다..


메모리도 많이 잡아먹고, 톰캣 포트랑도 엇갈려서 계속 바꿔주기도 귀찮고 ㅋ


시작 -> '서비스' 검색 -> OracleServiceXE 랑 OracleXETNSListener를 찾아서 자동에서 수동으로 변경시켜주자.



"Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter"



위의 에러가 난다면 다음을 통해 확인해봅시다.



1. cmd 혹은 terminal을 열고


2. java -version 명령어를 통해 버전 확인


3. java 9를 사용하고 계시다면 java 8버전으로 바꿔서 시도해 주시길 바랍니다.


java 9에서 아직 작동하지 않는 것들이 많은가 봅니다..


+ Recent posts