반응형 Java21 [Java] 소스코드 탐험 - 2. ArrayList(feat. AbstractList) 두번째로 볼 친구는 Iterator에 이은 ArrayList ArrayList를 살펴보니 상당하다. AbstractList를 상속하고 있으며, List, RandomAccess, Cloneable, Serializable을 구현하고 있다. public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable 먼저 여기서 살펴볼건 1. ArrayList가 가변크기를 어떻게 유지하는지? 2. 어떻게 동시 수정을 판단하는지. private static final int DEFAULT_CAPACITY = 10; transient Object[] elementData; * transient :.. Java 2023. 7. 23. [Java] 소스코드 탐험- Iterator 처음으로 살펴볼 소스코드는 Iterator. 주로 List, Set등 Collection 프레임 워크에서 특정 객체를 삭제하고 싶을 때 사용했었다. 자바 1.8부터 지원하는 removeif라는 method를 통해서 쉽게 없앨 수 있는데... 있는줄도 모르고 Iterator를 사용했었다. 쨋든 Iterator ㄱ.ㄱ public interface Iterator { boolean hasNext(); //원소가 더 있으면 true E next(); // 다음 원소 return, 원소가 더 없으면 NoSuchElementException 리턴 /** * The behavior of an iterator is unspecified if the underlying collection * is modified wh.. Java 2023. 7. 23. [Java] List정렬(sort)/ Collections.sort, List.sort 1. Collections.sort public static void sort(List list) public static void sort(List list, Comparator Java 2023. 2. 11. [Java] 스트림 - Stream : 효율적인 데이터 다루기! 문제점 합계, 평균 등 데이터를 집계할 때, for 또는 Iterator를 활용해서 코드를 작성해왔다. 이러한 코드는 가독성이 떨어지고 번거롭다...(매우...같은 코드 짜다보면 너무 답답..) 또한, 데이터 소스마다 다른 방식으로 다뤄야 한다. 이러한 문제점!을 해결하기 위해 등장한 것이 Stream이다. → 데이터 소스마다 같은 방식으로 다룰 수 있도록 데이터를 추상화하고, 자주 사용되는 메서드를 정의해 놓았다. sum, average, min, max 등등 특징 : SQL의 쿼리 같은 느낌 - 스트림은 데이터 소스를 변경하지 않는다. abc.stream().~~~해도 abc라는 데이터 소스는 아무런 영향을 받지 않는다. stream은 읽기만 하는 것이다. - 스트림은 일회용이다. stream을 생성.. Java 2022. 9. 18. [Java] Optional<T>, Optional 타입 : 래퍼 클래스, 코드의 복잡성을 낮추다. Optional 는 지네릭 클래스로 T타입의 객체를 감싸는 래퍼 클래스이다. Optional 타입에는 모든 타입의 참조변수를 담을 수 있다. public final class Optional { private final T value; // T 타입의 참조변수 ... } } * java.util.Optional은JDK 1.8부터 추가됨. 장점 : Optional 클래스 사용 시 널 체크를 내부에서 처리하여 코드의 복잡도를 낮출 수 있다. isNull, nonNull, requireNonNull()과 같은 메서드를 통해서! → NullPointerException이 발생하지 않는 코드작성이 가능하다는 이야기이다! 관련 Method - Optional객체 생성 Optional.of(T) Optional.of.. Java 2022. 9. 4. [Java] Wrapper 클래스 : 기본 타입의 데이터를 객체로 취급하다.( 오토박싱, 오토언박싱) Wrapper(포장) 객체 : 기본 타입의 데이터를 포장하기 때문에 붙여진 이름이다. 래퍼 클래스가 사용되는 이유는 기본데이터 타입이 아닌 Object가 필요한 경우가 있기 때문이다. 기본 타입이 아닌 Object가 필요한 경우. 1. Generic에서 타입 파라미터로 참조타입(Reference Type)만 정할 수 있다. int, short, double 등 기본 타입(primitive type)은 올 수 없다. → 이와 같은 맥락으로 Collection 프레임 워크는 제네릭을 사용하기 때문에 객체 형태의 데이터만 파라미터로 올 수 있다. 그래서 우리가 ArrayList, ArrayList과 같이 사용하는 것이다. 2. 기본 자료형의 값을 문자열로 변환하는 경우, 혹은 반대의 경우 Double d = .. Java 2022. 9. 3. [Java] 람다식 - Lambda Expression Thread에서 Runnable을 접하면서 lambda식 형태를 처음 봤었다. 이후 안드로이드 UI, 파이썬 등을 하면서 종종 봤었는데, 사용하는 방법만 알고 넘어왔기 때문에 이번 글을 통해 정리를 하려한다. 람다식의 도입 람다식의 도입으로, 자바는 객체지향언어인 동시에 함수형 언어가 되었다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지기 때문에, 람다식을 익명함수라고도 한다. 함수형 인터페이스 자바에서 모든 메서드는 클래스에 포함되어야 한다. 람다식은 익명 클래스의 객체라 보면 된다. 람다식은 어떻게 불러와서 사용할 수 있을까? 타입이 있어야 하지 않을까? 그 타입을 함수형 인터페이스라 보면 편하다.(조금 더 내리면 좀 더 자세한 설명 있음) public interface MyFunct.. Java 2022. 8. 29. [Java] BigDecimal - Java에서 정밀한 숫자 표현하기 문제점 : Java 언어에서는 숫자를 표현하기 위해 int, long, double, float 등의 기본형을 사용한다. 이러한 기본형 중에 가장 많이 사용 되는 float, double형은 우리가 원하지 않는 결과를 보여주기도 한다. double a = 10.0000001; double b = 7.00010000; System.out.println(a + b); --> 결과 : 17.000100099999997 double과 float의 특징 이진 부동 소수점 연산에 사용되며, 넓은 범위의 수를 빠르게 정밀한 근사치를 구할 수 있도록 설계 되었다. 그 말인 즉, 정밀한 계산과는 맞지 않는다. 이는 이진수를 통해서 0.1과 10의 음의 거듭제곱수를 표현할 수 없기 때문에 발생한다. 10진수로 0.1은 2.. Java 2022. 8. 24. [Java] 문자열 split 할 때 마침표(.) : split(".") → split("//.") split()함수는 인자로, regex 정규식을 받는다. (이걸 몰랐네 ㄷ..ㄷ) "."은 정규식에서 아래와 같은 의미를 가지기 때문에 split에서 사용 시 원하는 결과를 얻을 수 없다. . matches any character (except for line terminators) 어떤 문자와도 매칭이 된다.(라인 터미네이터 빼고) 아래와 같이 프린트를 해보면 아무런 결과도 출력되지 않는다. t는 길이가 0 인 String 배열인 셈. public static void main(String[] args) { String path = "A.B.C"; String[] t = path.split("."); for (String a : t) { System.out.println(a); } } 포인트 : "... Java 2022. 8. 2. [Java] 폴더 생성 - File mkdir()/ mkdirs() 안녕하세요. 펄이라고 합니다. 원하는 폴더에 파일을 생성하는 기능을 구현하는 도중, 폴더 경로가 없을 경우에는 파일이 생성되지 않는 다는 것을 알게되었습니다. 이런 상황에서는 미리 폴더를 생성해야 하는데, mkdir을 쓰니 폴더가 생성되지 않았습니다. 상위 폴더가 있을 경우 폴더 생성 - mkdir() mkdir()은 상위 폴더가 있는 경우에만 폴더 생성이 가능합니다. 예를 들어 C:₩users₩a₩b폴더 생성을 원하는 경우 C:₩users₩a폴더가 이미 생성되어 있어야 합니다. import java.io.File; public class testMain { public static void main(String[] args) { File f = new File("C:\\test\\test"); // 생.. Java 2022. 6. 14. [Java 객체 지향 디자인 패턴] 10. 데커레이터 패턴 - 여러 기능의 조합 상속을 통한 기능의 확장은 각 기능별로 클래스를 추가해야 한다는 단점이 있다. -> 각 추가 기능 별로 개별적인 클래스를 설계하고 기능을 조합할 때 각 클래스의 객체 조합을 이용하여 기능의 확장을 하도록 한다. 정의 데커레이터 패턴은 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우게 각 추가 기능을 Decorator 클래스로 정의한 후 필요한 Decorator 객체를 조합함으로써 추가 기능의 조합을 설계하는 방식이다. 데커레이터 패턴은 기본 기능에 추가할 수 있는 많은 종류의 부가 기능에서 파생되는 다양한 조합을 동적으로 구현할 수 있는 패턴이다. 여기서 핵심은 컴포지션 관계에 있다. 주로 생성자를 통해서 component를 이어 받는데, 이를 통해서 기본 객체에 살을 덧붙여 갈 수 있다. - Co.. Java/Java 객체지향 디자인 패턴 2022. 5. 10. [Java 객체 지향 디자인 패턴] 9. 옵서버 패턴 - 통보의 캡슐화 옵서버 패턴 데이터의 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용하다. 예를 들어 새로운 파일이 추가되거나 기존의 파일이 삭제되었을 때 탐색기는 이를 즉시 표시할 피룡가 있다. 탐색기를 복수 개 실행하는 상황이나 하나의 탐색기에서 파일 시스템을 변경했을 때는 다른 탐색기에게 즉각적으로 이 변경을 통보해야 한다. 옵서버 패턴은 통보 대상 객체의 관리를 Subject 클래스와 Observer 인터페이스로 일반화 한다. 이를 통해 데이터 변경을 통보하는 클래스(ConcreteSubject)는 통보 대상 클래스나 객체(ConcreteObserver)에 대한 의존성을 없앨 수 있다. 결과적으로 옵서버 패턴은 통보 대상 클래스나 대상 객체의 변경에도 Concre.. Java/Java 객체지향 디자인 패턴 2022. 5. 9. 이전 1 2 다음 반응형