- 

'Java' 카테고리의 다른 글

JDK, JVM 이해하기  (0) 2022.12.01
16. Java, 제네릭(Generics)  (0) 2022.11.08
15. Java(컬렉션), 스택, 큐, ArrayDeque  (0) 2022.11.08
14. Java(컬렉션), 리스트, 셋, 맵  (0) 2022.11.08
13. Java, 컬렉션(Collection)  (0) 2022.11.08

 1) 제네릭(Generics)란?

 다양한 타입의 객체를 다루는 메소드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능을 의미한다. 객체의 타입을 컴파일 시 체크하기 때문에 안정성이 높아진다. 다룰 객체의 타입을 미리 명시하여 객체의 형변환을 사용할 필요없게 해준다. 

 제네릭은 다음과 같은 형식을 따른다

public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}

public <T> 메소드명(value) {...}

 자주 사용하는 타입

<T> == Type
<E> == Element
<K> == Key
<V> == Value
<N> == Number
<R> == Result

 즉 제네릭은 크게 2가지의 장점을 가진다

 1) 타입의 안정성

 2) 불필요한 형변환을 줄여 코드 작성의 간결함

'Java' 카테고리의 다른 글

JDK, JVM 이해하기  (0) 2022.12.01
System.out.println(Object)가 뭐지?  (0) 2022.11.30
15. Java(컬렉션), 스택, 큐, ArrayDeque  (0) 2022.11.08
14. Java(컬렉션), 리스트, 셋, 맵  (0) 2022.11.08
13. Java, 컬렉션(Collection)  (0) 2022.11.08

1) 스택(Stack)

 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내는 자료구조이다, 이것을 LIFO(Last In First Out)이라고 한다. 

스택의 기본 자료 구조

 스택은 다음과 같이 선언한다.

import java.util.Stack;

Stack<자료형> 스택명 = new Stack();

 스택은 다음과 같은 메소드를 지원한다.

구분			설명
push(value)	스택에 값을 저장한다.
pop()		스택의 값을 제거한다.
clear()		스택의 값을 전부 제거한다.
peek()		스택의 마지막 값을 반환한다.
size()		스택의 크기를 반환한다.
empty()		스택이 비어있는지 반환한다.
contains(value)	스택에 데이터가 존재하는지 반환한다.

2) 큐(Queue)

 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게되는 FIFO(First In First Out)구조로 되어있다. 

큐의 기본 자료 구조

 큐는 다음과 같이 선언한다.

import java.util.LinkedList;
import java.util.Queue;

Queue<자료형> 큐명 = new LinkedList<>();

 큐는 다음과 같은 메소드를 지원한다.

구분			설명
push(value)	큐에 값을 저장한다.
poll()		큐의 값을 제거한다.
clear()		큐의 값을 전부 제거한다.
peek()		큐의 처음 값을 반환한다.

3) ArrayDeque

 스택의 문제점과 큐의 문제점을 보완하기 위해서 사용하는 자료 구조이다. 특히 LIFO의 구조를 만들 때, Stack 보다 선호되는 자료 구조이다.

ArrayDeque의 기본 자료 구조

 ArrayDeque는 다음과 같이 선언한다

import java.util.ArrayDeque;

ArrayDeque<자료형> 이름 = new ArrayDeque<>();

 ArrayDeque는 다음과 같은 메소드를 지원한다.

구분			설명
addFirst(value)		큐의 처음 위치에 데이터를 삽입하고, 데이터를 뒤로 한칸씩 움직여준다.
addLast(value)		큐의 마지막 위치에 데이터를 삽입한다.
offerFirst(value)	큐의 처음 위치에 데이터를 삽입하고, 데이터를 뒤로 한칸씩 움직여준다. 
			단, 큐의 크기에서 예외처리가 발생할 경우, Boolean 값을 반환한다.
offerLast(value)	큐의 마지막 위치에 데이터를 삽입한다. 
			단, 큐의 크기에서 예외처리가 발생할 경우, Boolean 값을 반환한다.
