공부/java2014. 9. 22. 20:14


자바에있는 System 클래스에 대한 간단한 예제를 몇가지 살펴 보겠습니다. 이 System 클래스는 유용한 필드들을 포함하고 있는데, 표준입력, 표준출력, 표준에러 스트림입니다. System 클래스는 final 로 선언되어 있어서 클래스를 인스턴스화 할 수 없습니다.

또한 System 클래스는 많은 수의 메소드들을 포함하고 있으며 그것들을 이용하여 외부에서 정의된 프로퍼티들이나 환경변수, 파일들과 라이브러리들을 읽거나 할 수 있습니다. 또한 System 클래스는 다른 배열로 배열의 일부를 복사하는 간단한 메소드가 포함되어 있습니다.

System 클래스는 JDK 1.0 부터 포함되어 있었습니다.

System 필드들

        - 표준 입력 스트림

        - 표준 출력 스트림

        - 표준 오류 스트림

  • 참조 : 위의 세가지 스트림들은 이미 열려 있으며 데이터에 접근할 준비가 되어있습니다.

Read line example

package kr.co.leehana.example.system;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadLineExample {

	public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		
		// 표준 입력 스트림으로부터 라인을 읽습니다.
		String inputLine = reader.readLine();
		
		StringBuilder builder = new StringBuilder(inputLine);
		builder.reverse(); // 입력된 라인을 역으로 정렬
		
		System.out.println("Input string : " + inputLine);
		System.out.println("Reversed string : " + builder.toString());
		System.err.println("Reversed string : " + builder.toString());
		
		reader.close(); // 열려 있는 스트림 닫기
	}
}

위의 예제에서 우리는 표준 입력 스트림으로 부터 완료된 라인을 읽을것 입니다. 그리고 읽어 들인 라인을 역으로 정렬(reversed)하여 표준 출력과 표준 오류 스트림을 이용하여 쓰는 것을 보여줍니다. 예제가 실행 되고 나면 아래와 같은 결과가 출력 됩니다.

Input string : Hello from Java Code Geeks!
Reversed string : !skeeG edoC avaJ morf olloH
Reversed string : !skeeG edoC avaJ morf olloH

Array copy

System 클래스는 현재 배열의 일부를 다른 배열로 복사 할 수 있는 메소드를 제공합니다. 그 메소드의 정의는 다음과 같습니다.

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

각각의 인자들

  • src : 원본 배열
  • srcPos : 원본 배열에서 복사가 시작 될 위치
  • dest : 복사의 대상이 될 배열
  • destPos : 복사의 대상이 될 배열에 복사를 할 위치
  • length : 복사가 될 요소의 갯수

예제를 보겠습니다.

package kr.co.leehana.example.system;

public class ArrayCopyExample {
	
	private final static int TOTAL_ELEMENTS = 10;

	public static void main(String[] args) {
		int[] src = new int[TOTAL_ELEMENTS];
		
		for (int i = 0; i < TOTAL_ELEMENTS; i++)
			src[i] = i + 1;
		
		System.out.print("Source array : ");
		for (int i = 0; i < TOTAL_ELEMENTS; i++)
			System.out.print(src[i] + " ");
		System.out.println();
		
		int destSize = src.length / 2;
		int[] dest = new int[destSize];
		System.arraycopy(src, 0, dest, 0, destSize);
		
		System.out.print("Destination array : ");
		for (int i = 0; i < destSize; i++)
			System.out.print(dest[i] + " ");
		System.out.println();
	}
}

위 예제에서 우리는 원본 배열의 절반을 대상 배열에 복사를 하였습니다. 예제를 실행하면 아래와 같은 결과 출력 됩니다.

Source array : 1 2 3 4 5 6 7 8 9 10
Destination array : 1 2 3 4 5

System Properties

System 클래스는 private 인스턴스로 Properties 클래스를 포함하고 있으며, 현재 동작중인 환경에 대한 구성을 제공합니다.

  • 참조 : 중요한 시스템 프로퍼티들은 여기에서 확인 해볼수 있습니다.

아래의 예제를 통해 몇가지 시스템 프로퍼티들을 콘솔에 출력 해보겠습니다.

package kr.co.leehana.example.system;

public class SystemPropertiesExample {

	public static void main(String[] args) {
		// 현재 시스템의 자바 버전을 출력합니다.
		System.out.println("Java version: "
				+ System.getProperty("java.version"));

		// 현재 시스템의 OS 버전을 확인 합니다.
		System.out.println("OS version: " + System.getProperty("os.version"));

		// 현재 유저의 홈디렉토리를 출력 합니다.
		System.out
				.println("Home directory: " + System.getProperty("user.home"));
	}
}

