자바(SE)
-
이번 포스트에서는 JDK10에 추가된 특징을 살펴보자. JDK 10 로컬 변수에 var 타입 적용 local 변수를 선언할 때 var 키워드를 사용할 수 있게 되었다. 이때 var 키워드를 사용하면 변수에 타입을 명시적으로 선언하지 않아도 컴파일러가 변수의 초기값을 통해 타입을 유추한다.할당되는 값에 따라 타입이 추정된다. 특히 제네릭 타입과 깉이 복잡한 타입의 선언을 간소화 하는데 유용하다. public class LocalVar { public void method(){ var msg = "Hello"; System.out.println(msg.length()); } } 참고로 javascript의 var 처럼 할당되는 변수의 타입을 바꿀 수 있는 만행은 허용되지 않는다.(여전히java는 strong..
[JDK] 버전별 특징 - JDK10이번 포스트에서는 JDK10에 추가된 특징을 살펴보자. JDK 10 로컬 변수에 var 타입 적용 local 변수를 선언할 때 var 키워드를 사용할 수 있게 되었다. 이때 var 키워드를 사용하면 변수에 타입을 명시적으로 선언하지 않아도 컴파일러가 변수의 초기값을 통해 타입을 유추한다.할당되는 값에 따라 타입이 추정된다. 특히 제네릭 타입과 깉이 복잡한 타입의 선언을 간소화 하는데 유용하다. public class LocalVar { public void method(){ var msg = "Hello"; System.out.println(msg.length()); } } 참고로 javascript의 var 처럼 할당되는 변수의 타입을 바꿀 수 있는 만행은 허용되지 않는다.(여전히java는 strong..
2023.05.22 -
이번 포스트에서는 JDK의 버전별 특징에 대해서 살펴보자. 여러가지 특징들이 많겠지만 프로그래밍 하면서 자주 사용되는 것들만 할 계획이다. JDK 9 Try With Resources 문장 개선 기존의 Try With Resources는 autoclose되는 항목이 try 문장에 선언되어있어야 했다. 따라서 외부에서 전달받은 객체는 사용이 불가했다. private void jdk8(FileOutputStream output) { try (InputStream input = System.in) { int read = input.read(); output.write(read); } catch (IOException e) { e.printStackTrace(); } finally { try { if (outp..
[Java]버전 별 특징 JDK 09이번 포스트에서는 JDK의 버전별 특징에 대해서 살펴보자. 여러가지 특징들이 많겠지만 프로그래밍 하면서 자주 사용되는 것들만 할 계획이다. JDK 9 Try With Resources 문장 개선 기존의 Try With Resources는 autoclose되는 항목이 try 문장에 선언되어있어야 했다. 따라서 외부에서 전달받은 객체는 사용이 불가했다. private void jdk8(FileOutputStream output) { try (InputStream input = System.in) { int read = input.read(); output.write(read); } catch (IOException e) { e.printStackTrace(); } finally { try { if (outp..
2023.05.19 -
여러 버전의 JDK를 설치한 경우 컴파일 환경과 실행 환경의 JRE 버전이 일치하지 않으면 오류가 발생할 수 있다. 이번 포스트에서는 관련 오류를 정리해보자. 현재 환경 OS(Mac 기준) 현재 필자의 OS에는 JDK11과 JDK 17이 설치되어있다. Matching Java Virtual Machines (2): 17.0.3 (arm64) "Azul Systems, Inc." - "Zulu 17.34.19" /Library/Java/.../Home 11.0.17 (arm64) "Azul Systems, Inc." - "Zulu 11.60.19" /Library/Java/../Home 그리고 기본 설정으로는 JDK11이 적용되어있다.(JAVA_HOME 설정) ❯ java -version openjdk v..
[JAVA] JRE 버전 문제 정리여러 버전의 JDK를 설치한 경우 컴파일 환경과 실행 환경의 JRE 버전이 일치하지 않으면 오류가 발생할 수 있다. 이번 포스트에서는 관련 오류를 정리해보자. 현재 환경 OS(Mac 기준) 현재 필자의 OS에는 JDK11과 JDK 17이 설치되어있다. Matching Java Virtual Machines (2): 17.0.3 (arm64) "Azul Systems, Inc." - "Zulu 17.34.19" /Library/Java/.../Home 11.0.17 (arm64) "Azul Systems, Inc." - "Zulu 11.60.19" /Library/Java/../Home 그리고 기본 설정으로는 JDK11이 적용되어있다.(JAVA_HOME 설정) ❯ java -version openjdk v..
2023.02.19 -
이번 포스트에서는 generic에서 사용되는 와일드카드와 PECS(Produce-extends, Consumer-super)에 대해서 알아보자. 와일드 카드와 사용법 와일드 카드 Generic Type의 객체를 할당 받을 때 정확히 어떤 타입을 받아야 하는지 모를 경우 와일드 카드를 사용할 수 있다. 와일드 카드는 아래와 같이 3가지 형태로 사용할 수 있다. 표현 설명 Generic type 비 한정적 와일드 카드(unbounded wildcard): 타입에 제한이 없음(Object) Generic type pAll = pPer; // 타입 무관! 모두다 할당 가능 pAll = pSpi; pAll = pObj; GenericBox
[Generic]와일드카드와 PECS이번 포스트에서는 generic에서 사용되는 와일드카드와 PECS(Produce-extends, Consumer-super)에 대해서 알아보자. 와일드 카드와 사용법 와일드 카드 Generic Type의 객체를 할당 받을 때 정확히 어떤 타입을 받아야 하는지 모를 경우 와일드 카드를 사용할 수 있다. 와일드 카드는 아래와 같이 3가지 형태로 사용할 수 있다. 표현 설명 Generic type 비 한정적 와일드 카드(unbounded wildcard): 타입에 제한이 없음(Object) Generic type pAll = pPer; // 타입 무관! 모두다 할당 가능 pAll = pSpi; pAll = pObj; GenericBox
2023.01.19 -
배열과 리스트는 모두 선언 및 생성 시 어떤 타입을 담을 것인지 지정한다는 측면에서는 유사하다. Long [] longArray = new Long[2]; // Long 타입을 담는 배열 List longList = new ArrayList(); // Long 타입을 담는 List 하지만 내부적인 동작은 매우 다르다. 이번 포스트에서는 배열과 List의 차이점에 대해 살펴보자. (이 내용은 Effective Java 2E 규칙 25를 참조합니다.) 배열과 List의 차이점 covariant vs invariant 상속 관계에서 자료형의 참조를 설명할 때 covariant, invariant, contravariant라는 용어가 사용된다. covariant : 함께 변한다. invariant: 변하지 않는..
[Generic] 배열과 List<E>의 차이점배열과 리스트는 모두 선언 및 생성 시 어떤 타입을 담을 것인지 지정한다는 측면에서는 유사하다. Long [] longArray = new Long[2]; // Long 타입을 담는 배열 List longList = new ArrayList(); // Long 타입을 담는 List 하지만 내부적인 동작은 매우 다르다. 이번 포스트에서는 배열과 List의 차이점에 대해 살펴보자. (이 내용은 Effective Java 2E 규칙 25를 참조합니다.) 배열과 List의 차이점 covariant vs invariant 상속 관계에서 자료형의 참조를 설명할 때 covariant, invariant, contravariant라는 용어가 사용된다. covariant : 함께 변한다. invariant: 변하지 않는..
2023.01.19 -
Java는 Garbage-Collection에 의해 메모리 관리가 진행되기 때문에 특별한 상황이 아니면 메모리에 대한 고민을 할 필요가 없다. 그런데 간만에 알고리즘 문제를 풀다가 메모리 초과를 만나고 난 후 마상을 입고 JVM의 Heap Memory에 대해 정리해본다. 런타임 메모리 설정 메모리 크기 확인하기 JVM의 Heap 메모리도 파고 들자면 구분과 동작이 매우 다양, 복잡하지만 일반적으로 프로그래머의 관심은 전체 메모리가 얼마이고 현재 얼마가 사용중이며 남은 메모리는 얼마인가 정보일 것이다. 이를 위해 java.lang.Runtime class에서는 totalMemory()와 freeMemory() 메서드를 제공하며 사용중인 메모리를 알기 위해서는 totalMemory() - freeMemory..
[자바]JVM Heap Memory sizeJava는 Garbage-Collection에 의해 메모리 관리가 진행되기 때문에 특별한 상황이 아니면 메모리에 대한 고민을 할 필요가 없다. 그런데 간만에 알고리즘 문제를 풀다가 메모리 초과를 만나고 난 후 마상을 입고 JVM의 Heap Memory에 대해 정리해본다. 런타임 메모리 설정 메모리 크기 확인하기 JVM의 Heap 메모리도 파고 들자면 구분과 동작이 매우 다양, 복잡하지만 일반적으로 프로그래머의 관심은 전체 메모리가 얼마이고 현재 얼마가 사용중이며 남은 메모리는 얼마인가 정보일 것이다. 이를 위해 java.lang.Runtime class에서는 totalMemory()와 freeMemory() 메서드를 제공하며 사용중인 메모리를 알기 위해서는 totalMemory() - freeMemory..
2022.08.14 -
이번 포스트에서는 List와 List그리고 List에 대해서 알아보고 왜 raw type을 사용하면 안되는지 생각해보자. (이 글은 Effective Java 2판 규칙 23을 참조했습니다.) 다 같은거 아닐까? 이제는 쓰지 말아야할 row 타입의 List 그냥 List로 사용하는 경우 즉 무인자 자료형으로 사용하는 경우는 이제 지양해야 한다. 다음과 같이 String을 담기로 결심하고 작성한 rawListForString이 있다고 생각해보자. List rawListForString = new ArrayList(); // 문자열을 관리하자!! rawListForString.add("Hello"); 초기의 생각은 명확했지만 이 레퍼런스가 돌고 돌아 모진 풍파를 만나다보면 정체성은 모호해진다. 만약 아래와 ..
[Generic]raw 타입을 사용하지 말자.이번 포스트에서는 List와 List그리고 List에 대해서 알아보고 왜 raw type을 사용하면 안되는지 생각해보자. (이 글은 Effective Java 2판 규칙 23을 참조했습니다.) 다 같은거 아닐까? 이제는 쓰지 말아야할 row 타입의 List 그냥 List로 사용하는 경우 즉 무인자 자료형으로 사용하는 경우는 이제 지양해야 한다. 다음과 같이 String을 담기로 결심하고 작성한 rawListForString이 있다고 생각해보자. List rawListForString = new ArrayList(); // 문자열을 관리하자!! rawListForString.add("Hello"); 초기의 생각은 명확했지만 이 레퍼런스가 돌고 돌아 모진 풍파를 만나다보면 정체성은 모호해진다. 만약 아래와 ..
2022.07.24 -
이번 포스트에서는 람다식을 이용한 코드 축약의 최종판으로 메서드 참조와 생성자 참조에 대해서 살펴보자. 메서드 참조 메서드 참조란? 메서드 참조는 다른 코드에 전달하려는 동작을 수행하는 코드가 딸랑 어떤 메서드 하나만 실행하면 될 때 사용된다. 메서드 참조를 위해서는 :: 연산자를 이용하는데 ::의 형태로 사용한다. 파라미터_클래스::파라미터_클래스의_메서드 예를 들어 문자열의 배열이 있고 이에 대한 정렬 코드를 작성해보자. 이때 두 문자열을 비교할 때 파라미터인 String 클래스에 정의된 instance 메서드인 compareTo를 사용할 수 있다. 그리고 특별히 할 일이 없다면 아래처럼 실행문에서는 딸랑 o1.compareTo(o2)가 작성된다. String[] langs = { "Phyhon", ..
[람다표현식]메서드 참조와 생성자 참조이번 포스트에서는 람다식을 이용한 코드 축약의 최종판으로 메서드 참조와 생성자 참조에 대해서 살펴보자. 메서드 참조 메서드 참조란? 메서드 참조는 다른 코드에 전달하려는 동작을 수행하는 코드가 딸랑 어떤 메서드 하나만 실행하면 될 때 사용된다. 메서드 참조를 위해서는 :: 연산자를 이용하는데 ::의 형태로 사용한다. 파라미터_클래스::파라미터_클래스의_메서드 예를 들어 문자열의 배열이 있고 이에 대한 정렬 코드를 작성해보자. 이때 두 문자열을 비교할 때 파라미터인 String 클래스에 정의된 instance 메서드인 compareTo를 사용할 수 있다. 그리고 특별히 할 일이 없다면 아래처럼 실행문에서는 딸랑 o1.compareTo(o2)가 작성된다. String[] langs = { "Phyhon", ..
2022.07.13