본문 바로가기

자바의 정석24

[자바의 정석] 14. 람다식 1. 람다식이란? 람다식(Lambda expression)은 메서드를 하나의 '식(expression)'으로 표현한 것이다. 람다식은 함수를 간단하면서도 명확한 식으로 표현할 수 있게 해준다. 람다식을 '익명 함수(anonymous function)'이라고도 한다. 모든 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야 하고, 객체도 생성해야만 비로소 메서드를 호출할 수 있다. 그러나 람다식은 이 모든 과정 없이 오직 람다식 자체만으로도 메서드의 역할을 대신할 수 있다. 람다식은 메서드의 매개변수로 전달되어지는 것이 가능하고, 메서드의 결과로 반환될 수도 있다. 람다식으로 인해 메서드를 변수처럼 다루는 것이 가능해졌다. *메서드는 함수와 같은 의미지만, 특정 클래스에 반드시 속해야 한다는 제약이.. 2023. 12. 30.
[자바의 정석] 12. 애너테이션(annotation) 3.1 애너테이션이란? 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이다. 애너테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공할 수 있다는 장점이 있다. '@'을 붙여서 사용한다. 미리 정의된 태그들을 이용해서 주석 안에 정보를 저장하고, javadoc.exe라는 프로그램이 이 정보를 읽어서 문서를 작성하는데 사용한다. 3.2 표준 애너테이션 애너테이션 설명 @Override 컴파일러에게 오버라이딩하는 메서드라는 것을 알린다. @Deprecated 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다. @SuppressWarnings 컴파일러의 특정 경고메시지가 나타나지 않게 해준다. @SafeVarargs 지네릭스 타입의 가변인자에 사.. 2023. 9. 30.
[자바의 정석] 12. 열거형(enums) 2.1 열거형이란? 열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다. *관련된 상수들을 같이 묶어 놓은 것. 자바는 타입에 안전한 열거형을 제공 class Card { enum Kind { CLOVER, HEART, DIAMOND, SPADE } //열거형 Kind를 정의 enum Value { TWO, THREE, FOUR } //열거형 Value를 정의 final Kind kind; //타입이 int가 아닌 Kind임에 유의하자. final Value value; } 자바의 열거형은 '타입에 안전한 열거형(typesafe enum)'이라서 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생한다. 이처럼 값뿐만 아디라 타입까지 체크하기 때문에 타입에 .. 2023. 9. 29.
[자바의 정석] 12. 지네릭스 1.1 지네릭스란? 지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬레션 클래스의 컴파일 시의 타입 체크(compile - time type check)를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다.(컴파일 한계를 넘어서게 해줌) *컴파일러에게 타입정보를 주는 것. 형변환 에러를 줄일 수 있다. 지네릭스의 장점 타입 안정성을 제공한다 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다. 간단히 얘기하면 다룰 객체의 타입을 미리 명시해줌으로써 번거로운 형변환을 줄여준다는 얘기다. 1.2 지네릭 클래스의 선언 지네릭 타입은 클래스와 메서드에 선언할 수 있다. 클래스에 선언하는 지네릭 타입 //일반 클래스 class Box {.. 2023. 9. 28.
[자바의 정석] 11. 컬렉션 프레임웍 - Properties / Collection 1.12 Properties Properties는 HashMap의 구버전인 Hashtable을 상속받아 구현한 것으로, Hashtable은 키와 값을 (Object, Object)의 형태로 저장하는데 비해 Properties는 (String, String)의 형태로 저장하는 보다 단순화된 컬렉션 클래스이다. 주로 애플리케이션의 환경설정과 관련된 속성(property)을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다. 그래서 간단한 입출력은 Properties를 활용하면 몇 줄의 코드로 쉽게 해결될 수 있다. Properties는 Hashtable을 상속받아 구현한 것이라 Map의 특성상 저장순서를 유지하지 않는다. *Iterator가 아닌 Enumeration을 사용 1.13 .. 2023. 8. 7.
[자바의 정석] 11. 컬렉션 프레임웍 - HashMap과 Hashtable / TreeMap 1.10 HashMap과 Hashtable HashMap은 Map을 구현했으므로 앞에서 살펴본 Map의 특징, 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다.(Hashtable은 Vector같은 존재 가능하면 HashMap사용) 그리고 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다. 키(key) : 컬렉션 내의 키(key) 중에서도 유일해야 한다. 값(value) : 키(key)와 달리 데이터의 중복을 허용한다. 해싱과 해시함수 해싱이란 해시함수(hash function)를 이용해서 데이터를 해시테이블(hash table)에 저장하고 검색하는 기법을 말한다. 해시함수는 데이터가 저장되어 있는 곳을 알려 주기.. 2023. 8. 7.
[자바의 정석] 11. 컬렉션 프레임웍 - HashSet / TreeSet 1.8 HashSet Set인터페이스를 구현한 가장 대표적인 컬렉션. 중복된 요소를 저장하지 않는다. HashSet의 특징을 이용하면 컬렉션 내의 중복 요소들을 쉽게 제거 가능 저장순서를 유지하지 않음. → 저장순서 유지하는 LinkedHashSet 사용 Set을 구현한 컬렉션 클래스는 List를 구현한 컬렉션 클래스와 달리 순서를 유지하지 않기 때문에 저장된 순서와 다를 수있다. 중복제거와 동시에 저장순서를 유지하고싶다면 LinkedHashSet을 사용 import java.util.*; class HashSet{ public static void main(String[] args){ Object[] objArr = {"1", new Integer(1), "2", "2", "3", "3", "4", ".. 2023. 8. 6.
[자바의 정석] 11. 컬렉션 프레임웍 - Arrays / Comparator와 Comparable 1.6 Arrays Arrays클래스에는 배열을 다루는데 유용한 메서드가 정의되어 있다. ❗Arrays에 정의된 메서드는 모두 static메서드이다. Arrays에 정의된 toString() static String toString(Object[] a) static String toString(int[] a) //그외 기본형 배열의 복사 - copyOf(), copyOfRange() copyOf() - 배열의 전체를 복사해서 새로운 배열을 만들어 반환 copyOfRange() - 배열의 일부를 복사해서 새로운 배열을 만들어 반환(끝은 포함x) int[] arr = [0,1,2,3,4}; int[] arr2 = Arrays.copyOf(arr, arr.length); //arr2=[0,1,2,3,4] in.. 2023. 8. 6.
[자바의 정석] 11. 컬렉션 프레임웍 - Iterator, ListIterator, Enumeration 1.5 Iterator, ListIterator, Enumeration 컬렉션에 저장된 요소를 접근(읽어오기)하는데 사용되는 인터페이스 Enumeration - Iterator의 구버전 / Listlterator - Iterator의 기능을 향상 시킨 것 Iteerator 컬렉션 프레임웍에서 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다. 컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator인터페이스를 정의하고, 컬렉션 인터페이스에는 ‘Iterator(Iterator를 구현한 클래스의 인스턴스)’를 반환하는 iterator()를 정의하고 있다. public interface Iterator{ boolean hasNext(); Object next(); void remove(); } pu.. 2023. 8. 6.
[자바의 정석] 11. 컬렉션 프레임웍 - Stack과 Queu 1.4 Stack과 Queue 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)구조로 되어있다. 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)구조로 되어있다. 순차적으로 데이터를 추가하고 삭제하는 스택에는 ArrayList와 같은 배열기반의 컬렉션 클래스가 적합. 큐는 데이터의 추가/삭제가 쉬운 LinkedList로 구현하는 것이 적합. 스택(Stack)은 클래스로 구현하여 제공하고 있음(Stack st = new Stack();) 큐(Queue)는인터페이스로만 정의해놓음 큐 인터페이스를 구현한클래스들을 사용하면 됨(Queue q = new LinkedList();) 스택과 큐의 활용 스택의 활용 예 수식계.. 2023. 8. 6.
[자바의 정석] 11. 컬렉션 프레임웍 - LinkedList 1.3 LinkedList 배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간(접근시간, access time)이 가장 빠르다는 장점을 가지고 있다. 단점 1. 크기를 변경할 수 없다. 크기를 변경할 수 없으므로 새로운 배열을 생성해서 데이터를 복사해야한다. 실행속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야 하므로 메모리가 낭비된다. 2. 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다. 차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만, 배열의 중간에 데이터를 추가하면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야 한다. 이러한 배열의 단범을 보완하기 위해 링크드 리스트(linked list)라는.. 2023. 8. 6.
[자바의 정석] 11. 컬렉션 프레임웍 - ArrayList 1.2 ArrayList ArrayList는 컬렉션 프레임웍에서 가장 많이 사용되는 컬렉션 클래스일 것이다. 이 ArrayList는 List인터페이스를 구현하기 때문에 데이터의 저장순서가 유지되고 중복을 허용한다는 특징을 갖는다. ArrayList는 기존의 Vector를 개선한 것으로 Vector와 구현원리와 기능적인 측면에서 동일하다고 할 수 있다. ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다.(데이터의 저장공간으로 배열을 사용 - 배열기반) ArrayList 소스코드 일부 Object배열을 멤버 변수로 선언하고 있다 선언된 배열의 타입이 모든 객체의 최고조상인 Object이기 때문에 모든 종류의 객체를 담을 수 있다. public class ArrayList extend.. 2023. 8. 6.