본문 바로가기
728x90
반응형

Java/Java Basic50

[Java Basic] 50 - Jar 명령어로 기본 archive 만들기(Windows CMD) 간만에 진행하는 Java 포스팅이다. Java 기초 포스팅은 되도록이면 진행하지 않으려 했는데, 정리가 필요한 내용이 생겨 추가 포스팅을 작성하게 되었다. 매번 자료를 찾아서 기억을 복구하기도 어려워서 아예 정리를 할 겸 말이다(요즘 들어 기억력이 점점 금붕어의 그것이 되는 것 같아 걱정이다). 이번 포스팅의 주제는 jar 라고 불리는, 아카이브를 위한 일종의 압축 파일이다. 본 포스팅은 java의 패키지와도 연관이 있는 내용이기 때문에, 관련 내용에 대한 배경 지식이 필요하신 분들은 이 포스팅을 먼저 확인하고 오면 된다. 1. 폴더로만 구성된 패키지에서의 에러사항 필자가 아이디와 패스워드를 입력하여 로그인을 하는 프로그램을 하나 만든다고 가정해보자. 입력한 비밀번호는 탈취되는 경우에 대비하여 암호화를 .. 2023. 1. 10.
[Java Basic] 49 - Java I/O Stream2 - Serialization과 File 입출력 스트림 클래스 석 달의 대장정 끝에 Java Basic의 마지막 포스팅이다. 마지막 포스팅은 Java 입출력 스트림의 직렬화(Serialization)라는 개념을 중점적으로 살펴보려하고, 추가로 파일 입출력 스트림을 편하게 다룰 수 있는 몇 개의 클래스를 간단하게 소개하려 한다. 바로 시작해보자. 1. 직렬화(Serialization)란, 바로 직전의 포스팅에서, 서로 다른 타입의 정보를 스트림으로 저장하기 위해서 DataInputStream 클래스를, 그리고 스트림으로 저장된 서로 다른 타입의 정보를 DataOutputStream으로 불러들여오는 것을 예시로 나타냈었다. 이 예시를 사용하면, 인스턴스 객체에 저장된 인스턴스 변수 정보만을 별도로 저장할 수 있게 되며, 인스턴스 객체가 사라지더라도 저장된 정보를 호출하.. 2022. 10. 5.
[Java Basic] 48 - Java I/O Stream1 - Stream 클래스 및 보조Stream 이번 포스팅에서는 필자의 Java Basic 마지막 주제인 입출력(Input Output) 스트림, 그 중에서도 입출력 스트림에 사용되는 주 스트림 클래스와 보조스트림 클래스에 대해 알아보려 한다. 앞선 포스팅에서 설명한 Stream과 용어(Terminology)는 동일하지만, 의미하는 바는 다른데, 바로 직전의 포스팅에서 작성한 내용은 Array와 Collections 타입을 조금 더 효율적으로 다루기 위한 방법을 다룬 반면, 이번 포스팅에서는 입력과 출력을 담당하는 하나의 흐름(Stream)을 제어하는 방법에 대한 내용이다. 그럼, 이 포스팅에서 말하는 Stream이란 무엇을 의미하는가에 대해 먼저 알아보아야 한다. 1. Stream 개요 메모장을 열고 키보드로 한 글자를 타이핑 해보자. 키보드 ->.. 2022. 10. 5.
[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.
728x90
반응형