java.io.FileNotFoundException (Permission denied) 에러 해결방법

  • 파일업로드 관련한 기능을 테스트 중, 특정 시점 이후로 해당 에러로그가 발생
  • 리눅스 서버의 특정 경로나 파일은 각각 읽기/쓰기/실행 권한이 존재하는데 이 권한이 없는 경우 발생
  • 테스트용 개발 서버의 일부 폴더 권한이 root로 변경되어 프로그램 권한으로는 접근 할수 없어서 발생했음
cd '/첨부파일저장경로'

ls -l  # 권한 확인
# 대상 파일이나 경로의 권한문제인 것으로 파악된다면, 소유자를 변경해준다.

chown -R '그룹':'사용자' ./  #  -R옵션은 재귀적으로(Resursive) 하위 폴더 소유자 모두 변경

ls -l # 정상적으로 변경되었는지 확인

 

'Java' 카테고리의 다른 글

[번역] JAVA Reflection  (0) 2022.11.21
자바프로젝트에서의 WEB과 WAS  (0) 2022.11.18
캡슐화(Encapsulation) in Java  (0) 2022.10.11
PriorityQueue in Java  (0) 2022.10.10
[번역] The Basics of Java Generics  (0) 2022.10.05

JAVA Reflection 

 
  • Reflection은 런타임에 메서드, 클래스 및 인터페이스의 동작을 검사하거나 수정하는 데 사용되는 API
  • 리플렉션에 필요한 클래스는 리플렉션을 이해하는 데 필수적인 java.lang.reflect 패키지에 존재
 
  • 리플렉션은 객체가 속한 클래스에 대한 정보와 객체를 사용하여 실행할 수 있는 해당 클래스의 메서드에 대한 정보를 제공합니다.
  • 리플렉션을 통해 사용된 접근 지정자(access specifier)와 상관없이 런타임에 메서드를 호출할 수 있습니다.
 
  • 리플렉션은 클래스, 생성자 및 메서드에 대한 정보를 가져오는 데 사용할 수 있습니다.
ClassConstructorsMethods
 The getClass() method is used to get the name of the class to which an object belongs.
The getConstructors() method is used to get the public constructors of the class to which an object belongs.
The getMethods() method is used to get the public methods of the class to which an object belong

 
이름과 매개변수 유형을 알고 있으면 리플렉션을 통해 메서드를 호출할 수 있습니다. 
 

getDeclaredMethod()

  • 호출할 메서드의 개체를 만듭니다.
Class.getDeclaredMethod(name, parametertype)
Parameters:
  • 객체를 생성할 메서드의 이름
  • 클래스 객체의 배열

 

invoke()

  • 런타임에 다음 메서드를 사용하는 클래스의 메서드를 호출합니다.
Method.invoke(Object, parameter)
  • 클래스의 메서드가 매개 변수를 허용하지 않으면 null이 인수로 전달됩니다.

 
리플렉션을 통해 클래스 개체의 도움으로 클래스의 개인 변수 및 메서드에 액세스하고 위에서 설명한 개체를 사용하여 메서드를 호출할 수 있습니다. 
 

Class.getDeclaredField(FieldName)

  • 프라이빗 필드를 가져오는 데 사용됩니다. 지정된 필드 이름에 대해 Field 유형의 객체를 반환합니다.
 

Field.setAccessible(true)

  • 필드와 함께 사용되는 접근제한자(access modifier)와 상관없이 필드에 액세스할 수 있습니다
 

 

Reflection API의 특징

  • Extensibility Features: 응용 프로그램은 정규화된 이름을 사용하여 확장성 개체의 인스턴스를 만들어 외부 사용자 정의 클래스를 사용할 수 있습니다.
  • Debugging and testing tools: 디버거는 리플렉션 속성을 사용하여 클래스의 전용 멤버를 검사합니다.
  • Performance Overhead: Reflective 작업은 상대적으로 성능이 느리므로 성능에 민감한 애플리케이션에서 자주 호출되는 코드 섹션에서는 피해야 합니다.
  • Exposure of Internals: 반영 코드는 추상화를 깨뜨리므로 플랫폼 업그레이드로 동작이 변경될 수 있습니다.
 

 

참고자료

 
 

WEB

  • 정적
  • 빠름
  • OS위에서 동작
  • 캐싱, 로드밸런싱
 

WAS

  • 동적
  • 아파치는 OS위의 JVM위에서 동작
  • nginX는 OS위의 node.js 위에서 동작
  • 느림
 