예제를 실행하면 아래와 같은 출력을 볼 수 있으며, 이 출력된 내용은 플랫폼에 따라 달라질 수 있습니다.

Java version: 1.6.0_65
OS version: 10.9.5
Home directory: /Users/voyaging

Environmental variables (환경 변수들)

또한 System 클래스는 환경변수를 읽을 수 있는 getenv() 메소드를 제공하며, 모든 환경 변수를 Map 클래스로 반환합니다.

예제를 통해 확인 해보겠습니다.

package kr.co.leehana.example.system;

import java.util.Map;

public class EnvironmentalVariablesExample {
	public static void main(String[] args) {
		Map<String, String> vars = System.getenv();

		// 모든 환경 변수를 출력합니다.
		for (String key : vars.keySet())
			System.out.println("Key: " + key + ", Value: " + vars.get(key));
	}
}

예제를 실행하면 아래와 같은 출력을 볼 수 있으며, 이 출력된 내용은 플랫폼에 따라 달라질 수 있습니다.

Key: APP_ICON_20159, Value: ../Resources/sts.icns
Key: SHELL, Value: /bin/bash
Key: TMPDIR, Value: /var/folders/6p/cx6thx5n3wj7p_698lk7jy_w0000gn/T/
Key: com.apple.java.jvmMode, Value: client
(중략)
Key: JAVA_MAIN_CLASS_22572, Value: kr.co.leehana.example.system.EnvironmentalVariablesExample

Current Time (현재시간)

System 클래스는 간단한 currentTimeMillis() 메소드를 제공하고 있으며, 현재의 시간을 밀리세컨드로 반환합니다. 이 메소드에 의해 반환되는 값은 현재 시간에서 1970년 1월 1일 자정 UTC 의 시간을 뺀 값입니다.

예제는 아래와 같습니다.

package kr.co.leehana.example.system;

public class CurrentTimeMillisExample {

	public static void main(String[] args) {
		System.out.println("The current time in milliseconds : "
				+ System.currentTimeMillis());
	}
}



예제

출처


'공부 > java' 카테고리의 다른 글

Java BufferedInputStream 예제  (0) 2014.09.23
Java List remove object 예제  (0) 2014.09.23
Java BufferedOutputStream 예제  (0) 2014.09.22
Java BufferedWriter 예제  (0) 2014.09.06
Java List 를 배열로 변환 하는 예제  (0) 2014.09.05
Posted by #HanaLee
공부/java2014. 9. 22. 14:31

이번 예제는 BufferedOutputStream 클래스에 대한 예제 입니다. 이 클래스는 버퍼링된 출력 스트림을 구현합니다. 이렇게 출력 스트림을 설정하게 되면 어플리케이션에서는 각각의 바이트를 쓰기 위해 시스템을 호출 하지 않고 여러개의 바이트를 기본이 되는 출력 스트림에 작성 할 수 있습니다.

BufferedOutputStream 클래스는 FilterOutputStream 클래스를 확장하였으며 FilterOutputStream 은 출력 스트림을 필터 처리 하는 모든 클래스의 상위 클래스입니다. 이러한 스트림은 기본적인 데이터의 sink 로 사용하기 위한 기존에 이미 존재하는 출력 스트림 (기본이 되는 출력 스트림)의 최상위에 있습니다. 다만, 데이터를 도중에 변경하는것이나 추가 기능을 제공하는 경우도 있습니다.

BufferedOutputStream 클래스는 JDK 1.0 부터 도입 되었습니다.

BufferedOutputStream 클래스의 기본 구조.

생성자

            - 기본이 되는 출력 스트림에 데이터를 작성 하기 위한 버퍼링 된 출력 스트림을 생성합니다. 

            - 기본이 되는 출력 스트림에 데이터를 작성 하기 위한 버퍼링 된 출력 스트림을 지정된 버퍼 사이즈로 생성합니다.

BufferedOutputStream 예제-1

다음 소스를 통해 어떻게 BufferedOutputStream 클래스를 이용하여 파일을 작성하는지 살펴 보겠습니다.