size()			큐의 크기를 반환한다.
removeFirst()		큐의 처음 데이터를 삭제하고 값을 반환한다.
removeLast()		큐의 마지막 데이터를 삭제하고 값을 반환한다.
poolFirst()		큐의 처음 데이터를 삭제하고 값을 반환한다.
poolLast()		큐의 마지막 데이터를 삭제하고 값을 반환한다.
peekFirst()		큐의 처음 데이터를 반환한다.
peekLast()		큐의 마지막 데이터를 반환한다.

'Java' 카테고리의 다른 글

System.out.println(Object)가 뭐지?  (0) 2022.11.30
16. Java, 제네릭(Generics)  (0) 2022.11.08
14. Java(컬렉션), 리스트, 셋, 맵  (0) 2022.11.08
13. Java, 컬렉션(Collection)  (0) 2022.11.08
12. Java(API), 시간 다루기  (0) 2022.11.07

 1) List

 저장된 요소들의 순서가 있고, 데이터에 중복이 가능하고 인덱스(index) 번호에 의해서 정렬된다.

  - 리스트는 컬렉션 인터페이스 중 하나이다.

  - 리스트는 2개의 종류로 나뉜다 (ArrayList, LinkedList)

  - 리스트는 크기 조절이 가능하다

  - 리스트는 초기 크기를 지정하지 않아도 된다.

  - 리스트의 삭제는 공간을 지우는 것이다.

 리스트(List)는 다음의 형식으로 사용한다.

import java.util.ArrayList;

List<자료형> 리스트명 = new ArrayList();

<>은 제네릭이라고 한다. jdk1.5부터 시행됐고, 1.5이전에는 제네릭이 없기 때문에 매 메소드마다 자료형을 캐스팅 해주었다.

 

 List의 주요 기능

구분			설명
List.add(value)		데이터를 리스트의 가장 마지막 인덱스에 추가한다.
List.add(index, value)	데이터를 지정한 인덱스에 값을 넣고 이후의 값을 한칸씩 뒤로 밀어준다.
List.set(index, value)	데이터를 지정한 인덱스 값을 치환하여 저장한다.
List.remove(index)	지정한 인덱스의 데이터 값을 삭제한다.
List.clear()		리스트의 전체 요소를 삭제한다.
List.get(index)		리스트의 인덱스 요소를 반환한다.
List.size()		리스트의 크기를 반환한다.

 

2) Set

저장된 요소들의 순서가 존재하지 않고, 중복된 데이터를 허용하지 않는 컬렉션 인터페이스이다. Set은 인덱스로 객체를 관리하지 않기 때문에, 데이터를 검색하기 위해서는 iterator() 메서드로 Iterator(반복자)를 생성하고 데이터를 가져와야한다.

 셋(Set)은 다음과 같은 형식으로 사용한다.

import java.util.Set;

Set<자료형> 셋명 = new HashSet<자료형>();

 Set은 다음과 같은 메소드를 지원한다.

구분			설명
Set.add(value)		데이터를 셋에 추가한다.
Set.contains(value)	셋에 해당 데이터가 존재하는지 반환한다.
Set.clear()		셋의 전체 요소를 삭제한다.
Set.iterator()		셋의 검색을 위한 반복자 생성.
Set.size()		셋의 크기를 반환한다.

3) Map

 맵은 키(Key)와 값(Value)을 하나의 데이터로 저장하는 특징을 가진다. 이를 통해 해싱(hashing)을 가능하게 하여 데이터를 검색하는데 뛰어난 성능을 보이는 인터페이스이다. 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 key를 통해 value를 얻기 때문에, 저장의 순서가 유지하지 않는다. 또한, key의 값은 중복을 허용하지 않고, value의 값은 중복을 허용한다.

 Map은 다음과 같은 형식으로 사용한다.

import java.util.HashMap;
import java.util.Map;

Map<Key, Value> map = new HashMap();

 Map은 다음과 같은 메소드를 지원한다.