어플리케이션을 개발하기 위한 스펙과 구현

 

JAVA EE

  • 자바의 기본적인 기능을 정의한 Java SE에 웹 서버 역할을 추가한 것으로 자바 애플리케이션을 동작시킬 수 있는 컨테이너 등을 표준화한 스펙
 

Servlet

  • 자바에서 웹 어플리케이션을 개발하기 위한 기술 또는 스펙

구현

  • 정의된 스펙들을 만족시키는 구현체가 WAS
  • 자바에서는 Tomcat, JEUS, Jetty 등이 있음
  • OS 위의 JVM 위의 WAS 위에 APP이 구동된다.
 

 

WEB 서버의 역할 

Reverse Proxy

  • 과거 L4스위치라는 하드웨어가 하는 역할(로드밸런서)
  • 사용자가 늘어날 때 응답하는 서버를 분산
  • 사용자가 어느 서버에서 응답을 받는지 모르게 숨김
  • 방화벽 분리 등 보안 상 유리함
  • 확장성이 좋아 많이 사용하는 구성

 

'Java' 카테고리의 다른 글

java.io.FileNotFoundException (Permission denied) 에러 해결방법  (0) 2023.02.20
[번역] JAVA Reflection  (0) 2022.11.21
캡슐화(Encapsulation) in Java  (0) 2022.10.11
PriorityQueue in Java  (0) 2022.10.10
[번역] The Basics of Java Generics  (0) 2022.10.05
캡슐화의 특징
  • 객체지향 프로그래밍의 핵심 개념 중 하나
  • 객체 상태가 외부로부터 숨겨진 상황에서 이 상태에 접근하는 공개(public) 매서드만 노출하는 기법
  • 캡슐화는 각 객체가 클래스 내에서 객체의 상태를 비공개로 유지할 때 성립
  • 정보 은닉 매커니즘
  • 느슨한 결합, 재사용성, 보안 및 테스트하기 쉬운 코드와 같은 이점을 제공
  • 접근 제어자로 구현
 
 

캡슐화의 장점

 

정보 은닉 (Data Hiding)

 구현 세부 사항을 숨김으로써 구성원의 액세스를 제한하는 방법. 사용자는 클래스의 내부 구현이나 클래스가 변수에 값을 저장하는 방법을 알 수 없다. 단지 setter 매서드에 값을 넘겨주면 그 값으로 초기화 된다는 것만 알 수 있다
 

유연성 증가

 요구 사항에 따라 읽기 전용 또는 쓰기 전용 클래스의 변수를 만들 수 있습니다. 변수를 읽기 전용으로 만들고 싶다면 setter 매서드를 생략하거나 변수를 쓰기 전용으로 만들고 싶다면 get 매서드를 생략해야 한다.
 

재사용성

 재사용하기 쉬우며 새로운 요구사항에 맞춰서 변경하기 쉽다.

 

테스트하기 쉽다.

 유닛 테스트를 하기 용이하다.
 

 

참고

 

'Java' 카테고리의 다른 글

[번역] JAVA Reflection  (0) 2022.11.21
자바프로젝트에서의 WEB과 WAS  (0) 2022.11.18
PriorityQueue in Java  (0) 2022.10.10
[번역] The Basics of Java Generics  (0) 2022.10.05
Java의 날짜와 시간  (0) 2022.09.28

 

 

PriorityQueue in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

PriorityQueue

 컬렉션 프레임워크로 구현된 PriorityQueue 클래스는 우선순위에 따라 객체를 처리하는 방법을 제공합니다.
 큐는 주로 선입선출 방식의 알고리즘을 따르지만, 종종 우선순위에 따라 처리해야 될 수도 있습니다. 그때 사용하는 것이 PriorityQueue입니다.
 

Example:

// PriorityQueue class
 
import java.util.*;
 
class GfG {
 
    public static void main(String args[])
    {
        // Creating empty priority queue
        Queue<Integer> pQueue
            = new PriorityQueue<Integer>();
 
        // Adding items to the pQueue
        // using add()
        pQueue.add(10);
        pQueue.add(20);
        pQueue.add(15);
 
        // Printing the top element of
        // the PriorityQueue
        System.out.println(pQueue.peek());
 
        // Printing the top element and removing it
        // from the PriorityQueue container
        System.out.println(pQueue.poll());
 
        // Printing the top element again
        System.out.println(pQueue.peek());
    }
}
 

Output:

10
10
15

 

