본문 바로가기

Programming/Java

(11)
압축파일탐색기 https://github.com/Nahrim/Finder/tree/main/finder 군대에 있을 때 만든 프로그램이다. 사실 프로그램이라고 하기는 좀 민망한 수준이라 습작이라고 하는 게 더 맞는 것 같다... 이동식 저장장치 내의 압축파일을 찾아내기 위해 만들었다. 사실 밖에서는 딱히 쓸모가 없는데, 거기서는 꽤 유용했다. 내가 근무했던 곳에서는 외부에서 들여온 저장매체(CD, 외장하드, etc)의 유해성을 클린PC로 검사했다. 클린PC는 랜선이 꽂혀있지 않고 필요한 최소한의 프로그램만 깔려있는 PC다. 여기서는 악성코드나 바이러스가 나와서 다른 PC로 퍼질 염려가 없으니 여기서 유해성을 검사한 것이다. 검사라고 해봤자 별 거 없고 백신으로 정밀 검사만 돌리면 되는 거였는데, 이 백신이 문제였다. ..
사용자 정의 예외 게임 프로그램에서 상점에서 아이템을 구매할 때 아이템의 금액보다 사용자의 보유액이 적은 경우 예외를 발생시킬 필요가 있다. 그런데 이런 예외는 자바에서 제공하지 않는다. 어떻게 해야 할까? 이런 예외를 애플리케이션 예외(Application exception)이라 한다. 애플리케이션 예외는 사용자가 직접 정의해야 하므로 사용자 정의 예외라고도 한다. 사용자 정의 예외는 일반 예외로 선언할 수도 있고 실행 예외로 선언할 수도 있다. 전자의 경우 Exception 클래스를, 후자의 경우 RuntimeException 클래스를 상속하면 된다. 이 때 사용자 정의 예외 클래스의 이름은 다음과 같이 Exception으로 끝나는 게 좋다. public class XXXException extends Exceptio..
예외 처리 오류에는 여러 가지가 있는데, 자바에서의 오류에는 크게 에러(error)와 예외(exception)가 있다. 에러는 응용프로그램 실행 시 하드웨어의 문제로 인해 발생하는 오류로, JVM 실행에 문제가 생겼다는 것을 의미한다. 자바 프로그램은 JVM 위에서 실행되기 때문에 프로그램을 아무리 잘 만들었어도 실행 불능이 되고, 개발자는 이에 대처할 방법이 없다. 예외는 사용자의 잘못된 조작이나 개발자의 실수로 인해 발생하는 오류를 말한다. 일단 발생하면 프로그램이 바로 종료된다는 점에서는 에러와 같지만, 예외는 예외 처리(exception handling)를 통해 실행 상태를 유지할 수 있다는 점에서 다르다. 예외는 다시 일반 예외(exception)과 실행 예외(runtime exception)로 나뉜다. ..
[과제] 수강신청 프로그램 친구의 부탁으로 도와준 프로젝트. ...였는데 하다 보니 내가 거의 다 하게 됐다. 자바를 이번에 처음 배우는 친구들이라 내 코드를 이해하지 못 하는 바람에 내가 다 맡았다. 나도 대단한 걸 한 건 아닌데... 점수를 잘 받게 해주려고 예외 처리도 넣고, 인터페이스도 쓰고 추상 클래스도 쓰고 다양한 요소들을 (억지로) 넣으려고 하다 보니 시간이 너무 촉박해져서 급하게 마무리지었다. 그래서 버그도 좀 있고 구현하려다 못 한 기능도 있고, 애초에 코드 자체가 굉장히 조악한 것 같다. 수정해야 되는데 너무 귀찮아...나중에 할래.... 모든 소스 코드는 아래에 첨부한다.
JVM JVM은 Java Virtual Machine(자바 가상 기계)의 약자다. 이름은 기계지만 실제로는 소프트웨어다. 아마 JVM이 실질적인 CPU 역할을 하기 때문에 이런 명칭이 쓰였을 것이라 추정된다. 프로그램은 기본적으로 CPU 위에서 돌아간다. 따라서 C, C++의 경우 컴파일 결과 생성된 코드는 해당 CPU에서 바로 실행할 수 있다. 이런 코드를 네이티브 코드(native code)라 한다. 자바 소스코드(*.java)를 컴파일한 경우 생성되는 클래스 파일(*.class)은 CPU에서 직접 실행할 수 있는 코드가 아니다. 이 클래스 파일은 CPU 위에서 실행할 수 있게 하기 위한 중간 단계라고 할 수 있는 바이트 코드(byte code)로 이루어져 있다. 이 바이트 코드를 실행하기 위한 가상적인 C..
Managed code C언어로 작성한 코드를 컴파일하면 네이티브 코드(native code)가 된다. 네이티브 코드는 managed code로도 불린다. 과거의 프로그래밍은 대부분 네이티브 코드로 진행되었다. 컴파일하면 CPU가 해석할 수 있는 기계어로 번역이 되는 방식인데, 이런 방식에서 프로그래머는 여러 문제를 신경써야 한다. 대표적인 예로 메모리 누수와 이식(porting)이 있다. OS는 하드웨어에 따라 다르므로 다른 OS로 옮길 때(porting이라 함) 번거롭다. 소스는 비슷하더라도 컴파일 결과는 OS에 종속적이기 때문에 번거로울 수 밖에 없다. 그래서 OS에 독립적인 프로그래밍을 위해 만들어진 것이 Java다. Java로 만들어진 프로그램은 어떤 OS에서도 실행할 수 있는데, 이를 ⒜WORA 또는 이식성이 좋다고..
IO 입출력 Java는 java.io 패키지에서 File 클래스와 여러가지 스트림 클래스를 제공한다. 스트림 클래스는 크게 다음과 같이 두 가지로 나뉜다. ① 바이트 기반 스트림 - 그림, 문자를 비롯한 모든 종류의 데이터 입출력 가능 - 1byte 단위로 입출력 ② 문자 기반 스트림 - 문자 데이터만 입출력 가능 - 2byte 단위로 입출력(Java는 문자를 유니코드로 처리한다.) InputStream 클래스와 OutputStream 클래스는 바이트 기반 스트림의 최상위 클래스로 두 클래스 모두 추상 클래스다. InputStream 클래스는 FileInputStream, BufferedInputStream, DataInputStream 클래스 등을 하위 클래스로 갖고, OutputStream 클래스는 FileOut..
자바에서의 배열 선언 및 초기화 기본적으로 선언은 다음의 세 가지 형식이다. ① int[] arr = new int[3]; ② int[] arr = ; ③ int[] arr = new int[] ; ②, ③의 경우 배열의 길이는 자동으로 5로 정해진다. 주의할 점은 배열도 객체라는 것. 때문에 다음 코드는 NullPointerException을 발생시킨다. int[] arr; arr[3] = 5; 배열 객체를 참조할 변수( arr )만 생성했을 뿐, 실제로 배열 객체를 참조하고 있지는 않다. 따라서 arr[3] 과 같이 배열의 요소에 접근한다는 것은 당연히 불가능하다. 그리고 sizeof 연산자를 통해 sizeof(ARRAY) / sizeof(TYPE) 로 배열의 길이를 계산하는 C언어와 달리 Java는 배열이 객체고, 객체 안에 배열..