<File 클래스>


File 클래스는 일및 폴더를 관리할수있는 클래스이다.
파일의 내용을 입출력하기위한 메소드는 제공하지 않는다.

 

[File 클래스 메소드 / 생성자]

File(String filename) : 주어진 파일명을 이름으로 갖는 파일을 위한 File객체를 생성한다. filename은 주로 경로까지 포함해서 준다.

String getName() : 파일이름을 String으로 반환

String getPath() : 파일의 경로를 String으로 반환

String getAbsolutePath() : 파일의 절대경로를 String으로 반환

String getParent() : 파일의 조상 디렉토리를 String으로 반환

boolean canRead() : 읽을 수 있는 파일인지 검사

boolean canWrite() : 쓸 수 있는 파일인지 검사

boolean exists() : 파일이 존재하는지 검사

boolean isDirectory() : 디렉토리인지 검사

boolean isFile() : 파일인지 검사

 

 

<실습>


-결과-


LIST

<FileInputStream, FileOutputStream>

FileInputStream(String name) : 지정된 파일이름(name)을 가진 실제 파일과 연결된 FileInputStream을 생성

FileOutputStream(String name) : 지정된 파일이름(name)을 가진 실제 파일과 연결된 FileOutputStream을 생성

FileOutputStream(String name, boolean append) : 지정된 파일이름을 가진 실제 파일과 연결된 FileOutputStream을 생성하는데, 두번째 인자에 true를 써주면 출력할 때 기존의 파일내용의 마지막에 덧붙인다. false면 덮어 쓰게된다.



<실습>

FileInputStream 실습



[코드]

위 코드를 보면 C://java//test1.txt파일을 만들어놓고, 그 파일로 부터 입력받을 수 있는 입력파일스트림을 생성한다.

그 후, 그 파일안의 내용을 1바이트씩 읽어 콘솔창에 출력하는 코드이다.

 

-결과-



<실습>

FileOutputStream 실습


[코드]


-결과-




<실습 - 심화>




-결과-


LIST

'Programming > Java' 카테고리의 다른 글

Java - File클래스  (0) 2015.12.08
Java - InputStream, OutputStream  (0) 2015.12.08
Java - Thread, (run()메소드, start()메소드의 차이)  (0) 2015.12.08
Java - 예외 처리 (Exception)  (0) 2015.12.08
Java - Hashtable, HashMap  (0) 2015.12.08


<스트림>

어느 한쪽에서 다른 쪽으로 데이터를 전달하려면 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림이라 한다.

먼저, InputStream, OutputStream에 대해서 알아보자.

InputStream은 입력 스트림이고, OutputStream는 출력 스트림이다. 이 클래스들은 java.io패키지에서 재정의 되어있고, 많은 종류의 입출력 관련 클래스들을 제공하고 있다.

 



<InputStream>

InputStream의 메소드를 알아보자.

abstract int read() : 1바이트를 읽어온다. 읽어올 바이트가 없다면 -1을 반환한다. abstract 메소드이기 때문에 무조건 정의해줘야함.

void close() : 스트림을 닫는다.

void mark(int readlimit) : 현재 위치를 표시한다.  추 후에 reset()에 의해서 표시해 놓은 위치로 다시 돌아갈 수 있다. readlimit은 되돌아 갈 수 있는 바이트의 수

int read(byte[] b) : 배열 b의 크기만큼 읽어서 배열을 채우고 읽어 온 데이터의 수를 반환.

int read(byte[] b, int start, int len) : 최대 len개의 byte를 읽어서 배열 b의 지정된 위치인 start부터 저장.

void reset() : 스트림에서의 위치를 마지막으로 mark()이 호출되었던 위치로 되돌린다.

 

public abstract class InputStream {

 

   abstract int read();   // 입력 스트림으로부터 1바이트를 읽어서 반환하고, 없으면 -1을 반환.