구분				설명
Map.put(key,value)		데이터를 키를 입력받아 맵에 추가한다.
Map.get(key)			맵에 해당 키와 일차하는 데이터를 반환한다.
Map.containsKey(key)		맵에 해당하는 키가 있는지 확인하고, 존재하면 해당 데이터를 반환한다.
Map.containsValue(value)	맵에 해당하는 데이터를 가진 키가 하나 이상 존재하는지 반환한다.
Map.remove(key value)		맵에 해당하는 키값의 데이터를 제거한다.
Map.clear()			맵의 전체 요소를 삭제한다.
Map.size()			맵의 크기를 반환한다.

'Java' 카테고리의 다른 글

16. Java, 제네릭(Generics)  (0) 2022.11.08
15. Java(컬렉션), 스택, 큐, ArrayDeque  (0) 2022.11.08
13. Java, 컬렉션(Collection)  (0) 2022.11.08
12. Java(API), 시간 다루기  (0) 2022.11.07
11. Java(기초), 예외 처리(Exception)  (0) 2022.11.07

 1) 컬렉션 프레임워크란?

 다수의 데이터를 다루기 위한 자료구조를 표현하고 사용하는 클래스의 집합. JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다. 다음은 Java 컬렉션 프레임워크의 상속구조를 나타낸다.

 2) 컬렉션 인터페이스와 자료구조

 콜렉션(Collection)은 모든 자료구조가 구현(implement)하는 인터페이스이다. 

구분		설명
----------------------------------------------------------------------------------------
List		순서가 있는 데이터의 집합이며, 데이터의 중복을 허용한다
Set		순서를 유지하지 않는 데이터의 집합이며, 데이터의 중복을 허용하지 않는다.
Map		키(Key)와 값(Value)의 쌍우로 이루어진 데이터의 집합이다.
		순서는 유지하지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.
Stack		마지막에 넣은 데이터를 먼저 꺼내는 자료구조이다. LIFO를 따른다.
Queue		먼저 넣은 데이터를 먼저 꺼내는 자료구조이다. FIFO를 따른다.

 

- 컬렉션 인터페이스에는 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고 삭제하는 등 데이터를 다루은데 기본적인 메소드를 정의한다.

 java에서 제공하는 클래스중 날짜, 시간 정보를 제공해주는 클래스가 존재한다. 크게 3가지 종류가 있는데 다음과 같다

구분		용도
---------------------------------------------------------------
LocalDate	날짜 정보만 필요할 때 사용
LocalTime	시간 정보만 필요할 때 사용
LocalDateTime	날짜 정보와 시간 정보 둘다 필요할 때 사용

(1) LocalDate

// 로컬 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체를 리턴
LocalDate curDate = LocalDate.now(); // result : 2022-11-07;

// 파라미터로 주어진 날짜 정보를 저장한 LocalDate 객체를 리턴
LocalDate newDate = LocalDate.of(2022,11,06) // result : 2022-11-06

(2) LocalTime

// 로컬 컴퓨터의 현재 시간 정보를 저장한 LocalDate 객체를 리턴. 
LocalTime currentTime = LocalTime.now();	// reuslt : 18:57:29.670239400

// 파라미터로 주어진 시간 정보를 저장한 LocalTime 객체를 리턴.
LocalTime targetTime = LocalTime.of(22,50,55); 	// result : 22:50:55
// 끝에 4번째 매개변수는 nanoSecond 인데 선택 값이다 굳이 쓰지 않아도 된다.

(3) LocalDateTime

// 로컬 컴퓨터의 현재 날짜와 시간 정보
LocalDateTime currentDateTime = LocalDateTime.now();	// result : 2022-11-07T18:57:29.670239400

LocalDateTime targetDateTime = LocalDateTime.of(2019, 11, 12, 12, 32, 22);
// result : 2022-11-06T13:22:57
// 여기도 second,nanoSecond 매개변수는 필수가 아닌 선택입니다.

- 날짜 더하기

  LocalDateTime에서는 몇일 후, 몇년 후 등 코드에서 사용할만한 날짜가 있기때문에, 메소드를 활용하여 날짜를 더하거나 빼줄 수 있다. 사용할 수 있는 메소드는 다음과 같다.

