문자 기반의 보조 스트림: (Buffered, InputStream, OutputStream) 읽기와 쓰기
·
자바/입출력 IO
1. BufferedReader와 BufferedWriter - 버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할을 한다. - 버퍼를 이용하면 입출력의 효율이 비교할 수 없을 정도로 좋아진다. - BufferedReader의 readLine()을 사용하면 라인 단위로 읽는다. - BufferedWriter의 newLine()을 사용하면 줄바꿈을 해준다. 1-1. BufferedReader와 BufferedWriter를 이해하기 위한 예제(1) ( 문장 끝 ';'이 포함된 구문만 출력되게 하였다. ) 2. InputStreamReader와 OutputStreamWriter - 바이트 기반 스트림을 문자 기반 스트림으로 연결시켜주는 역할을 한다. - 바이트 기반 스트림의 데이터를 지정된 인코딩의 ..
문자 기반 스트림: (File, Piped) Reader/Write
·
자바/입출력 IO
1. Reader와 Writer - 바이트 기반 스트림의 조상이 InputStream과 OutputStream인 것과 같이 문자 기반 스트림 에서는 Reader와 Writer가 그와 같은 역할을 한다. - byte 배열 대신 char 배열을 사용한다는 것 외에는 바이트 기반 스트림과는 다르지 않다. - 문자 기반 스트림은 단순히 2 byte로 스트림을 처리하는 것만을 의미하지 않고, 문자 데이터를 다루는데 필요한 또 하나의 정보는 인코딩이 있다. - 그러므로, Reader는 특정 인코딩을 읽어서 유니코드로 변환하고 Writer는 유니코드를 특정 인코딩 으로 변환하여 저장한다. 2. FileReader와 FileWriter - FileInputStream과 FileOutputStream의 방법이랑 다르지 ..
FilterOutputStream의 자손: Print 스트림(보조 스트림)
·
자바/입출력 IO
1. PrintStream - 데이터를 기반 스트림에 다양한 형태로 print, println, printf와 같은 메서드를 오버라이딩하여 제공한다. - 데이터를 적절한 문자로 출력하는 것이기 때문에, 문자 기반 스트림의 역할을 수행한다. - 사실, PrintStream보다 PrintWriter가 향상된 기능을 가지고 있기 때문에, 되도록이면 PrintWriter를 쓰는 것이 좋다. ( Tip) System클래스의 static 맴버 System.out, System.err가 PrintStream이다. ) - 아래는 PrintStream의 생성자를 설명한다. : 중요한 부분만 꼽아봤다. 자세한 내용은 894p를 참고한다. (1) PrintStream(OutputStream out) : 지정된 출력 스트림을..
InputStream의 자손: Sequence 입력 스트림(보조 스트림)
·
자바/입출력 IO
1. SequenceInputStream - 여러 개의 입력스트림을 연속적으로 연결해서 하나의 스트림으로부터 데이터를 읽는 것과 같이 처리할 수 있도록 도와준다. - 생정자를 제외하고는 나머지 작업들에 대한 입력스트림과의 메서드들은 다르지 않다. - 큰 파일을 여러 개의 작은 파일로 나누었다가 하나의 파일로 합치는 것과 같은 작업을 수행할 때 좋다. - 아래는 SequnceInputStream의 생성자이다. (1) SequnceInputStream(Enumeration e) : Enumeration에 저장된 순서대로 입력 스트림을 하나의 스트림으로 연결한다. (2) SequnceInputStream(InputStream s1, InputStream s2) : 두 개의 입력 스트림을 하나로 연결한다. - ..
바이트 기반의 보조 스트림의 자손: Data 입출력 스트림
·
자바/입출력 IO
1. DataInputStream과 DataOutputStream - Filter 입출력 스트림의 자손이며 DataInput 인터페이스와 DataOutput의 인터페이스를 각각 구현한 보조 스트림이므로, byte 단위가 아닌 8가지 기본 자료형의 단위로 읽고 쓸 수 있다. - 아래는 DataInputStream의 생성자와 메서드들을 설명한다. (1) DataInputStream(InputStream in) : InputStream의 인스턴스를 기반으로 하는 DataInputStream 인스턴스를 생성한다. (2) 기본자료형 read기본자료형() : 기본자료형에 해당 자료형을 넣으면 된다. : 더 이상 읽을 값이 없다면 EOFException을 발생시킨다ㅣ ( ex) boolean readBoolean()..
바이트 기반의 보조 스트림의 자손: Buffered 입출력 스트림
·
자바/입출력 IO
1. BufferedInputStream과 BufferedOutputStream - 앞서 봤을 수도 있겠지만, 이 보조 스트림은 입출력 효율을 높이기 위해 버퍼를 사용한다. - 즉, 한 바이트씩 입출력하는 것 보다는 버퍼를 이용해서 한 번에 여러 바이트를 입출력하는 것이 빠르다. - 아래는 Buffered 입력 스트림의 생성자이다. (1) BufferedInputStream(InputStream in) : InputStream의 인스턴스 in을 입력소스로 하며, 크기를 지정하지 않았으므로, 8192byte 크기의 버퍼를 갖게 된다. (2) BufferedInputStream(InputStream in, int size) : InputStream의 인스턴스 in을 입력소스로 하며, 지정된 size의 값 크..
바이트 기반의 보조 스트림의 조상: Filter 입출력 스트림
·
자바/입출력 IO
1. FilterInputStream과 FilterOutputStream - InputStream/OutputStream의 자손이면서 모든 보조 스트림의 조상이다. - 아래는 필터 입출력 스트림의 생성자이다. (1) Protected FilterInputStream(InputStream in) (2) public FilterOutputStream(OutputStream out) ( 필터 입출력 스트림의 모든 메서드는 단순히 기반 스트림의 메서드를 그대로 호출할 뿐이다. ) ( 즉, 그 자체로는 아무런 일도 하지 않음을 의미하기에, 상속을 통해 원하는 작업을 수행하도록 읽고 쓰는 오버라이딩해야 한다. ) ( (1)과 같이 Protected이기 때문에, 상속을 받았을 때 FilterInputStream의 인..
바이트 기반 스트림: File 입출력 스트림
·
자바/입출력 IO
1. 파일 입출력 스트림 - 실제 프로그래밍에서 많이 사용되는 스트림 중의 하나이다. - 아래는 FileInputStream의 생성자이다. (1) FileInputStream(String name) : 매개변수 name을 실제 파일과 연결된 FileInputStreamd을 생성한다. (2) FileInputStream(File file) : 파일의 이름이 String이 아닌 File 인스턴스로 지정해주어야 하는 점을 제외하고는 (1) 생성자와 동일하다. (3) FileInputStream(FileDescriptor fdObj) : 파일 디스크립터 매개변수로 FileInputStream을 생성한다. - 아래는 FileOutputStream의 생성자이다. (1) FileOutputStream(String n..
바이트 기반 스트림: Byte 입출력 스트림
·
자바/입출력 IO
1. InputStream과 OutputStream - 이제부터 본격적으로 바이트 기반 스트림의 메서드에 대한 예제를 해 볼 것이다. - 일단 먼저, InputStream의 메서드들을 알아보자. (1) int available() : 스트림으로부터 읽어 올 수 있는 데이터의 크기를 반환한다. (2) void close() : 스트림을 닫음으로써 사용하고 있던 자원을 반환한다. (3) void mark(int readlimit) : 현재 위치를 표시해 놓는다. : 후에 reset()에 의해서 표시해 놓은 위치로 다시 돌아갈 수 있다. : 그러므로, 매개변수 readlimit은 되돌아갈 수 있는 byte의 수이다. (4) void reset() : 스트림에서의 위치를 마지막으로 mark()이 호출되었던 위치..
보조 스트림과 문자 기반 스트림
·
자바/입출력 IO
1. 보조 스트림이란 - 보조 스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 입출력을 할 수 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다. - 그러므로, 주 스트림을 먼저 생성 후, 이를 이용해서 보조 스트림을 생성해야 한다. - 아래의 예시를 보고 이해하자. Ex) test.txt라는 파일을 읽기위해 FileInputStream을 사용할 때, 입력 성능을 향상시키기 위해 버퍼를 사용하는 보조 스트림인 BufferedInputStream을 사용하는 코드는 다음과 같다. FileInputStream fis = new FileInputStream("test.txt"); // 먼저 주 스트림을 생성한다. BufferedInptuStream bis = new BuffedInput..
입출력의 개념
·
자바/입출력 IO
1. 입출력이란? - 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말한다. - 예를 들면, 키보드로부터 데이터를 입력 받거나 System.out으로 화면에 출력을 띄우는 것이 있다. 2. 스트림 - 자바에서 입출력을 수행할 때, 어느 한쪽에서 다른 쪽으로 데이터를 전달하기 위해서 스트림을 사용한다. - 여기서 정의하는 스트림은 데이터를 운반하는데 사용되는 연결통로이므로, 앞에서 다뤘던 스트림과는 다르다. - 스트림은 물에 비유해서 따온 이름이기에, 한쪽 방향으로만 흐르는 것과 같이 단방향 통신만 가능하다. 그러므로, 입력과 출력을 동시에 처리할 수 없다. - 만약 동시에 수행하게 할려면, 입력 스트림과 출력 스트림 두 개가 필요하다. - 스트림은 먼저 보낸 데이터를 먼저 받게 되어..
Collector
·
자바/스트림
1. Collector 구현하기 - Collector를 구현한다는 것은 Collector 인터페이스의 메서드를 가지고 구현한다는 것인데, Collector 인터페이스는 아래와 같이 생겼다. Public interface Collector{ Supplier supplier(); // 작업 결과를 저장할 공간을 제공 BiConsumer accumulator(); // 스트림의 요소를 수집할 방법을 제공 BinaryOperator combiner(); // 두 저장공간을 병합할 방법을 제공(병렬 스트림) Function finisher(); // 결과를 최종적으로 변환할 방법을 제공 Set characteristics(); // Collector의 특성이 담긴 Set을 반환한다. .... } ( 직접 구현해야..
collect() 메서드(3) - groupingBy()
·
자바/스트림
1. groupingBy()에 의한 분류 - 아래의 코드처럼 그룹화를 하면 기본적으로 List에 담으며, toList()를 생략한다. Map stuByBan = Stream.of(stuArr) .collect(groupingBy(Stu3::getBan, toList())); // toList()가 생략 가능 !! Map stuByHak = Stream.of(stuArr) .collect(groupingBy(Stu3::getHak, toCollection(HashSet::new)); ( 또한 toSet()을 사용할 수도 있다. ) ( 아래의 Student의 정보가 있는 stu3클래스가 정의되어 있다고 가정하고 아래의 예제를 수행할 것이다. ) (1) 반별 기준으로 그룹화하기. (2) 성적별로 그룹화하기. ..
collect() 메서드(2) - partitioningBy()
·
자바/스트림
1. 그룹화와 분할 - groupingBy(), partitioningBy() - 그룹화는 스트림의 요소를 특정 기준으로 그룹화하는 것을 의미한다. - 분할은 스트림의 요소를 두 가지, 즉, 지정된 조건에 일치하는 그룹과 일치하지 않는 그룹으로의 분할을 의미한다. - 그룹화 메서드 groupingBy()는 스트림의 요소를 Function 매개변수로 받는다. - 분활 메서드 partitioningBy()는 스트림의 요소를 Predicate 매개변수로 받는다. - 그룹화와 분할 메서드는 매개변수의 차이만 있을 뿐 동일하다. 그러나, 만약 두 개의 그룹으로 나눠야 한다면 partitioningBy()가 더 빠르고, 그 외는 groupingBy()를 사용한다. - 그룹화와 분할의 결과는 Map에 담겨 반환된다...
collect() 메서드(1)
·
자바/스트림
1. collect() 메서드란? - 스트림의 요소를 수집하는 최종 연산으로 앞서 배운 리듀싱과 유사하다. - 어떻게 수집할 것인지에 대한 방법이 정의되어 있는 Collector가 있다. - Collector 인터페이스로 직접 구현도 가능하고 미리 작성된 Collectors 클래스를 사용할 수 있다. - collect() 메서드의 매개변수는 Collector를 필요로 한다. 즉, Collector를 구현한 클래스의 객체 이어야 한다는 뜻이다. ( 마치 sort() 메서드 위해서 Comparator가 필요한 것처럼 ) Object collect(Collector collector) Object collect(Supplier supplier, BiConsumer accumlator, BiConsumer co..
스트림의 최종 연산(조건 검사, 통계, 리듀싱)
·
자바/스트림
1. forEach() - peek()와 달리 스트림의 요소를 소모하는 최종연산자이다. void forEach(Consumer
Optional<T>와 OptionalInt
·
자바/스트림
1. Optional - Optional은 지네릭 클래스로 "T타입의 객체"를 감싸는 래퍼 클래스이므로, 모든 타입의 참조변수를 담을 수 있다. - 최종 연산의 결과를 그냥 반환하는 것이 아니라 Optional객체에 담아서 반환한다. - 또한 Optional 클래스는 null인지 아닌지 알려주는 정의된 메서드가 포함되어 있다. public final class Optional{ private final T value; // T타입의 참조변수 ... } - 아래는 Optional 클래스에 정의된 메서드들이다. (1) Optional.of() - static : 해당 객체에 값을 초기화한다. ( ex) Optional.of("abc"), Optional.of(new String("abc")) ) ( 만약 참..
스트림의 중간 연산(3)
·
자바/스트림
1. flatMap() - Stream를 Stream로 변환 - 스트림의 요소가 배열이거나 map()의 연산결과가 배열인 경우, 즉 스트림 타입이 Stream라면, Stream로 바꿀 때, flatMap()을 사용한다. - 아래의 예시를 한번 보자. ( Stream을 만들어주기 위해 Arrays.stream(T[])를 사용했다. ) ( 그러나, map() 사용하여 변환해 주었더니, Stream의 형태가 되었다. ) ( 이렇게 되면, 우리가 원하는 Stream으로 못 만들어준다. ) ( 그러므로, 위에서 말한대로 flatMap() 메서드를 이용해서, 아래와 같은 형태를 만들어야 한다. ) 1-1. flatMap()을 이해하는 예제(1) : map() 대신 flatMap()을 사용하여 Stream 구조로 만..
스트림의 중간 연산(2)
·
자바/스트림
1. 변환 - map() - 스트림의 요소에 저장된 값 중에서 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할 때가 있다. 이 때 사용하는 것이 아래와 같은 map() 메서드이다. Stream map(Function
스트림의 중간 연산(1)
·
자바/스트림
1. 스트림 자르기 - skip(), limit() - skip() 메서드는 지정한 매개변수만큼 스트림의 요소를 건너뛴다. - limit() 메서드는 지정한 매개변수만큼 스트림의 요소를 제한한다. - 기본형 Stream에서도 정의되어 있다. IntStream intStream = IntStream.rangeClosed(1, 10); // 1~10을 가진 intStream 변수 intStream.skip(3).limit(5).forEach(System.out::println); // 4, 5, 6, 7, 8 출력한다. 2. 스트림의 요소 걸러내기 - filter(), distinct() - filter()는 주어진 조건에 맞게 스트림의 요소를 걸러낸다. 사용방법은 아래의 코드를 보자. IntStream i..
스트림 만들기
·
자바/스트림
1. 컬렉션 - 컬렉션의 최고 조상인 Collection에 stream()이 정의되어 있으므로, Collection의 자손인 List와 Set을 구현한 컬렉션 클래스들은 모두 이 메서드로 스트림을 생성할 수 있다. - stream()은 아래와 같이 해당 컬렉션을 소스로 하는 스트림을 반환한다. Stream Collection.stream() 2. 배열 - Stream과 Arrays에 static 메서드로 아래와 같이 정의되어 있다. (1) Stream Stream.of(T... values) ex) Steam.of("a","b") //가변인자 (2) Stream Stream.of(T[]) ex) Stream.of(new String[] {"a","b"}) (3) Stream Arrays.stream(T[..
스트림의 기본 개념
·
자바/스트림
1. 스트림이란? - 스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓았다. - 스트림은 Iterator처럼 일회용이다. 즉, 한번 사용한 스트림은 필요하다면 다시 생성해야 한다. - 스트림은 작업을 내부 반복으로 처리한다. ( 내부 반복이란, 반복문을 메서드의 내부에 숨길 수 있다는 것을 의미한다. ) - 장점으로는 두 가지가 있는데, 아래와 같다. (1) 데이터 소스가 무엇이든지 간에 같은 방식으로 다룰 수 있다. (2) 코드의 재사용성이 높아진다. - 아래의 예시 String 배열과 List 배열을 보자. ( 그리고 이렇게 된 것을 정렬한다면, 아래와 같을 것이다. ) ( 데이터 소스가 정렬되는 것은 아니라는 것에 유의하자. ) ( 만약 다시 List(데이터소..
메서드 참조
·
자바/람다식
1. 메서드 참조란? - 메서드 참조는 람다식보다 더욱 간결하게 표현할 수 있는 방법이다. 그러나, 매번 적용할 수 있는 것이 아니고, 람다식이 하나의 메서드만 호출하는 경우에 해당된다. - 총 3가지 경우의 메서드 참조가 있는데, 아래의 예시 코드를 보고 이해하자. (1) static 메서드 참조 : 람다식은 "(x) -> ClassName.method(x)" 이다. : 메서드 참조는 "ClassName::method" 이다. (2) 인스턴스 메서드 참조 : 람다식은 "(obj, x) -> obj.method(x)" 이다. : 메서드 참조는 "ClassName::method" 이다. (3) 특정 객체 인스턴스메서드 참조 : 람다식은 "(x) -> obj.method(x)" 이다. : 메서드 참조는 "o..
Function의 합성과 Predicate의 결합
·
자바/람다식
1. Function 합성 - Function 합성에서는 아래와 같이 defaul과 static이 정의되어 있다. (1) default Function andThen (Function
java.util.function 패키지
·
자바/람다식
1. java.util.function 패키지 - 이 패키지에는 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해 놓았다. - 아래는 대표적 5가지 함수형 인터페이스이다. (1) java.lang.Runnable : 매개변수와 반환값이 없다. (2) Supplier : 매개변수가 없고, 반환값만 있다. (3) Consumer : 매개변수만 있고, 반환값은 없다. (4) Function : 일반적인 함수로 하나의 매개변수를 받아서 결과를 반환한다. (5) Predicate : 조건식을 표현하는데 사용된다. : 매개변수는 하나, 반환타입은 boolean이다. : 반환타입이 boolean인 것을 제외하면 (4) Function과 동일하다. - 매개변수가 두 개인 함수형 인터페이스는 Con..
함수형 인터페이스
·
자바/람다식
1. 함수형 인터페이스 - 람다식을 다루기 위한 인터페이스를 함수형 인터페이스라고 한다. - 일단 먼저 람다식으로 정의된 익명 객체의 메서드를 호출하는 방법의 순서를 알아보자. 1. 첫 번째, 메서드를 정의한 클래스 또는 인터페이스가 무엇인지 확인한다. ( a라는 인터페이스에 max 추상메서드로 정의되어 있다. ) 2. 두 번째, 해당 클래스 또는 인터페이스의 이름을 사용하여 참조변수를 생성한다. 3. 세 번째, 마지막으로 참조변수에 람다식을 써 준다. ( 만약 익명클래스의 객체로 작성하면 아래와 같이 생성된다. ) ( 또한 함수형 인터페이스에는 오직 하나의 추상 메서드만 정의되어 있어야 한다는 제약이 있다. ) ( 그렇게 해야 1:1로 매칭될 수 있기 때문이다. ) ( 반면 static과 default..
람다식의 기본 개념
·
자바/람다식
1. 람다식이란? - 메서드를 하나의 '식'으로 표현한 것을 말한다. 그러므로, 메서드의 이름과 반환값이 사라진다. - 우리는 그것을 익명 함수라고 표현한다. - 아래의 예시를 보자. int[] arr = new int[5]; Arrays.setAll(arr, (i) -> (int) (Math.random() * 5) + 1); (위 주황색 부분이 람다식이다.) (이렇게 한다면 클래스와 객체를 생성할 필요없이 바로 호출할 수 있다는 장점이 있다.) 2. 람다식 작성하기. - 아래의 코드는 원래의 메서드 함수이다. 이것을 람다식으로 바꾸어 볼 것이다. (int a, int b) -> {return a>b ? a : b;} 또는 (int a, int b) -> a>b? a : b 또는 (a,b) -> a>b..
쓰레드의 실행제어
·
자바/프로세스와 쓰레드
1. 쓰레드의 실행제어 - 쓰레드 프로그래밍이 어려운 이유는 동기화(synchronization)와 스케줄링(scheduling) 때문이다. - 멀티쓰레드를 구현하기 위해서는 보다 정교한 스케줄링을 통해 자원 낭비없이 프로그래밍 해야한다. - 아래의 코드는 쓰레드 상태 관련 메서드들이다. 메서드 설명 static void sleep(long millis), sleep(long millis, int nanos) 지정된 시간(천분의 일초 단위) 동안 쓰레드를 일시정지한다. 시간이 지나면 다시 실행대기 상태가 된다. void join(), join(long millis), join(long millis, int nanos) 지정된 시간만큼 작업을 수행 후, 호출한 쓰레드로 다시 돌아온다. void interr..
데몬 쓰레드
·
자바/프로세스와 쓰레드
1. 데몬 쓰레드에 대한 기본 개념 - 데몬 쓰레드는 다른 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 쓰레드이다. - 일반 쓰레드가 종료되면 데몬 쓰레드도 강제적으로 종료되는데, 그 이유는 일반 쓰레드를 보조 역할로 수행하는데 없으면 있을 이유가 없기 때문이다. - 데몬 쓰레드의 예로는 가비지 컬렉터, 워드프로세서의 자동저장, 화면자동갱신 등이 있다. - 데몬 쓰레드는 무한 루프와 조건문을 이용해서 실행 후 대기하고 있다가 특정조건이 만족되면 작업을 수행 후 다시 대기한다. - 데몬 쓰레드는 일반 쓰레드의 작성방법과 실행방법이 같으나, 쓰레드를 생성한 다음 실행하기 전에 setDaemon(true)를 호출해주어야 한다. - 데몬 쓰레드가 생성한 쓰레드는 자동적으로 데몬 쓰레드가 된다. 2. 데몬..
쓰레드의 우선순위와 쓰레드 그룹
·
자바/프로세스와 쓰레드
1. 쓰레드의 우선순위에 대한 개념 - 쓰레드는 기본적으로 우선순위라는 속성(멤버변수)를 가진다. - 이 값에 따라 실행시간이 달라진다. - 쓰레드가 가질 수 있는 우선순의 값 범위는 1~10이며 높을수록 높다. - 기본적으로 5의 값을 가진다. - 만약 각각 쓰레드 th1, th2는 7와 5의 우선순위를 가진다면, 싱글 코어에서는 th1부터 먼저 실행하게 되며, th2보다 더 빨리 작업을 마친다. 그러나 만약 멀티코어에서 수행하게 되면 th1이 더 빨리 수행되긴하지만 거의 차이 없이 똑같이 번갈아가면서 출력한다. ( 멀티코어에서는 별 차이가 없을정도가 아니라 전혀 없다. ) ( 그러므로, 우선순위를 부여하는 대신 PriorityQueue 클래스에 저장해 놓고, 우선순위가 높은 작업을 먼저 처리하는 것이..