특징

  • 우선순위 대기열에서 최대 ASCII 값이 높은 순으로 정렬
  • null을 허용하지 않음
  • PriorityQueue는 스레드로부터 안전하지 않기 때문에, 자바는 자바 멀티스레딩 환경에서 사용할 BlockingQueue 인터페이스를 구현하는 PriorityBlockingQueue 클래스를 제공
  • AbstractQueue, AbstractCollection, Collection 및 Object 클래스의 메서드를 상속

 
 

참고

 

'Java' 카테고리의 다른 글

자바프로젝트에서의 WEB과 WAS  (0) 2022.11.18
캡슐화(Encapsulation) in Java  (0) 2022.10.11
[번역] The Basics of Java Generics  (0) 2022.10.05
Java의 날짜와 시간  (0) 2022.09.28
HashMap getOrDefault(key, defaultValue) method  (0) 2022.09.27

원문


 

1. 개요

 JDK 5.0에서 Java Generic이 등장합니다. 제너릭은 버그를 줄이고 타입을 넘어선 추상적인 계층을 추가하는 용도로 추가되었습니다.
 

2. Generics의 필요성

 
예를 들어봅시다. 자바에서 Integer가 저장되는 list를 만든다고 할 때
아마 다음과 같이 코드를 작성할 것입니다.
 
List list = new LinkedList();
list.add(new Integer(1)); 
Integer i = list.iterator().next();
 
이 경우 컴파일러는 코드의 마지막 줄에 대해서 에러를 발생 시킬 것입니다. 어떤 데이터 타입이 반환 될지 모르기 때문입니다.
따라서 컴파일러는  명시적인 형변환을 요구할 것입니다.
 
Integer i = (Integer) list.iterator.next();
 
리스트에서 꺼낸 값이 Integer라는 보장이 없기 때문에 이러한 상황이 발생합니다.  리스트는 아무 Object나 될 수 때문에 타입의 안전을 위해 이러한 형변환이 필요하게 됩니다.
하지만 명시적 형변환은 코드를 지저분하게 만듭니다. 개발자 입장에서는 이 리스트에 담긴 값이 Integer라는 것을 알고 있기 때문입니다.
 
만약 개발자가 특정한 타입을 사용할 것이라는 의도를 표기 할 수 있고, 컴파일러가 그러한 타입들의 명확함을 보장 받을 수 있다면 어떨까요? 이러한 생각이 generic의 핵심 사상입니다.
 
위에서 작성한 코드의 첫 줄을 수정해 봅시다.
 
List<Integer> list = new LinkedList<>();
 
 diamond operator <>안에 타입을 넣어서 추가하여, Integer 타입 전용 리스트를 만들었습니다.
다른 관점에서 보자면, 리스트 안에서 특정 타입을 유지하도록 하여, 컴파일러가 컴파일 할 때 특정 타입을 강요하도록 만든 것입니다.
 
3. Generic Methods
제너릭을 단일 매서드 선언에 쓸 수 있을 뿐아니라, 여러 타입의 매개변수에 사용 할 수 있습니다. 컴파일러가 우리가 사용하는 어떤 타입이던 명확성을 보장해줍니다.
  • 제너릭 매소드는 매소드 선언의 반환 타입 앞에 타입 매개 변수(타입을 둘러싼 다이아몬드 연산자)를 가지고 있습니다.
  • 타입은 제한될 수 있습니다.
  • 제너릭 매서드는 메서드 시그니처에서 쉼표로 구분된 다른 유형의 매개 변수를 가질 수 있습니다.
  • 제너릭 매서드의 매소드 바디는 일반 매소드와 동일합니다.
 
이제 array를 list로 바꾸는 예제를 봅시다.
 
public <T> List<T> fromArrayToList(T[] a) {   
    return Arrays.stream(a).collect(Collectors.toList());
}
 
 매서드 시그니처 안의 <T>는 매서드가 제너릭 타입 T를 다루겠다는 것을 의미합니다. 이것은 심지어 void가 리턴되는 경우에도 필요합니다.
 
앞서 언급 했듯이 제너릭 타입을 한개 이상 사용하는 것이 가능합니다. 이 경우 우리는 모든 제너릭 타입을 매소드 시그니처에 추가해야만 합니다.
 
다음은 타입 T와 타입 G를 처리하기 위해 위의 코드를 변경한 것입니다.
 
public static <T, G> List<G> fromArrayToList(T[] a, Function<T, G> mapperFunction) {
    return Arrays.stream(a)
      .map(mapperFunction)
      .collect(Collectors.toList());
}
 
