개발 일지 168

[Spring] 의존성 주입(Dependency Injection, DI)

Spring Framework의 3가지 핵심 프로그래밍 중 하나인 의존성 주입(DI)은 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴이다. 의존성 주입의 기본적인 의미는 '외부'에서 클라이언트에게 서비스를 제공하는 것이다. 즉, 객체가 필요로 하는 어떤 것을 외부에서 전달해주는 것으로 생각할 수 있다. 인터페이스를 사이에 둬서 클래스 단계에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입해서 유연성을 확보하고 결합도를 낮출 수 있게 해준다. 의존성을 주입하는 방법에는 생성자 주입, setter 주입, 필드 주입 등 정말 다양하다. 이 중에서 최근 가장 많이 쓰이는 방법은 생성자 주입이다. 그 이유는 다음과 같다. 우선 생성자 주입은 객체를 생성할 때 1번만 호출되므로 이후에 ..

[Java] 반복자(Iterator)

iterator의 사전적 의미는 '반복자'이며, 컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할을 한다. Collection 인터페이스에 정의된 iterator()를 호출하면, iterator 타입의 인스턴스가 반환된다. 따라서 Collection 인터페이스를 상속받는 List와 Set 인터페이스를 구현한 클래스들은 interator() 메서드를 사용할 수 있다. 다음은 iterator 인터페이스에 정의된 메서드이다. hasNext() : 읽어올 객체가 남아 있으면 true를 리턴하고 없으면 false를 리턴한다. next() : 컬렉션에서 하나의 객체를 읽어온다. 이 때, next()를 호출하기 전에 hasNext()를 통해 읽어올 다음 요소가 있는지 먼저 확인해야 한다. remove() : next..

개발 일지/Java 2023.01.04

[Java] Map<K, V>

Map 인터페이스는 키(key)와 값(value)으로 구성된 객체를 저장하는 구조를 가지고 있다. 구성된 객체를 Entry 객체라고 하는데, 이 객체는 키와 값을 각각 Key 객체와 Value 객체로 저장한다. Map에서 key와 value는 모두 객체이며, 기본타입일 수 없다. 또한, key가 다르면 value가 같아도 다른 entry로 간주한다. 여기서 모든 키는 고유한 값을 가진다. 따라서 키는 중복 저장될 수 없지만, 값은 중복 저장이 가능하다. 이는 키의 역할이 값을 식별하는 것이기 때문이다. Map 인터페이스를 구현한 클래스에는 HashMap, HashTable, TreeMap, SortedMap 등이 있고 HashMap은 가장 대표적인 클래스이다. HashMap HashMap Map 인터페이..

개발 일지/Java 2023.01.04

[Java] Set<E>

Set 인터페이스를 구현한 모든 Set 컬렉션 클래스는 다음과 같은 특징을 가진다. 요소의 저장 순서를 유지하지 않는다. 같은 요소의 중복 저장을 허용하지 않는다. 대표적인 Set을 구현한 클래스는 HashSet, TreeSet이 있다. HashSet HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스 중 하나이며, 알고리즘(hash algorithm)을 사용하여 검색 속도가 매우 빠르다는 장점이 있다. 역시 Set 인터페이스의 특성을 그대로 물려받기 때문에 중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않는다. 다음은 HashSet에 값을 추가할 때 해당 값이 중복된 값인지 판단하는 과정이다. add(Object o)를 통해 객체를 저장하고자 한다. 이 때, 저장하고자 하는 객..

개발 일지/Java 2023.01.04

[Java] List<E>

List 인터페이스는 배열과 같이 객체를 일렬로 늘어놓는 구조를 가지고 있으며 List 컬렉션 클래스는 다음과 같은 특징을 가진다. 요소의 저장 순서 유지 같은 요소의 중복 저장 허용 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색, 추가, 삭제할 수 있는 등의 여러 기능을 제공한다. List 인터페이스를 구현한 클래스는 ArrayList, Vector, LinkedList, Stack 등이 있다. ArrayList ArrayList는 컬렉션 프레임워크에서 가장 많이 사용되는 컬렉션 클래스 중 하나이다. JDK 1.2부터 제공된 ArrayList 클래스는 내부적으로 배열을 이용하여 요소를 저장한다. 기능적으로는 Vector와 동일하지만 기존의 Vector..

개발 일지/Java 2023.01.04

[Java] 컬렉션 프레임워크(Collection Framework)

