1. final



1) 변수 : 변수가 초기화된 이후 변경되지 않는다.



2) 클래스 : 이 클래스는 서브클래스를 가지지 않는다. 다시 말해 이 클래스를 상속할 수 없다.




3) 메소드 : 해당 메소드는 서브 클래스에 의해 오버라이딩 되지 않는다.





2.finally



1) try - catch : try 혹은 catch가 실행된 후 실행



finalize



가비지 컬렉션에서 객체를 destroy 또는 delete 하기 전에 호출하는 메소드이다. 데이터베이스 커넥션이나,  네트워크 커넥션 같은 연관된 자원들을 해제한다. 기본적으로 Object에 선언되어 있으므로, 모든 객체는 finalize를 가지고 있다.



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

final, finally, finalize  (0) 2018.11.20
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

1. 람다 없이 기본 소팅


소팅은 Collections의 소팅을 이용하며, 사용 시 익명함수를 마들어 사용한다.




2. 람다를 이용한 소팅


다음 예제는 람다를 이용하여 익명함수를 작성하는 것이다.


(추가적으로 1의 예제에서 Collections의 sort api를 사용했지만 2번에서는 List의 sort api를 사용하였다.)


3. 타입 정의 없이 사용하기


 2번예제에서 익명함수를 구현할 때 구체적인 타입을 명시해주는 부분이 있는데, 이 부분을 타입 명시 없이도 사용가능하다



4. Static 메소드를 참조하여 사용하기


 람다에서 static 메소드를 참조하는 법을 배워보자. sort함수를 static으로 작성하고 이를 참조하여 작성하면 아래와 같다.



5. 리버스 소팅


 JDK 8에서부터 역소팅을 지원한다. 

  



6. Multiple comparators


JDK8에서부터 체이닝 형식으로 다중 비교를 할 수 있도록 제공합니다.




[출처 : https://www.baeldung.com]



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

final, finally, finalize  (0) 2018.11.20
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
  • Map의 자료구조


Key / Value 형태


  • Map의 종류
  1. HashMap

    - Key, value에서 null값을 허용한다.

    - 저장된 순서를 보장하지 않는다.key값의 소팅으로 저장됨( 저장된 순서를 유지하고 싶다면 Linked를 통해 구현된 것을 이용)

    - get, put에 대하여 일정한 시간의 성능을 제공한다 -> O(1)

    - 동기화 되어 있지 않다.

    [해쉬 분포와 해쉬 충돌 : https://d2.naver.com/helloworld/831311]

  2. HashTable

    HashMap과 비슷하나 동기화 처리 되어있다(권장은 하지 않는다 concurrent된 것을 사용하자)

  3. TreeMap

    -
    블랙 레드 트리에 기초(이진 트리가 편향되지 않도록 만드는 조건이 달림)

    - 순서가 보장되지 않는다.

    - 동기화 되지 x

    - value로 null이 들어갈 수 있다.

    - 추가, 삭제에 대하여 O(log(n))

    - HashMap에 비해 메모리를 덜 잡아먹는다.










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

final, finally, finalize  (0) 2018.11.20
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

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


먼저 인터페이스와 추상 클래스(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]의 형태로 기술한다 

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



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



1. cmd 혹은 terminal을 열고


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


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


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


Maven이란?


Java기반 프로젝트의 *라이프사이클 관리를 목적으로 하는 빌드 도구이다. 컴파일과 빌드를 동시에 수행, 테스트를 병행하거나 서버 측 Deploy 자원을 관리할 수 있는 환경을 제공한다. 또한 라이브러리 관리 기능도 내포하고 있다. Java로 개발하다 보면 다양한 라이브러리를 필요로 하게 되는데, *pom.xml 파일에 필요한 라이브러리만 적으면 Maven이 알아서 다운받고 설치해주고 경로까지 지정해준다.


프로젝트를 진행하다 보면 라이브러리들을 많이 활용하게 됩니다. 점점 많아지는 라이브러리들을 일일히 관리하기 힘들어집니다. 하지만 Maven을 이용하게 된다면 코드 몇줄로 필요한 라이브러리를 작동시키고 그 라이브러리가 필요로 하는 다른 라이브러리(의존 라이브러리)들까지 자동으로 관리해줍니다. 


* Life cycle      : 논리적인 작업 흐름

* pom.xml       : Project Object Model, 메이븐이 프로젝트를 처리하는 필요한 정보를 제공하는 파일

* Artifact         : 프로젝트에 필요한 jar, war, pom 등등

* Deploy         : 아티페그를 로컬 저장소에 저장하는 행위


Maven의 활용


1. Build

- 소스 코드를 컴파일 한다

- 테스트 코드를 컴파일 한다

- 기타 패키지 생성을 위한 바이너리를 생성


2. Package

- 배포 가능한 jar, war, exe 파일 등을 생성


3. Test

- 단위 테스트(Unit test) 등을 실행


4. Report

- 빌드/패키지/테스트 결과를 정리하고, 빌드 수행 리포트를 생성


5. Release

- 빌드 후 생성된 아티팩트를 로컬 혹은 원격 저장소에 저장한다.



MAVEN 기초 사용법


http://javacan.tistory.com/entry/MavenBasic











출처 :

https://namu.wiki/w/Maven

https://www.slideshare.net/sunnykwak90/ss-43767933


+ Recent posts