T 타입의 요소가 있는 배열을 G 타입의 요소가 있는 목록으로 변환하는 함수를 전달합니다. 예시는 Interger를 String으로 변환한 것입니다.
 
@Test
public void givenArrayOfIntegers_thanListOfStringReturnedOK() {
    Integer[] intArray = {1, 2, 3, 4, 5};
    List<String> stringList
      = Generics.fromArrayToList(intArray, Object::toString);
 
    assertThat(stringList, hasItems("1", "2", "3", "4", "5"));
}
 
Oracle의 권장 사항은 대문자를 사용하여 일반 타입을 나타내고 보다 설명적인 문자를 선택하여 공식적인 타입을 나타내는 것입니다. JAVA 컬렉션에서는 유형에 T, 키에 K, 값에 V를 사용합니다.
 

3.1. Bounded Generics

 
 타입 매개변수는Bounded 될 수 있음을 기억하십시오, 제너릭은 매서드가 허용하는 타입을 제한 할 수 있습니다.
 예를 들어 메소드가 타입과 모든 하위 클래스(upper bound) 또는 타입과 모든 상위클래스(lower bound)를 허용하도록 지정할 수 있습니다.
 
 upper-bounded type을 선언하려면 타입 뒤에 extends 키워드를 사용하고 그 뒤에 사용하려는 upper bound를 사용합니다.
 
public <T extends Number> List<T> fromArrayToList(T[] a) {
    ...
}
 
 여기서 extends 키워드를 사용하는 것은 타입 T가 클래스인 경우 upper bound를 확장(extends) 하거나 인터페이스의 경우 구현(implements )한다는 의미입니다.
 

3.2. Multiple Bounds

 
 타입은 여러 개의 upper bounds를 가질 수 있습니다:
<T extends Number & Comparable>
 
T에 의해 확장된 타입 중 하나가 class(예: Number)인 경우 bounds 목록의 첫 번째 항목에 넣어야 합니다. 그렇지 않으면 컴파일 타임 오류가 발생합니다.
 

4. Wildcards 사용하기

  와일드카드는 물음표 ?로 표시됩니다. Java에서는 알 수 없는 유형을 참조하는 데 사용합니다. 와일드카드는 제네릭과 함께 특히 유용하며 매개변수 유형으로 사용할 수 있습니다.
 그러나 먼저 고려해야 할 중요한 사항이 있습니다. 우리는 Object가 모든 자바 클래스의 상위 유형이라는 것을 알고 있습니다. 그러나 Object 컬렉션은 컬렉션의 상위 유형이 아닙니다.
 예를 들어 List<Object>는 List<String>의 상위 유형이 아니며 List<Object> 유형의 변수를 List<String> 유형의 변수에 할당하면 컴파일러 오류가 발생합니다. 이는 동일한 컬렉션에 이질적이 유형을 추가할 경우 발생할 수 있는 충돌을 방지하기 위한 것입니다.
 유형 및 해당 하위 유형의 모든 컬렉션에 동일한 규칙이 적용됩니다.
 
다음 예시입니다:
public static void paintAllBuildings(List<Building> buildings) {
    buildings.forEach(Building::paint);
}
 
 House가 Building의 하위 유형이더라도 House List에 이 방법을 사용할 수 없습니다.
 
 Building 타입 및 모든 하위 타입에 이 메소드를 사용해야 하는 경우, bounded wildcard가 이 문제를 해결 할 수 있습니다:
public static void paintAllBuildings(List<? extends Building> buildings) {
    ...
}
 
 이제 이 방법은 Building 타입 및 모든 하위 타입에서 작동합니다. 이를 상한 와일드카드(upper-bounded wildcard)라고 하며, 여기서 Building 유형은 upper bound입니다.
 
 알 수 없는 타입이 지정된 타입의 상위 유형이어야 하는 와일드카드를 지정할 수도 있습니다. 특정 타입이 뒤에 오는 super 키워드를 사용하여 하한을 지정할 수 있습니다. 예를 들어 <? super T>는 T의 슈퍼클래스(= T와 모든 부모)인 알 수 없는 유형을 의미합니다.
 

