언어/Java
-
[Java] Comparator와 Comparable언어/Java 2021. 6. 13. 19:20
Comparator와 Comparable은 둘 다 객체를 정렬할 때 사용할 수 있는 기능입니다. 먼저 아래와 같이 객체가 존재한다고 가정합니다. public class Image { private final int type; private final String url; private final int idx; public Image(int type, String url, int idx) { this.type = type; this.url = url; this.idx = idx; } public int getIdx() { return idx; } } 다음 아래와 같이 리스트에 위 객체들을 입력합니다. List images = new ArrayList(); images.add(new Image(3, "/i..
-
[Java] 람다식 표현 (Lambda Expression)언어/Java 2021. 4. 4. 00:04
자바 8에서 도입된 개념으로 함수를 변수처럼 사용하는 사용하는 개념입니다. 함수를 변수처럼 사용하므로 파라미터로 다른 메소드에 전달할 수도 있고 반환값으로 함수를 받을 수 있습니다. 자바에서 람다식은 다른 스크립트 언어처럼 완전한 함수형 프로그래밍 방식은 아닙니다. 인터페이스 형식을 빌려서 람다식을 표현하기 때문에 함수형 프로그래밍의 장점을 완벽하게 가지지 못합니다. 장단점은 아래에서 설명합니다. 사용법 (매개변수1, 매개변수2, ...) -> {실행문...}매개변수의 이름은 자유롭게 정할 수 있고 타입을 명시하지 않아도 됩니다. -> 는 실행문에서 좌변에 설정한 값들을 보내 사용한다 라고 이해하면 쉽습니다. 예시 예시를 하기 위해 사전에 아래와 같은 코드가 작성되어 있다고 가정합니다. @Function..
-
[Java] Optional언어/Java 2021. 3. 14. 22:52
Optional 클래스는 객체를 포장해주는 래퍼 클래스로 모든 타입의 참조 변수를 담을 수 있습니다. Optional 객체를 사용하면 복잡한 조건문 없이 NullPointerException (;NPE) 예외 처리를 할 수 있습니다. 생성 Optional 객체 생성은 .empty(), .of(), .ofNullable() 이 있습니다. .of() 메소드를 사용해서 객체를 생성할 때, 인자값으로 null이 전달된다면 NPE가 발생하므로 null이 입력될 수도 있다면 안전하게 ofNullable() 메소드를 호출하는 것이 좋습니다. Optional op1 = Optional.empty(); // Optional.empty - null을 담고 있는 빈 객체 Optional op2 = Optional.ofNul..
-
[Java] Stream언어/Java 2021. 2. 27. 18:38
Stream 자바 8에서 추가된 스트림은 람다를 활용할 수 있는 기술 중 하나로 배열과 컬렉션을 함수형으로 처리할 수 있습니다. 스트림 생성 배열 String[] arr = new String[]{"1", "2", "3"}; Stream stream = Arrays.stream(arr); 컬렉션 List list = Arrays.asList("1", "2", "3"); Stream stream = list.stream(); stream.of stream.of() 메소드를 사용하면 스트림 객체를 바로 생성할 수 있습니다. Stream stream = Stream.of("1", "2", "3"); // [1, 2, 3] 빈 리스트 Stream stream = Stream.empty(); builder bui..
-
[Java] 제네릭 (Generic)언어/Java 2021. 1. 30. 19:16
제네릭은 JDK 1.5에서 첫 도입이 되었고 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법이며 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해줍니다. 즉, 타입을 외부에서 동적으로 정의할 수 있고 런타임에서 발생할 오류들을 컴파일 타임에 발견할 수 있도록 해줍니다.처음에는 제네릭에 대해 잘 몰랐을 때, 최상위 객체로 값을 받아서 형변환만 해주면 되지 않나? 라고 생각했는데 아래와 같은 한계를 보고 제네릭이 무엇인지 감을 잡았습니다.public class CustomArrayList { private int size; private Object[] data = new Object[3]; public void add(Object value) { data[siz..
-
[Java] Map 컬렉션언어/Java 2021. 1. 30. 17:48
Map 컬렉션은 key와 value로 구성된 Map.Entry 객체를 저장하는 구조를 가지고 있습니다. Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스입니다. 여기서 key와 value는 모두 객체입니다. key는 중복 저장될 수 없지만 value는 중복 저장될 수 있습니다. 기존 저장된 key와 동일한 key로 value를 저장하려 하면 기존 값은 사라지고 새로운 값으로 대체됩니다.HashMapHashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정의해야합니다. 객체가 달라도 동등 객체라면 같은 키로 간주하고 중복 저장되지 않도록 하기 위함입니다. 키와 값의 타입은 기본 타입(primitive type) 을 사용할 수 없고 클래..
-
[Java] Set 컬렉션언어/Java 2021. 1. 30. 17:25
List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않습니다. 또한 객체를 중복 저장할 수 없고 null도 단 1개만 저장합니다. Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없습니다. 대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 Iterator를 제공합니다. Iterator에서 하나의 객체를 가져올 땐 next() 메소드를 사용합니다.Set set = new HashSet(); set.add("김"); set.add("김"); // 중복 set.add("이"); set.add("박"); // [김, 이, 박] Iterator iterator = set.iterator(); // 방법 1 for (String str : set) { System.out...
-
[JAVA] 익명 객체언어/Java 2021. 1. 16. 20:12
익명 객체는 이름이 없는 객체입니다. 어떤 클래스를 상속하거나 인터페이스를 구현해야만 익명 객체를 만들 수 있습니다. /* 일반적인 케이스 */ // 상속 class 클래스이름1 extends 부모클래스 {...} 부모클래스 변수 = new 클래스이름1(); // 구현 class 클래스이름2 implements 인터페이스 {...} 인터페이스 변수 = new 클래스이름2(); /* 익명 객체 */ // 상속 부모클래스 변수 = new 부모클래스() {...}; // 구현 인터페이스 변수 = new 인터페이스() {...}; 익명 객체의 경우, 부모 클래스 변수는 이름이 없는 자식 객체를 참조하고 인터페이스 변수는 이름이 없는 구현 객체를 참조합니다.익명 자식 객체 생성부모 타입의 필드 또는 변수를 선언하..
-
[Java] 중첩 클래스와 중첩 인터페이스언어/Java 2021. 1. 16. 17:47
중첩 클래스는 클래스 내부에 선언한 클래스입니다. 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 사용할 수 있고 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있습니다. public class ClassName { class NestedClass { } } 인터페이스도 클래스 내부에 선언할 수 있는데 이를 중첩 인터페이스라 합니다. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 인터페이스를 만들기 위해서입니다.public class ClassName { interface NestedInterface { } }중첩 클래스클래스의 멤버로 선언되는 중첩 클래스를 멤버 클래스라 하고 메소드 내부에서 선언되는 중첩 클래스를 로컬 클래..
-
[Java] 인터페이스언어/Java 2021. 1. 10. 19:07
인터페이스는 객체의 사용 방법을 정의한 타입입니다. 인터페이스를 통해 다양한 객체를 동일한 사용 방법으로 이용할 수 있습니다. 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 합니다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킵니다. 그렇게 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 됩니다.개발 코드가 직접 객체의 메소드를 호출하면 간단한데 왜 중간에 인터페이스를 둘까?개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서입니다. 인터페이스는 하나의 객체가 아니라 여러 객체들과 사용하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴 값이 다를 수 있습니다. 따라서 개발 코드 측면에서는 코드..