   int read(byte[] b, int start, int len) {

      for(int i=start; i < start+len; i++) {

          b[i] = (byte)read();

      }

 

int read(byte[] b) {

   return read(b, 0, b.length);

}

이것은 InputStream의 주요기능은 read메소드를 다시 이해하기 쉽게 바꿔보았다.

 



<OutputStream>

void close() : 입력소스를 닫는다.

void flush() : 스트림의 버퍼에 있는 모든 내용을 출력소스에 쓴다.

abstract void write(int b) : 주어진 값을 출력소스에 쓴다.

void write(byte[] b) : 주어진 배열 b에 저장된 모든 내용을 출력소스에 쓴다.

void write(byte[] b, int start, int len) : 주어진 배열 b에 저장된 내용 중에서 start번째 부터 len개 만큼만을 읽어서 출력소스에 쓴다.

 

<실습>



-결과-


LIST

'Programming > Java' 카테고리의 다른 글

Java - File클래스  (0) 2015.12.08
Java - FileInputStream, FileOutputStream  (0) 2015.12.08
Java - Thread, (run()메소드, start()메소드의 차이)  (0) 2015.12.08
Java - 예외 처리 (Exception)  (0) 2015.12.08
Java - Hashtable, HashMap  (0) 2015.12.08

<Thread>

쓰레드를 말하기 전에 프로세스에 대해서 알 필요가 있다.

프로세스란 무엇일까? 실행 중인 프로그램을 프로세스라고 한다. 프로세스는 프로그램을 수행하는데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있다. 바로 이 쓰레드가 실제로 작업을 수행하는 것이다.

그러므로 프로세스 하나당 최소한 무조건 한개의 쓰레드가 존재하며 두개 이상 존재하는 경우를 멀티 쓰레드라고 한다.

우리가 지금 ctrl + alt + del를 눌러 작업관리자에서 프로세스란을 클릭하면 출력되는 것들이 프로세스이다. 이러한 프로세스에는 한개 혹은 여러개의 쓰레드들이 열심히 일을하며 움직이고 있을 것이다.

이 쓰레드라고 하는 것은 작업을 수행하는데 개별적인 메모리 공간을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드의 수가 결정된다. 멀티태스킹은 이런 쓰레드를 한 프로세스에 여러개 만들어 동작하게 하는것이다. 하지만 CPU는 한 순간에 한 번의 동작밖에 할 수 없으므로, CPU는 아주 짧은(정말 미세한) 시간동안에 여러 작업을 번갈아가며 수행하는 것이다. 그래서 우리 눈에는 여러 개의 프로그램들이 동시에 돌아가는 현상을 볼 수 있는 것이다.

 

쓰레드를 구현하는 방법은 두가지가 있다.

첫번째는 Thread클래스를 상속받아서 사용하는 것.

두번째는 Runnable 인터페이스를 구현하는 것이다. (Runnable이 일반적인 방법)

 

1. Thread 클래스를 상속받는 방법

class MyThread extends Thread {

   public void run() {    // run()메소드를 오버라이딩

      // 내용

   }

}

 

<실습>

Thread 클래스를 상속받는 방법



다음 코드를 보면 MyThread1 클래스에 Thread 클래스를 상속받아 Thread클래스의 run()메소드를 오버라이딩 해서 사용하고 있다.MyThread 객체를 생성할 때 인자로 int형 정수와 String 문자열을 주었다. 각각의 쓰레드에서 첫 번째 쓰레드는 1~10까지 찍어내는 메소드를 수행하고, 두번째 쓰레드는 1~20까지 찍어애는 메소드를 수행한다. 이름도 각각 다르기 때문에 결과를 보면 다르게 나온다.

각각 두개의 쓰레드를 생성해서 각자 독립적으로 동작하는 것을 보여주었다.

물론 첫번째 쓰레드인 t1이 먼저 start()되었기 때문에 결과에 먼저 찍힌것이다.

첫번째 쓰레드가 끝나도 두번째 쓰레드는 계속 동작한다. 왜냐? 할 일이 남았기 때문에...

그런데 이상하지 않는가? run()메소드를 오버라이딩해서 왜 시작은 start()로 하는것인가?

이 문제는 다음 단락에서 확인하자.

 


-결과-


2. Runnable 인터페이스를 구현하는 방법

class MyThread implements Runnable {

    public void run() { // 작업 내용 }

}

 

<실습 - 2>

Runnable 인터페이스를 구현하는 방법



다음 코드를 보면 Runnable 인터페이스를 구현한 경우, Thread클래스를 상속받은 방법과 좀 다르다는 것을 알 수 있다.
먼저, Runnable 인터페이스를 구현한 클래스(위에서는 MyThread2)의 인스턴스를 생성한 후, Thread클래스의 인스턴스를 생성할 때 생성자의 매개변수로 제공해야 한다.
이때 사용되는 Thread의 생성자는 Thread(Runnable target)이다.
 
-결과-



<run()메소드, start()메소드>

쓰레드를 실행 시킬때 run()이 아닌 start()를 호출했다는게 의문이 들것이다. run()메소드는 어렵게 생각하지 말고 단순히 클래스에 오버라이딩 된 메소드를 호출해서 사용하는 것으로 생각하면 된다.

start()메소드는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(공간)을 생성한 다음 run()을 호출해서 그 안(스택)에 run()이 저장되는 것이다.

즉, 쓰레드를 사용하기 위해 start()를 실행시키는 순간 쓰레드만의 독립적인 작업 공간인 호출스택이 만들어지는 것이다. 그 후에 호출 스택안에 각 실행하고자 하는 예를 들면 run()과 같은 메소드들이 저장되는 것이다.

호출 스택에 있는 내용들이 모두 수행하고 나면 쓰레드는 호출스택 공간과 함께 메모리 상에서 소멸된다.



LIST

'Programming > Java' 카테고리의 다른 글

Java - FileInputStream, FileOutputStream  (0) 2015.12.08
Java - InputStream, OutputStream  (0) 2015.12.08
Java - 예외 처리 (Exception)  (0) 2015.12.08
Java - Hashtable, HashMap  (0) 2015.12.08
Java - Iterator  (0) 2015.12.08

프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료될 수 있다. 이러한 것을 우리는 에러났다, 오류가 발생했다가로 말한다.

에러는 두 가지가 있다.

'컴파일 에러'는 컴파일 할 때 발생하는 에러이고, '런타임 에러'는 프로그램 실행 도중에 발생하는 에러를 말한다.

 

우리가 소스 코드를 짠다고 가정하자. 그것은 .java파일을 만드는 과정이다.(인간들이 알아들을 수 있는 언어)

우리는 .java파일을 만들고 그 파일을 컴파일러에게 컴파일 요청을 한다. 그럼  이 컴파일러는 우리가 작성한 .java파일의 오류, 잘못된 구문, 자료형 체크 등 기본적인 문법 검사를 수행하여 오류가 있는지 알려준다. 성공적으로 각종 오류 검사를 마치고 나서 클래스 파일인 .class파일이 생성되고 클래스 파일을 실행할 수 있는 것이다.

하.지.만 컴파일을 에러없이 성공적으로 마쳤다고 해도 프로그램이 실행 도중 발생하는 에러는 있을 수 있다.  (이것이 런타임 에러)

우리는 런타임 에러를 일상생활에서 쉽게 마주친다. 예를 들어 어떤 프로그램을 실행시키는데 작동이 되지 않는경우, 혹은 갑자기 멈춘경우 등이다.

그래서 이런 오류 혹은 에러들을 모두 고려해서 프로그램을 작성해야 한다.

 

자바에서는 실행 도중 발생할 수 있는 프로그램 오류를 에러와 예외로 나누었는데 에러는 메모리 부족이나 스택오버플로우같이 발생할 경우 복구할 수 없는 심각한 것이고, 예외는 발생하더라도 수습될 수 있는 비교적 에러보다는 덜 심각한 것이다.

 

그렇다면 우리는 우리 손에서 처리할 수 있는? 예외처리에 대해서 공부해보자.

예외를 처리하는데 있어서 구문이 있다.

try {

// 예외가 발생할 가능성이 있는 내용, 메소드 등...

} catch (Exception e) {

// 예외가 발생했을때 수행하는 내용

}

다음과 같이 try~catch구문을 사용해서 우리는 예외 처리를 할 것이다.

 

<실습 - 1>



-결과-


왜 이런 구문이 뜬것인가? 코드를 보면 100이라는 숫자를 Math.random()으로부터 나온 숫자로 나누는 작업을 10번한다.

Math.random() 메소드는 0~9사이 무작위로 숫자 아무거나 반환하는데 나누기로 0을 반환해 버려서 에러가 나는 것이다.

자바에서는 정수를 0으로 나누면 위에 보시다시피 ArithmeticException을 발생시킨다.

자 그렇다면 예외가 어떻게 발생했는지 알수 있게 되었으니 try~catch 구문을 이용해 예외처리를 해보자.

 

<실습 - 2>


-결과-



위 코드를 보면 정수로 0을 나누어서 발생하는 ArithmeticException 예외에 대해서 try~catch문을 사용했다.

ArithmeticException가 발생했을 때 System.out.println("0으로 나누는 것은 불가능합니다."); 의 문장을 수행하게 된다.

그래서 결과에도 0아 아닌 다른 숫자들로 나누었을때는 정상적으로 프로그램이 작동하다가 0으로 나누는 순간 예외가 발생하여 catch문 안에 문장을 수행한 것이다.

 


<try-catch 흐름>

이번에는 예외가 발생했을때 try-catch문이 어떤 순서로 동작하는지 알아보자.

1. 예외가 발생하지 않은 경우

발생한 예외와 일치하는 catch블럭이 있는지 확인 한 후, 있으면 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속 수행한다. 일치하는 catch문을 못찾을 경우 예외는 처리되지 못하고 try-catch문을 빠져나와 문장을 수행한다.


<실습>



-결과-





2. try-catch에서 예외가 발생한 경우

catch블럭을 거치지 않고 try-catch문을 빠져나가서 계속 문장을 수행한다.



-결과-





<실습 - 3>

NumberFormatException을 발생시켜 숫자가 아닌 다른 문자를 받게 되면 예외처리하는 놈이다. 알아보도록 하자.



-결과-





<메서드에 예외 선언>

메서드에 예외를 선언하려면 throws라는 키워드와 함께 이 메소드를 사용하게 되면 발생할 수 있는 예외들을 옆에 나열할 수 있다.

이렇게 나열하게 되면 다음에 이 메소드를 사용하려는 사용자가 예외처리된 구문을 보고 어떠한 예외들이 처리되어야 하는지 알 수 있게 된다.



-결과-



LIST

'Programming > Java' 카테고리의 다른 글

Java - InputStream, OutputStream  (0) 2015.12.08
Java - Thread, (run()메소드, start()메소드의 차이)  (0) 2015.12.08
Java - Hashtable, HashMap  (0) 2015.12.08
Java - Iterator  (0) 2015.12.08
Java - Vector클래스  (0) 2015.12.08

<Hashtable, HashMap>


Hashtable보다는 HashMap이 새로운 버전이다. 대부분 HashMap을 사용하고 있지만 그래도 Hashtable도 다뤄보자.

HashMap은 Map을 구현했으므로 Map의 특징인 키와 값을 묶어서 하나의 데이터로 저장한다는 특징을 갖는다.

 

HashMap이 데이터를 어떻게 저장하는지 멤버변수에 대해서 알아보자.

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable {

   transient Entry[] table;

   ...

   static class Entry implements Map.Entry {

      final Object key;

      Object value;

   }

}

HashMap은 Entry라는 내부 클래스가 있고, 다시 Entry타입의 배열을 선언하고 있다.

key와 value는 별개가 아닌 관련이 있는 값이기 때문에 하나의 객체로 다뤄지고 있다.

 

HashMap의 자주 사용하는 메소드에 대해서 알아보자.

[메소드]

void clear() : HashMap에 저장된 모든 객체를 제거

boolean containsKey(Object key) : HashMap에 지정된 키가 포함되어 있는지 알려줌

boolean containsValue(Object value) : HashMap에 지정된 값이 초함되어 있는지 알려준다.

Object get(Object key) : 지정된 키의 값을 반환한다.

boolean isEmpty() : HashMap이 비어있는지 알려준다.

Set keySet() : HashMap에 저장된 모든 키가 저장된 Set을 반환한다.

Object put(Object key, Object value) : 지정된 키와 값을 HashMap에 저장한다.

Object remove(Object key) : HashMap에서 지정된 키로 저장된 객체를 제거한다.

int size() : HashMap에 저장된 요소의 개수를 반환한다

 

 

<실습>



-결과-


LIST

'Programming > Java' 카테고리의 다른 글

Java - Thread, (run()메소드, start()메소드의 차이)  (0) 2015.12.08
Java - 예외 처리 (Exception)  (0) 2015.12.08
Java - Iterator  (0) 2015.12.08
Java - Vector클래스  (0) 2015.12.08
Java - 내부클래스(Inner 클래스)  (0) 2015.12.07

<Iterator>

Iterator는 자바의 컬렉션 프레임웍에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 하였는데 그 중 하나가 Iterator이다.

Iterator는 인터페이스인데 그 구성을 살펴보자.

public interface Iterator {

   boolean hasNext();

   Object next();

   void remove();

}

boolean hasNext()메소드는 읽어 올 요소가 남아있는지 확인하는 메소드이다. 있으면 true, 없으면 false를 반환한다.

Object next()메소드는 다음 요소를 읽어 온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.

void remove()메소드는 next()로 읽어 온 요소를 삭제한다. next()를 호출한 다음에 remove()를 호출해야 한다. (선택적 기능이라 사용해도 그만 사용하지 않아도 그만이다)

 

Iterator는 다시 말해 인터페이스이다. 그렇다면 저 메소드들은 어떻게 정의가 되어있단 말인가?

List 혹은 Set인터페이스를 구현하는 컬렉션은 iterator()가 각 컬렉션의 특징에 맞게 설계가 되어있다.

한 마디로... 잘 짜여진 iterator의 기능을 우리는 사용하기만 하면 된다.

 

<실습>



-결과-


LIST

'Programming > Java' 카테고리의 다른 글

Java - 예외 처리 (Exception)  (0) 2015.12.08
Java - Hashtable, HashMap  (0) 2015.12.08
Java - Vector클래스  (0) 2015.12.08
Java - 내부클래스(Inner 클래스)  (0) 2015.12.07
Java - 인터페이스(interface)  (0) 2015.12.07

<Vector 클래스>

Vector클래스는 List인터페이스를 구현한 클래스 중 하나이다.

List 인터페이스에 구현되어 있는 메소드들을 살펴보도록 하자

void add(int index, Object element), boolean add(int index, Collection c) : 지정된 위치에 객체 또는 컬렉션에 포함된 객체들을 추가한다.

Object get(int index) : 지정된 위치에 있는 객체를 반환

int indexOf(Object o) : 지정된 객체의 이치를 반환한다.

ListIterator ListIterator() : List의 객체에 접근할 수 있는 ListIterator를 반환한다.

Object remove(int index) : 지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환

Object set(int index, Object element) : 지정된 위치에 객체를 저장

 

 

Vector클래스는 Vector클래스는 protected Object elementData[];라는 이름의 Object배열을 멤버변수로 선언하고 있다.

Vector클래스 중 자주 사용하는 메소드들을 정리해보았다.

 

[메소드]

void add(int index, Object element) : 지정된 위치(index)에 객체를 저장한다.

boolean add(Object o) : 객체를 저장한다.

int capacity() : Vector의 용량을 반환한다.

void clear() : Vector를 비운다.

boolean contains(Object elem) : 지정된 객체가 Vector에 포함되어 있는지 확인

Object firstelement() : 첫번째로 저장된 객체를 반환

Object get(int index) : 지정된 위치에 저장된 객체를 반환

Object lastelement() : 마지막에 저장된 객체를 반환

void insertElementAt(Object obj, int index) : 객체를 주어진 위치에 삽입한다.

int indexOf(Object elem) : 지정된 객체가 저장된 위치를 찾아 반환한다.

boolean remove(Object O) : 지정한 객체를 제거한다.

Object set(int index, Object element) : 주어진 객체를 지정한 위치에 저장

int size() : Vector에 저장된 객체의 개수를 반환

void trimToSize() : 용량을 크기에 맞게 줄인다. (빈 공간을 없앤다.)

 


<실습 - 1>


-결과-





<실습 -2>


-결과-



<실습 - 3>


-결과-




LIST

'Programming > Java' 카테고리의 다른 글

Java - Hashtable, HashMap  (0) 2015.12.08
Java - Iterator  (0) 2015.12.08
Java - 내부클래스(Inner 클래스)  (0) 2015.12.07
Java - 인터페이스(interface)  (0) 2015.12.07
Java - 추상클래스(abstract)  (0) 2015.12.07

<내부클래스(Inner  클래스)>

내부 클래스란 클래스 내에 선언된 클래스를 말한다. 이렇게 선언하는 이유는 한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점이 있고, 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점을 얻을 수 있기 때문이다.

 

<실습 - 1> 

내부 클래스 

 

-결과-

 

<실습 - 2>
메소드 안에서의 내부 클래서 선언

 

 

 

-결과-

 

 

<실습 - 3>
 내부 클래스에서의 접근 제한 (Static)

 

 

-결과-

 

 

<실습 - 4>
익명 클래스

 

 

-결과-

 

LIST

'Programming > Java' 카테고리의 다른 글

Java - Iterator  (0) 2015.12.08
Java - Vector클래스  (0) 2015.12.08
Java - 인터페이스(interface)  (0) 2015.12.07
Java - 추상클래스(abstract)  (0) 2015.12.07
Java - 제어자(static, final)  (0) 2015.12.07

<인터페이스>

어찌보면 추상클래스와 비슷해보이지만, 조금은 다르다. 오직 추상메소드와 상수만을 멤버로 가질 수 있으며, 그외 다른 어떠한 요소도 허용되지 않는다.

선언한 멤버 변수는 공통으로 사용되는 상수이며, 선언한 메소드는 반드시 자손 클래스에서 정의되어야 하는 메소드들이다.

 

인터페이스의 멤버들은 다음과 같은 제약사항을 갖고있다.

1. 모든 멤버변수는 public static final이어야 하고, 생략 가능하다.

2. 모든 메소드는 public abstract 이어야 하고, 생략 가능하다.

 

인터페이스도 추상 클래스처럼 그 자체로는 인스턴스를 생성할 수 없으며, 추상 클래스가 상속을 통해 추상메소드를 완성하는 것처럼, 인터페이스도 자신에게 정의된 추상메소드의 몸통을 만들어주는 클래스를 만들어야 한다. 클래스를 상속받아 사용할때는 extends라는 키워드를 사용하였지만, 인터페이스를 구현할 때는 implements라는 키워드를 사용해야한다.

 

<실습 - 1>

 

 

 

-결과-

 

 

<실습 - 2>

 

 

 

-결과-

 

 

 

<실습 - 3>

다중 상속

 

 

-결과- 

 

LIST

'Programming > Java' 카테고리의 다른 글

Java - Vector클래스  (0) 2015.12.08
Java - 내부클래스(Inner 클래스)  (0) 2015.12.07
Java - 추상클래스(abstract)  (0) 2015.12.07
Java - 제어자(static, final)  (0) 2015.12.07
Java - Calendar 클래스  (0) 2015.12.07

+ Recent posts