5. Type Erasure

 유형 안전성(type safety)을 보장하기 위해 제네릭이 Java에 추가되었습니다. 그리고 제네릭이 런타임에 오버헤드를 일으키지 않도록 하기 위해 컴파일러는 컴파일 타임에 제네릭에 타입 삭제(type erasure) 라는 프로세스를 적용합니다.
 
 유형 삭제는 모든 유형 매개변수를 제거하고 해당 범위로 대체하거나 유형 매개변수가 제한되지 않은 경우 Object로 바꿉니다. 이런 식으로 컴파일 후 바이트 코드에는 일반 클래스, 인터페이스 및 메서드만 포함되어 새로운 유형이 생성되지 않습니다. 컴파일 시 Object 유형에도 적절한 캐스팅이 적용됩니다.
 
type 삭제의 예시 :
 
public <T> List<T> genericMethod(List<T> list) {
    return list.stream().collect(Collectors.toList());
}
 
타입 삭제에 의하여 unbounded type T가 Object로 교체됩니다.
 
// for illustration
public List<Object> withErasure(List<Object> list) {
    return list.stream().collect(Collectors.toList());
}

// which in practice results in
public List withErasure(List list) {
    return list.stream().collect(Collectors.toList());
}
 
만약 타입이 bounded 되었다면, 타입은 컴파일 시점에 bound로 교체됩니다.
 
public <T extends Building> void genericMethod(T t) {
    ...
}
 
public void genericMethod(Building t) {
    ...
}
 
 

6. Generics and Primitive Data Types

 Java에서 제네릭의 한 가지 제한 사항은 유형 매개변수가 기본 유형이 될 수 없다는 것입니다.
 
다음 예시는 컴파일 되지 않습니다:
List<int> list = new ArrayList<>();
list.add(17);
 
기본 데이터 타입이 작동하지 않는 이유를 이해하려면 제네릭이 컴파일 타임 기능이라는 점을 기억하세요. 즉, 타입 매개변수가 지워지고 모든 제네릭 타입이 Object 타입으로 구현됩니다.
 
list의 add 매소드를 봅시다:
List<Integer> list = new ArrayList<>();
list.add(17);
 
add 매소드의 서명은 다음과 같습니다:
boolean add(E e);
 
그리고 다음과 같이 컴파일 됩니다.
boolean add(Object e);
 
따라서 타입 매개변수는 Object로 변환할 수 있어야 합니다. 기본 타입은 Object를 확장하지 않기 때문에 타입 매개변수로 사용할 수 없습니다.
 
그러나 Java는 기본 타입에 대한 boxed 유형을 제공하며, 이를 풀어서 사용하기 위한 autoboxing 및 unboxing 기능을 제공합니다.
 
Integer a = 17;
int b = a;
 
따라서 integer를 담을 수 있는 목록을 만들고 싶다면 다음 wrapper를 사용할 수 있습니다.
List<Integer> list = new ArrayList<>();
list.add(17);
int first = list.get(0);
 
컴파일 된 코드는 다음과 같습니다:
List list = new ArrayList<>();
list.add(Integer.valueOf(17));
int first = ((Integer) list.get(0)).intValue();
 
 
Java의 향후 버전에서는 제네릭에 대한 기본 데이터 유형을 허용할 수 있습니다. Project Valhalla는 제네릭 처리 방식을 개선하는 것을 목표로 합니다. 아이디어는 JEP 218에 설명된 대로 제네릭 전문화를 구현하는 것입니다.
 
 

7. 결론

Java Generics는 프로그래머의 작업을 더 쉽고 오류가 덜 발생하도록 해주는 Java 언어에 강력한 추가 기능입니다. 제네릭은 컴파일 시간에 타입 정확성을 적용해주는 장점이 있으며, 가장 중요한 점은 애플리케이션에 추가 오버헤드를 발생시키지 않으면서 제네릭 알고리즘을 구현할 수 있다는 것입니다.
 

 

Reference

 

'Java' 카테고리의 다른 글

캡슐화(Encapsulation) in Java  (0) 2022.10.11
PriorityQueue in Java  (0) 2022.10.10
Java의 날짜와 시간  (0) 2022.09.28
HashMap getOrDefault(key, defaultValue) method  (0) 2022.09.27
Java HashMap에서 Entry를 Remove하면 생기는 일  (0) 2022.09.26

Date, Calendar

날짜와 시간을 다루는 java.util.Date 클래스와 java.util.Calendar 클래스는 잘 사용되지 않는다.
그 이유는

  • 직관적이지 않은 요일 상수, 월 상수
  • 기본적으로 불변이 아니기에 멀티스레스에 안전하지 않음
  • SimpleDateFormat의 기묘한 에러 처리

LocalDate, LocalTime, LocalDateTime

java8에서 추가된 날짜와 시간 관련 클래스