method			description
--------------------------------------------------------------------------------------
plusYears()		년
minusYears()		년
plusMonths()		개월
minusMonths()		개월
plusWeeks()		주
minusWeeks()		주
plusDays()		날짜
minusDays()		날짜
plusHours()		시
minusHours()		시
plusMinutes()		분
minusMinutes()		분
plusSeconds()		초
minusSeconds()		초
plusNanos()		밀리초
minusNanos()		밀리초

 

(4) 날짜 표기형식 변경

 DateTimeFormmater 클래스를 활용해 다양한 표기형식을 표현할 수 있다. 만약 내가 원하는 형식이 있다면 임의의 형식을 다음 메소드를 통해 만들 수 있다

DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String myDate = newFormatter.format(LocalDate.now());
System.out.println(myDate); // result: 2022/11/07

 yyyy에는 년도, MM에는 월, dd에는 날짜를 대입해준다.

 (1) 예외 처리란?

 코드를 완성했다고 항상 프로그램이 성공적으로 작동하는 것은 아니다. 다양한 예외 상황이 발생할 수 있는데, 이것에 대응하기 위해 예외처리 코드가 필요하다. 즉, 예외의 발생으로 인해 프로그램의 비정상적인 종료를 막기위해, 또한, 개발자에게 알려 코드를 보완할 수 있도록 하기위해 예외 처리를 사용한다.

 자바는 상속을 이용해서 모든 예외를 표현한다. 모든 예외 클래스틑 Throwable의 자손 클래스다. Throwalbe 에는 크게 두종류의 자식 클래스가 있다. 

구분		설명
--------------------------------------------------------------------------------
Error		프로그램이 종료되어야 하는 심각한 문제를 표현한다. 
		대부분 컴퓨터나 JVM이 시스템적으로 동작할 수 없는 상황을 표현한다. 
Exception	프로그램이 종료되지 않지만, 예외나 문제상황을 표현하기 위해 사용한다.

 자바에는 미리 정의되어 있는 예외 클래스들이 있다. 기본적으로 이미 있는 것을 사용하되, Throwable 또는 그 하위 클래스를 상속받아 예외클래스를 정의할 수 있다.

예외처리 상속 구조

(2) 예외처리 형식

기본적으로 예외처리는 다음과 같은 형식으로 사용한다.

try {
    // 예외가 발생할 가능성이 있는 코드를 구현합니다.
} catch (FileNotFoundException e) {
    // FileNotFoundException이 발생했을 경우,이를 처리하기 위한 코드를 구현합니다.
} catch (IOException e) {
    // FileNotFoundException이 아닌 IOException이 발생했을 경우,이를 처리하기 위한 코드를 구현합니다.
} finally {
    // 예외의 발생여부에 관계없이 항상 수행되어야하는 코드를 구현합니다.
}

예시를 들면 다음과 같이 사용할수 있다.

class ArrayCalculation {

    int[] arr = { 0, 1, 2, 3, 4 };

    public int divide(int denominatorIndex, int numeratorIndex) {
        return arr[denominatorIndex] / arr[numeratorIndex];
    }
}

public class main {
    public static void main(String[] args) {
        ArrayCalculation arrayCalculation = new ArrayCalculation();

        System.out.println("2 / 1 = " + arrayCalculation.divide(2, 1));

        try{
            System.out.println(
                "1 / 0 = " + arrayCalculation.divide(1, 0)); // java.lang.ArithmeticException: "/ by zero"
        } catch (ArithmeticException e){
            System.out.println("잘못된 계산입니다. " + e.getMessage());
        }

        try{
        System.out.println("Try to divide using out of index element = "
                           + arrayCalculation.divide(5, 0)); // java.lang.ArrayIndexOutOfBoundsException: 5
        } catch (ArrayIndexOutOfBoundsException e){
            System.out.println(
                "잘못된 index 범위로 나누었습니다. 범위는 0부터"  +
                (arrayCalculation.arr.length - 1) +
                "까지입니다.");
        }
    }
}

 

위 코드의 결과

 

+ Recent posts