package kr.co.leehana.example.bufferedoutputstream;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedOutputStreamBasicExample {

	public static void main(String[] args) {
		BufferedOutputStream stream = null;
		try {
			stream = new BufferedOutputStream(new FileOutputStream("out.txt"));
			stream.write("Hello, World!".getBytes());
			stream.write(System.getProperty("line.separator").getBytes());
			stream.write("I am writting into a file using BufferedOutputStream"
					.getBytes());
			stream.write(System.getProperty("line.separator").getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (stream != null) {
				try {
					stream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

BufferedOutputStream 클래스에는 두개의 write() 메소드가 존재 합니다.

위 예제에서는 write(byte[] b) 를 사용하였는데 이것은 상위 클래스인 FilterOutputStream 클래스의 메소드 입니다. 또한 위 예제에서 사용한 write() 메소드는 바이트배열을 인자로 받기 때문에 getByte() 메소드를 강제로 호출 하였습니다.

항상 기억해야 하는것은 BufferedOutputStream 인스턴스의 사용이 끝났을 때 혹은 더이상 작성할 내용이 없을 때에는 close() 메소드를 호출해야 한다는것입니다.

BufferedOutputStream 예제-2

이번에는 BufferedOutputStream 클래스를 이용하여 파일에 로깅을 기록하는 예제를 살펴 보겠습니다.

먼저 Logger 클래스를 작성합니다.

package kr.co.leehana.example.bufferedoutputstream;

import java.io.FileNotFoundException;
import java.io.IOException;

public class BufferedOutputStreamLoggingExample {

	public static void main(String[] args) {
		Logger logger = null;
		try {
			logger = new Logger("out.log");
			logger.log("Log message 1");
			logger.log("Log message 2");
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (logger != null) {
				try {
					logger.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

다음은 위 Logger 클래스를 테스트 하기 위해 main 메소드가 포함된 테스트 클래스를 살펴 보겠습니다.

package kr.co.leehana.example.bufferedoutputstream;

import java.io.FileNotFoundException;
import java.io.IOException;

public class BufferedOutputStreamLoggingExample {

	public static void main(String[] args) {
		Logger logger = null;
		try {
			logger = new Logger("out.log");
			logger.log("Log message 1");
			logger.log("Log message 2");
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (logger != null) {
				try {
					logger.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

출력된 파일을 열어보면 두줄로 쓰여진 로깅 내용을 확인 할 수 있을 것입니다.

BufferedOutputStream 에 대한 추가 내용

BufferedOutputStream 클래스는 직접적으로 출력 스트림에 쓰지 않습니다. 당연하겠지만 이 클래스는 더 나은 성능으로 스트림에 쓰기 위해 버퍼에 먼저 쓰게 됩니다. 한가지 기억할 것은 버퍼의 크기를 생성자에 넘겨 줄 수 있다는것입니다. 만약 아무값도 넘기지 않으면 기본값(8192)으로 설정됩니다. close() 메소드를 호출하면 버퍼의 내용을 스트림에 쓰게 됩니다. 이것을 확인 하기 위해close() 메소드를 호출 하지 않으면 파일에는 아무것도 쓰지 않게 됩니다.

만약 스트림을 닫지 않고 버퍼의 내용을 파일에 쓰고 싶을때에는 flush() 메소드를 호출 하면 됩니다. 만약 close() 메소드를 호출 한뒤 write() 나 flush() 메소드를 호출하게 되면 IOException 이 발생합니다.

마지막으로 BufferedOutputStream 클래스의 모든 메소드는 IOException 이 발생 할 수 있기 때문에 BufferedOutputStream 클래스의 메소드들을 이용할때에는 try-catch 를 사용해야 합니다.




소스코드

참조


'공부 > java' 카테고리의 다른 글

Java List remove object 예제  (0) 2014.09.23
java.lang.System 예제  (0) 2014.09.22
Java BufferedWriter 예제  (0) 2014.09.06
Java List 를 배열로 변환 하는 예제  (0) 2014.09.05
Java FileWriter 예제  (0) 2014.09.05
Posted by #HanaLee
공부/JSF2014. 9. 22. 06:00

stackoverflow 에서 JSF 에 대해 알아보다 흥미로운 주제의 글이 JSF 태그에서 가장 인기 있는 글로 올라와 있어 공유 해드립니다.

그리고 여담이지만 stackoverflow 가 특별히 기준이 될수는 없겠지만, 질문된 글의 갯수를 보면... JSF 는 역시나 큰 인기는 없는것 같습니다. 하지만 새로운 기술 하나를 알아가는건 중요하다고 생각합니다.

What is the difference between JSF, Servlet and JSP?

이 질문에 대한 답변으로 BalusC 라는 사람이 답변을 달아준게 있습니다. 참고로 JSF 에 대해 구글링을 하거나 stackoverflow 에서 검색을 하다보면 자주 보게 될 이름중 하나이기도 합니다.

JSP (JavaServer Pages)

JSP 는 템플릿 텍스트(HTML, CSS, javascript 등)를 쓸 수 있는 어플리케이션 서버에서 실행되는 Java view technology 입니다. JSP 는 동적으로 페이지의 흐름 또는 출력을 제어 할 수 있는 자바 코드를 작성 할 수 있고 taglibs 를 지원합니다. 잘 알려진 taglibs 로는 JSTL 이 있습니다. JSP 는 주로 태그 라이브러리(taglibs) 와 조합하여 (page, request, session, application scope 가 허용하는 속성을 통해) 백엔드 데이터에 접근할 수 있는 표현식 (Expression Language) 을 지원합니다. 

JSP 는 처음으로 요청되거나 웹어플리케이션이 시작될 때 서블릿 컨테이너에 의해 HttpServlet 클래스를 확장하는 서브클래스로 컴파일하고 웹어플리케이션이 종료 될 때까지 사용됩니다. 이렇게 컴파일된 코드는 웹 어플리케이션 서버의 작업 디렉토리에서 찾아 볼 수 있습니다. 예를 들어 tomcat 의 경우 /work 디렉토리에서 찾을 수 있습니다. JSP 에 요청이 들어오면 서블릿 컨테이너는 컴파일된 JSP 를 실행하며 생성된 출력 (대체로 HTML/CSS/JS) 을 웹서버를 통해 클라이언트에 있는 웹브라우저에 나타나게 됩니다.

Servlet (서블릿)

서블릿은 서버에서 실행되는 Java API(Application programming interface) 이며 이것은 클라이언트에서 보내진 요청(request) 를 가로채고 응답(response) 를 생성하거나 전달한다. 잘 알려진 예로는 HTTP 메소드들중 GET 과 POST 등을 HttpSevlet 클래스로 hook 하는 방법을 제공한다. web.xml 을 통해 URL 패턴을 설정하여 HttpServlet 이 응답(listen) 하게 할 수 있으며 JavaEE6 이후부터는 @WebServlet 어노테이션으로 동일한 설정을 할 수 있다.

서블릿은 처음으로 요청(request) 되거나 웹어플리케이션이 시작될 때 서블릿 컨테이너가 서블릿 인스턴스를 생성하고 웹 어플리케이션이 종료 될 때까지 메모리에 보관되어 사용됩니다. 동일한 URL 패턴에 대해서는 같은 인스턴스를 재사용하게 됩니다. HttpServletRequst 를 통해 요청 데이터에 접근 할 수 있고 HttpServletResponse 를 통해 응답을 처리 할 수 있습니다. 두 객체는 HttpServlet 클래스로 부터 오버라이드 할 수 있는 doGet() 메소드와 doPost() 메소드등의 파라메터값으로부터 사용 할 수 있습니다. 

JSF (JavaServer Faces)

JSF 는 서블릿 API 위에서 동작하며 JSP 및 Facelets 와 같은 다른 자바 기반 뷰 기술에서 사용할 수 있고 웹컴포넌트들의 태그 라이브러리(taglibs)를 지원하는 컴포넌트 기반의 MVC 프레임워크 입니다. JSP 보다는 Facelets 가 JSF 에 더 적합한 뷰 기술 입니다. Facelets 는 Composite Components을 이용한 좋은 템플릿을 제공하는데 하나의 컴포넌트와 반복되어진 컴포넌트를 교체 하고자 할때 JSP 는 템플릿을 위해 오로지 jsp:include 태그를 지원하며 이는 raw 자바 코드를 이용한 커스텀 컴포넌트를 만드는것을 강제 합니다. 만약 가능하다면 JSP 는 사용하지 말고 Facelets 을 이용하여 JSF 를 개발 할 것을 권장합니다.

JSF 는 MVC 프레임워크로써 요청(request) - 응답(response) 를 위한 하나의 컨트롤러로 FacesServlet 을 제공합니다. FacesServlet 은 표준적인 HTTP 요청/응답에 대한 작업을 사용자가 직접 작업할 수 있으며 유저 입력값에 대한 검증(validating)/변환(converting), 그리고 값을 model 객체에 집어 넣고, action 을 실행하고 응답을 랜더링합니다. 뷰(view) 를 위해서는 기본적인 JSP 혹은 Facelets(XHTML) 을 이용하고 모델(model) 로는 JavaBean 을 이용하게 됩니다. JSF 컴포넌트는 뷰와 모델을 바인딩 하는데 사용이 되고(ASP.NET 의 웹컨트롤과 비슷) FacesServlet 은 JSF 컴포넌트 트리를 이용하여 모든 작업을 수행하게 됩니다.

ps. stackoverflow 의 글을 발번역 하고 나니 많이 어색하네요... 추후 기회를 봐서 재수정을 하던지 해야겠습니다. :-)




참조


'공부 > JSF' 카테고리의 다른 글

JavaServer Faces 버전 히스토리  (0) 2014.10.02
Facelets 소개  (0) 2014.10.02
JSF 기술의 이점  (0) 2014.10.02
JSF 어플리케이션이란 무엇일까요?  (0) 2014.10.01
JSF 에 대하여  (1) 2014.09.19
Posted by #HanaLee