본문 바로가기
728x90
반응형

Java59

[Java Basic] 47 - Java Stream ** 시작하기 전에, Java에서 Stream이라는 용어는 java.util.stream 패키지에 정의된 Stream 클래스에 대한 내용과, 입출력 관련 Stream 두 가지 의미를 가진다. Stream 클래스가 이번 포스팅에서 다룰 내용이며, 입출력 Stream은 다음 또는 다다음 포스팅에서 다룰 예정이다. 배열과 ArrayList, Queue를 하나씩 만들고 이들이 가진 요소값을 출력하는 코드를 만들어보자. Queue와 ArrayList 등 Collection과 배열은 일부 기능을 제외한다면 차이가 거의 없다. 그러나 동일한 기능을 하는 매서드들을 호출해보더라도 이들의 이름이 달라 사용할 때마다 Java Documentation을 뒤적거려야하는 불편함은 여전히 존재한다. 예를 들어 필자가 List에 .. 2022. 10. 1.
[Java Basic] 46 - Java Lambda식과 함수형 인터페이스 Java는 대표적인 객체지향(Object Oriented) 언어다. 그렇기 때문에 초창기만 하더라도 C언어와 같이 함수만으로 프로그래밍을 작성하는 것이 불가능했다(Java는 함수 -매서드 -가 클래스 외부에 존재하면 에러가 발생한다). 그런데 JDK 1.8 버전에 이르러서, 함수형 인터페이스와 람다(Lambda)식 기능을 제공하면서 Java에서도 클래스를 벗어난 매서드, 즉 함수를 사용할 수 있게 되었다. 객체지향언어만을 고집하는 Java에서 왜 함수형 언어를 쓰는 것이 도움이 되는지 생각을 해보자. 코드 상에서 두 정수를 연산하는 절차를 단 한 번만 수행한다고 가정해보자. 연산은 덧셈이 될 수도, 뺄셈이 될 수도 있다. 그럼, 연산과 관련된 매서드만을 정의한 클래스를 아래와 같이 정의할 수 있을 것이다.. 2022. 9. 27.
[Java Basic] 45 - Java Thread 4 - Lock 클래스, Condition 인터페이스 지난 포스팅에서 예시로 들었던 뷔페 코드를 조금 변경해보았다(진상 손님은 구현하지 않았다). 우선 wait()과 notify() 매서드 호출 코드는 제외한 상태다. 이 상태에서 코드를 실행해보자. 아마 고객들이 첫 음식을 가지고 간 다음 Chef가 음식을 서빙하는 과정에서, 테이블에 음식이 5개가 되면 Chef Thread에서 lock이 해제가 되지 않음을 알 수 있을 것이다. 이러한 이유로 필자는 Synchronized 동기화 된 매서드 내부에 wait(), notify()로 lock의 강제 해제와 lock 보유 허용을 가능하게 하도록 코드를 작성했었다. 하지만, 이전 포스팅에서 언급했듯이 synchronized와 wait(), notify()만으로는 특정 Thread를 선별하여 lock을 걸거나 해제.. 2022. 9. 25.
[Java Basic] 44 - Java Thread 3 - Thread 동기화(Synchronized, wait(), notify()) Thread의 실행제어를 통해 이런 저런 코드를 만들어서 동작시키다보면, 문득 이런 생각이 든다. "만약 서로 다른 Thread가 하나의 공유 자원을 가지고 있을 때, 동시에 Thread가 실행되어 발생할 문제는 없는 것인가?" 예를 들어보자. 뷔폐가 하나 있고, 음식 중 삶은 계란이 나온다. 삶은 계란은 15초마다 5개씩 접시에 담기며, 20개가 삶아지면 더 이상 추가되지 않는다. 우선 이 부분을 코드로 작성해보자. 접시에 계란이 20개를 초과하지 않는 이상, 뷔폐는 15초마다 5개의 계란을 만들어 추가하는 것이 보인다. 이제 이 계란을 가져갈 고객에 대한 내용을 클래스로 만들고 하나의 인스턴스만 생성하여 10초에 1~2개씩 계란을 가져간다고 해보자. 고객이 단 한 명일 때는 수요보다 생산량이 많아 풍.. 2022. 9. 23.
[Java Basic] 43 - Java Thread 2 - Thread 실행 제어 및 Daemon Thread 지난 포스팅에서 Java Thread와 ThreadGroup의 우선순위를 지정하는 법 및 Thread 우선순위에 따른 Thread 실행 순서에 대해 확인해보았다. 하지만 우선순위로만은 Thread를 제어하기에 부족한 점이 많은데, 입력값을 받아야만 동작하는 Thread의 경우, 입력값이 들어올 때까지 자신의 Thread 실행을 일시 정지하거나 중단해야 할 필요가 있기 때문이다. 또한 사용될 것으로 예상되었던 Thread가 필요없어진 경우 Thread 중단 또는 삭제를 진행해야 하는 경우도 생긴다. 이번 포스팅에서는 생성한 Thread의 실행을 제어하는 방법에 대해 알아보고, Daemon Thread라고 불리는, 상위 ThreadGroup이 활성화되었을 때만 동작하는 Thread에 대해 간략하게 설명하려한.. 2022. 9. 20.
[Java Basic] 42 - Java Thread 1 - Thread와 ThreadGroup 지금가지 필자가 작성한 모든 프로그램은, 컴퓨터가 실행할 시 필자가 작성한 main 함수 코드의 상단부터 순차적으로 실행하면서 내려오고, Main 함수 내 코드 실행이 완료되면 종료하는 형태로 진행되었다. 그래서 서로 다른 클래스의 매서드를 순차로 호출하면, 먼저 호출된 매서드가 종료되고 나서야 다음 호출된 매서드가 실행이 된다. 그러나 하나의 프로그램에서 순차적으로 코드를 진행하는 방식은 최근에는 아예 사용할 수 없는 방식이다. 예를 들어, 사람들이 의사소통을 위해 사용하는 메신저의 경우, 메세지 전송을 위해 글자를 적고 있는 와중에도 상대편이 보낸 메세지가 채팅창에 나타나야하기 때문이다. 만약 글자 입력하는 중이라고 상대방이 보낸 메세지가, 입력이 다 끝나고 도착하는 상황이 벌어진다면 메신저로의 의사.. 2022. 9. 19.
[Java Basic] 41 - Java Annotation 오늘 포스팅을 진행할 내용인 Annotation의 단어 정의는 아래와 같다. 사전적 의미의 Annotation은 주 문장에 작성하는 추가 노트 또는 설명인데, 한글로 가장 적당한 단어로 각주(脚注)라고 한다. Java에서는 주석을 통해 코드에 대한 부연 설명을 작성하여 다른 사람이 코드를 쉽게 이해할 수 있도록 만들고 있다. Java의 Documentation에 작성된 내용은 Java 컴파일러가 클래스의 소스 파일 내의 주석(/** ... */)과 Annotaion을 참조하여 Html 파일로 만든 것이다. 하지만 중복되는 내용에 대해 일일이 주석을 달아넣는것 또한 번거롭기 때문에 공통적이면서 주요하게 알려야하는 내용은 @기호와 약속된 단어를 붙여 표시하며 이를 Annotation이라고 한다. 예를 들어,.. 2022. 9. 15.
[Java Basic] 40 - 열거형(enum) 개요와 사용법 Java에서 날짜와 시간을 다루는 클래스 중 Calendar라는 클래스가 java.util 패키지 내에 존재한다. Calendar 클래스는 특정 날짜의 연도, 월, 일, 시, 분, 초 등을 필드값으로 지정하고 있다. Calendar는 get이라는 매서드의 매개변수로 날짜 필드값을 입력받는데, 필드값에 의해 날짜의 특정 지정값을 화면에 출력하는 것이 가능하다. 위의 내용을 클래스로 작성할 수 있을까? Calendar 객체를 매개변수로 받아 인스턴스를 생성하고, myGet()이라는 매서드로 날짜 데이터를 추출하는 클래스를 만들어보려한다. 클래스가 정상 동작하는지 확인해보자. 지금이야 필자가 Calendar의 필드값을 단 6개만 표시했기 때문에 코드가 그나마 덜 복잡해보이지만, 실제 Calendar의 필드값을.. 2022. 9. 13.
[Java Basic] 39 - Generic 개요와 사용법 Java의 클래스를 하나 만들어보자. 컬렉션 프레임워크와 유사하게 add() 매서드로 매개인자의 값을 컬렉션 프레임워크에 저장하고, toString()으로는 저장된 컬렉션 프레임워크 객체를 출력하는 기능을 넣어보자. 아래와 유사한 코드가 작성될 것이다. 이제, 이 클래스를 기반으로 DummyList의 각 인스턴스 내에 존재하는 arrList가 단일 객체 타입의 데이터만 저장되어야한다는 가정을 추가해보자. 만약 정수형이라면 아래와 같이 코드가 변경될 것이다. 나머지 자료형 역시 위와 같은 방식의 DummyList 클래스를 복사해서 이름만 변경하면 된다. 하지만 이 방법의 문제점은 7가지 기본 자료형 외의 객체형 타입 자료가 추가되는 경우, 그 객체 타입에 맞는 클래스를 다시 추가해서 정의해야한다는 것이 첫.. 2022. 9. 12.
[Java Basic] 38 - 컬렉션 프레임워크8 (java.util.Collections) 컬렉션 프레임워크의 마지막 포스팅이다. 이번 포스팅에서는 Collections 클래스에 대해 알아보려한다. 배열을 쉽게 다루기 위해 java.util 패키지에 Arrays 클래스가 정의되어 있는 것처럼, 컬렉션 프레임워크 역시 소속된 클래스를 조금 더 효율적으로 제어하기 위한 Collections 클래스가 정의되어 있다. 하지만 Arrays가 대부분 매서드 영역에서 기능만을 제어하는 것과 달리, Collections는 컬렉션 단위에서의 기능을 제어할 수 있는 매서드를 제공한다. 컬렉션 프레임워크에 해당하는 클래스가 한 종류의 객체만 저장할 수 있도록 만드는 Collection 타입으로 변환하는 매서드 혹은 멀티스레드(Multi-Thread)에 활용할 수 있도록 Collection에 동기화가 적용된 Col.. 2022. 9. 7.
[Java Basic] 37 - 컬렉션 프레임워크7 (HashMap, TreeMap, Properties) 이번 포스팅에서는 컬렉션 프레임워크의 기본 인터페이스 중 하나인 Map에 속하는 클래스들에 대해 알아보려한다. Map은 Key(K), Value(V)로 구성된 데이터인데 예시로 들 수 있는 것은 json이라는 파일 형식과 Python의 Dictionary 자료형이다. Map은 데이터 접근을 위해 Key를 사용하기 때문에 Key는 중복이 불가능하나, 데이터(Value)는 Key가 다르더라도 동일한 값을 저장하는 것이 가능하다. { "username": "bluesky", "nickname": "bluesky" } Map은 Key와 Value 두 데이터를 한 번에 다루기 때문에 다른 컬렉션 프레임워크와 비교했을 때 구조가 독특하다. Key와 Value는 Map 클래스 내부의 Entry라는 내부 클래스에 정의.. 2022. 9. 7.
[Java Basic] 36 - 컬렉션 프레임워크6 (HashSet, TreeSet) 컬렉션 프레임워크를 구성하는 메인 인터페이스는 List, Set, Map 세 가지가 존재한다. 지금까지는 List와 컬렉션 프레임워크 존재 전에 사용했던 Vector에 대해서 알아보았는데, 이들은 중복 값 입력을 허용하며, 값이 저장된 순서도 유지한다는 특성이 있다. 이번 포스팅에서 살펴볼 HashSet과 TreeSet은 지금까지 살펴보았던 List와 달리 Set 인터페이스를 구현하는 클래스인데, 이들은 중복되는 값의 저장을 허용하지 않으며 저장 순서도 유지하지 않는다. 값의 중복을 허용하지 않기 때문에 데이터베이스(DB)에서 PrimaryKey 역할을 하는 값들의 저장에 많이 사용한다. 예를 들면 어느 기업의 직원 정보 중 사번이나, 회원 정보 중 회원 번호, 혹은 바로 다음 포스팅에서 다룰 Map 컬.. 2022. 9. 5.
728x90
반응형