.now()

LocalDate localDate = LocalDate.now();
System.out.println("localDate: "+localDate);

LocalTime localTime =LocalTime.now();
System.out.println("localTime: "+localTime);

LocalDateTime localDateTime =LocalDateTime.now();
System.out.println("localDateTime: "+localDateTime);

.of()

LocalDate localDate = LocalDate.of(2022,09,27);
System.out.println("localDate: "+localDate);

LocalTime localTime =LocalTime.of(23,12,56,234);
System.out.println("localTime: "+localTime);

LocalDateTime localDateTime =LocalDateTime.of(2022,09,27,23,12,56,234);
System.out.println("localDateTime: "+localDateTime);

LocalDate localDateNov = LocalDate.of(2022, Month.SEPTEMBER,27);
System.out.println("localDateNov: "+localDateNov);

.plus .minus 더하고 빼기

System.out.println("Today: "+LocalDate.now());
LocalDate todayPlus10Days=LocalDate.now().plusDays(10);
System.out.println("localDatePlus10: "+todayPlus10Days);

System.out.println("Time Now: "+LocalTime.now());
LocalTime nowMinus20Minutes=LocalTime.now().minusMinutes(20);
System.out.println("nowMinus20Minutes: "+nowMinus20Minutes);

System.out.println("Date-Time Now: "+LocalDateTime.now());
LocalDateTime nowPlus2Years =LocalDateTime.now().plusYears(2);
System.out.println("todayPlus2Years: "+nowPlus2Years);

.with()

System.out.println("Today: "+LocalDate.now());
LocalDate dayOfMonth20=LocalDate.now().withDayOfMonth(20);
System.out.println("Day of month set as 20: "+dayOfMonth20);

System.out.println("Time Now: "+LocalTime.now());
LocalTime minute0=LocalTime.now().withMinute(0);
System.out.println("Minutes set to 0: "+minute0);

System.out.println("Date-Time Now: "+LocalDateTime.now());
LocalDateTime month10 =LocalDateTime.now().withMonth(10);
System.out.println("Month set to 10: "+month10);

.get() 개별 값 꺼내기

System.out.println("Today: "+LocalDate.now());
int dayOfMonth=LocalDate.now().getDayOfMonth();
System.out.println("Day of month is: "+dayOfMonth);

System.out.println("Time Now: "+LocalTime.now());
int minute=LocalTime.now().getMinute();
System.out.println("Minutes value is: "+minute);

System.out.println("Date-Time Now: "+LocalDateTime.now());
Month month = LocalDateTime.now().getMonth();
System.out.println("Month value is: "+month.getValue());

참고자료

java 날짜 관련 Date,Calendar,SimpleDateFormat 문제점 by 코드 다이버
Java의 날짜와 시간 API
기본기를 쌓는 정아마추어 코딩블로그:티스토리
Java 8 – Working with LocalDate, LocalTime, LocalDateTime – tutorial with examples

getOrDefault(Object key, V defaultValue) 매서드는 맵 인터페이스의 매서드이며, hashMap 클래스로 구현된다.

default V getOrDefault(Object key, V defaultValue)

매개변수

  • 첫번째 인자 : 값을 가진 요소들의 키값
  • 두번째 인자 : 특정 키에 해당하는 값이 없을 경우, 대신 반환되는 값

Program 1:

import java.util.*;

public class GFG {

    public static void main(String[] args)
    {

        // HashMap 생성, 요소 추가
        HashMap<String, Integer> map
            = new HashMap<>();
        map.put("a", 100);
        map.put("b", 200);
        map.put("c", 300);
        map.put("d", 400);

        System.out.println("HashMap: "
                           + map.toString());

        // getOrDefault 매서드 사용
        int b = map.getOrDefault("b", 500); // 존재하는 key
        int y = map.getOrDefault("y", 500); // 존재하지 않는 key

        System.out.println("Returned Value: " + b); // 200
        System.out.println("Returned Value: " + y); // 500
    }
}

참고자료

HashMap getOrDefault(key, defaultValue) method in Java with Examples

docs.oracle Class HashMap<K,V>

'Java' 카테고리의 다른 글

캡슐화(Encapsulation) in Java  (0) 2022.10.11
PriorityQueue in Java  (0) 2022.10.10
[번역] The Basics of Java Generics  (0) 2022.10.05
Java의 날짜와 시간  (0) 2022.09.28
Java HashMap에서 Entry를 Remove하면 생기는 일  (0) 2022.09.26

+ Recent posts