자바에서 컬렉션 프레임워크(collection framework)란, 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 말한다. 즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현한 것이다. 컬렉션 프레임워크는 특정 자료 구조에 데이터를 추가하고, 삭제하고, 수정하고, 검색하는 등의 동작을 수행하는 편리한 메서드들을 제공해준다. 따라서, 컬렉션 프레임워크가 제공하는 다양한 인터페이스와 구현 클래스를 활용하면 보다 객체 지향적이고 재사용성 높은 코드를 작성할 수 있다. 컬렉션 프레임워크의 구조 컬렉션 프레임워크는 자바의 인터페이스를 사용하여 구현된다. 다음은 핵심이 되는 주요 인터페이스이다. List List는 데이터의 순서가 유..

개발 일지/Java 2023.01.04

[Java] 예외 처리(Exception Handling)

예외 처리(exception handling)란, 개발자가 예기치 못한 예외의 발생에 미리 대처하는 코드를 작성하는 것이다. 실행 중인 프로그램의 비정상적인 종료를 방지하고 정상적인 실행 상태를 유지하는 것이 목적이다. 자바에서는 예외가 발생하면 예외 클래스로부터 객체를 생성하여 해당 인스턴스를 통해 예외처리를 한다. 자바의 모든 에러와 예외 클래스는 Throwable 클래스로부터 확장되며, 모든 예외의 최고 상위 클래스는 Exception 클래스이다. 일반 예외 클래스(Exception) 런타임 시에 발생하는 RuntimeException 클래스와 그 하위 클래스를 제외한 모든 Exception 클래스와 그 하위 클래스를 가리킨다. 주로 외부의 영향으로 발생할 수 있는 것들로 I/O 입출력에 의해 발생..

개발 일지/Java 2023.01.04

[Java] 에러(Error)

프로그램을 만들거나 실행하다 보면 에러와 마주치는 상황이 자주 발생할 것이다. 에러(error)가 발생하면 프로그램은 의도한 대로 동작하지 않거나 심각한 경우에는 비정상적으로 종료되기도 한다. 에러가 발생하는 원인은 수없이 다양하며, 크게 외부적인 요인과 내부적인 요인으로 구분할 수 있다. 대표적인 외부적인 요인으로는 하드웨어의 문제, 네트워크의 연결 끊김, 사용자 조작 오류 등이 있고 내부적인 요인으로는 대표적으로 개발자의 코드 작성 에러가 있다. 컴파일 에러, 런타임 에러 코드를 작성하다 보면 IDE에서 빨간 줄로 잘못된 부분을 표시해주는 모습을 확인할 수 있다. 이러한 경우를 컴파일 에러(Compile Time Error)라고 하며, IDE에서는 아무런 경고를 보내주지 않았는데 코드를 실행한 시점에..

개발 일지/Java 2023.01.04

[Java] 제네릭(Generic)

자바 프로그래밍에서 제네릭(generic)이란, 데이터의 타입을 일반화한다는 것을 의미한다. 다양한 타입의 데이터를 저장할 수 있는 객체를 만들고자 한다면, 각 타입별로 클래스를 따로 생성해야 하지만 제네릭을 사용하면 단 하나의 클래스만으로 모든 타입의 데이터를 저장할 수 있는 인스턴스를 만들 수 있다. 제네릭은 클래스와 메서드에 다음과 같은 방법으로 선언할 수 있다. class Basket { private T item; public Basket(T item) { this.item = item; } public T getItem() { return item; } public void setItem(T item) { this.item = item; } } 위 코드에서 사용된 T는 타입 변수이며, 임의의 ..

개발 일지/Java 2023.01.04

[Java] 열거형(enumerated type, enum)

열거형(enum)은 여러 상수들을 보다 편리하게 선언할 수 있도록 만들어진 자바의 문법요소이다. 주로 서로 관련 있는 내용들을 모아서 한 번에 간편하게 관리할 때 사용한다. enum은 JDK 1.5 이상의 버전에서만 사용이 가능하다. 이전의 버전에는 enum 문법을 지원하지 않았기 때문에 여러 상수를 정의해서 사용하기 위해서는 public static final을 통해 전역변수로 상수를 설정해서 사용했다. 하지만 이러한 방식은 상수명이 중복되는 경우가 종종 발생할 수 있고 컴파일 에러를 유발한다. 이 문제는 인터페이스를 사용해서 상수를 구분함으로써 해결할 수 있지만, 타입 안정성이라는 새로운 문제가 발생한다. 따라서, 이러한 모든 문제를 해결하기 위해 만들어진 것이 enum이다. 즉, 자바에서 열거형은 ..

개발 일지/Java 2023.01.04