System.out.println("Hello, World");

'프로그래밍/자바'에 해당되는 글 22건

  1. 2012.03.28 자바 : Input 예재
  2. 2012.03.28 자바 : Input / Output
  3. 2012.03.28 자바 : Exception 예외 처리의 이해
  4. 2012.03.27 자바 : Exception 예제 1
  5. 2012.03.27 자바 : Finally 1
  6. 2012.03.26 자바 : 예외처리 및 기타
  7. 2012.03.26 자바 : Exception
  8. 2012.03.26 자바 : BigDecimal
  9. 2012.03.26 자바 : Exception 클래스 만들기와 Throw
  10. 2012.03.25 3. 자바

파일을 byte하나씩 받기


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

public class FileStreamTest {
	public static void main(String[] args) {
		FileInputStream fi = null;
		try {
			//1. 연결
			fi = new FileInputStream("D:\\Desert.jpg");//연결
			//2. I/O작업(읽는 작업)
		int data = fi.read();//1바이트 
		int count =0;
		long l1 = System.currentTimeMillis();//시간 계산
		while(data!=-1){
			count++;
			data = fi.read();
		}
		long l2 = System.currentTimeMillis();//시간 계산
		System.out.println("읽은 횟수 : "+count);
		System.out.println((l2-l1)/1000+"초");
		//3. 연결 끊기
		//fi.close();//연결 끊기
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(fi!=null){//만약 fi가 null이 아닐 경우
				try {
					fi.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}		
	}
}


Posted by 김마농

Stream : 데이터의 흐름(통로)

Java.io 

① Input/Output class로 구분

② Node / Filter로 구분

③ Byte / Character 계열로 구분

ex)하나의 클래스가 Input/Node/byte 여러가지를 가질수 있다.


Node계열 : 연결시 목적인 Stream class

                연결이 목적이므로 입출력을 위한 기본 기능을 제공

Filter계열 : 기존의 Stream(연결된)이 읽고 쓰는 기능을 추가하는 class

          기능 추가가 목적이므로 연결 기능은 없다.

  -> Node로 연결하고 Filter로 기능 추가

Byte계열 : 1byte단위 입출력 처리하는 Stream

               binary code 입출력시 사용

Character 계열 :2byte 단위 입출력 처리시 Stream Class

                       Text 입출력시 사용


<패턴>

try{
1.연결- Node
        -기능추가 -> Filter
2. I/O(Input / Output)
}finally{
3. 연결끊기 -> 필터를 끊으면 Node도 같이 끊키게 된다.
}



 

 Input 계열

Outout 계열


Byte계열 

 character계열

 Byte계열

character계열

 최상위 class(추상)

 InputStream

Reader

OutputStream

Writer

 Node계열

 FileSteam

 FileReader

FileoutputStream 

FileWriter 

 Filter계열

 ObjectFileStream
DataInputStream

BufferedReader
InputStreamReader 

ObjectOutputStream 
DataOutputStream
PrintWriter

BufferedWriter
OutputStreamWriter
PrintWriter 

BufferedReader로 읽고 PrintWriter로 출력한다.

DataOutputStream은 primitive타입으로 출력한다.

또한 만약 Input의 Byte계열로 받을때에는 그 라인에 해당되는 계열만 사용할 수 있다. 또한 FileInputStream을 

FileInputStrema을 BufferedReader 뒤에 쓰고 싶을때에는 FileInputStream을 InputStreamReader로 변환시켜서 사용한다. FileOutputStream도 마찬가지다. 

Node계열 생성자의 인수 : 연결대상
Filter계열 생성자의 인수 : Stream class type, Reader/Writer, InputStream / OutputStream

<입력시>

InputStream
-
1byte로 입력 받음

InputStream의 메소드

read():int
읽어들인 Data를 int type의 공간의 마지막 1 byte에 저장
- EOF(파일의 마지막)을 만나면 -1을 return

read(byte[]):int
- 읽어들인 Data들을 byte[]에 꽉 찰때까지 넣은 후 1 byte씩 꺼내 저장함
- byte[]의 index를 return
EOF(파일의 마지막)을 만나면 -1을 return

Reader
- char(2 byte) 단위로 입력 받음

Reader의 메소드

read() : int
- 읽어들인 Data를 int type의 공간의 마지막 2 byte에 저장
- EOF(파일의 마지막)을 만나면 -1을 return


read(char[]) : int
- 읽어들인 Data들을 char[]에 꽉 찰때까지 넣은 후 char 문자 1개씩 꺼내 저장함
- char[]의 index를 return


<출력시>

- OutputStream
○byte계열

write(int) 
- 인수로 받은 byte를 출력

wirte(byte[])
- byte 배열내의 data들을 한번에 출력한다.

wirte(byte[],int Start Index, int length)
- byte 배열내의 data중 Start Index에서 length만큼의 data출력한다.

ex) byte[] b= new byte[50]{
write(b,5,10)
}
-> 5 ~ 14만큼의 출력한다.

- Writer
○character계열 

write(int)
-인수로 받은 char를 출력

write(char[])
-
char 배열내의 data들을 한번에 출력한다.

write(char[],int start index, int length)
- char 배열내의 data중 Start Index에서 length만큼의 data출력한다.

close() : 연결 끊는 서비스
in.read() : 읽은 data가 없으면 무한히 기다린다. I/O Blocking
flush() : 버퍼를 이용하는 Stream의 버퍼내 Data들을 강제 출력 처리한다.


<입출력 코딩 패턴>

File IO
- File과 연결하여 Input / Output을 하는 것
- File과 연결해야 하므로 생성자 호출시 String fileName1을 인수로 넘김
- 생성과 동시에 File과 연결이 됨

byte 단위

- FileInputStream
- FileOutputStream

char 단위

- FileReader
- FileWriter

생성자 : (String 파일명)
ex)FileWriter fw = new FileWriter("a.txt");

위와 같은 구문을 작성해서 실행하고, 생성되면 그 순간 Stream이 연결되어 출력 할 수 있게 된다.

Posted by 김마농

문법 에러외의 다른 에어를 실행에러이다. 컴파일이 잘 되었음에도 실행 중에 에러가 발생하는 것이다. 실행 에러는 크게 세 가지로 나눌수 있는데, 논리적으로 잘못된 프로그램에서 발생하는 '논리 에러'와 프로그램 실행중의 특별한 상황 떄문에 발생하는 '예외', 그리고 컴퓨터 시스템에서 발생하는 '시스템 에러'이다. 논리에러는 프로그램을 완전히 잘못 작성한 경우로 해결방법은 다시 작성하는 수밖에 없다. 정전이나 하드 디스크 오류와 같은 시스템 에러는 사실 프로그래머가 어떻게 할 수 있는 성질의 것이 아니라서 사전에 예방 할 수 밖에 없다. 

예외라는 것은 프로그램이 정상적으로잘 작성되었는데에도, 실행하는 과정에서 여러 이유로 발생하는 에러를 말한다. 이처럼 프로그램이 정상적으로 잘 진행될 수 있는데, 실행중에 잘못된 입력이나 사용으로 발생하는 에러를 예외(Exception)라고 하고, 자바에서는 예외를 복구 할수 있는 방법을 제공한다.


 메소드

설명 

 ArithmeticException

0으로 나누려고 할 떄 발생 예 : (int i=12/0;) 

 NullPointerException

객체를 생성하기 전에 사용하려고 할때와 NULL값 

 NegativeArraySizeException

 배열의 크기를 음수로 줄때 발생

 ArrayIndexOfBoundsException

 첨자가 배열의 크기 범위를 벗어날 때 발생

 SecurityException

 애플릿이 보안을 위반했을때 발생

◎Try - catch 문

자바에서는 예외가 발생했을때, 이를 처리하기 위한 루틴으로 이동하는 것을 "던진다(throw)라고 말한다. 예외를 복구하는 방법은 ①예외가 발생할 가능성이 있는 부분을 try 명령으로 감싸고 예외가 발생한 메시지를 던진 후 ② catch 명령으로 try가 던진 예외를 받아서 처리한다. 

현재 여기서는 try-catch구문을 만들어본다. 이때 catch문을 여러개가 있을 수 있는데, 그럴 떄는 Exception객체에 따라 구분한다. 예를 들어 try명령이 MyException형 예외를 던지면 catch(Exception e)가 받고, try 명령이 ArithmeticException형 예외를 던질경우 catch(ArithmeticException)가 받게 된다.

try{
//예외가 예상되는 부분
}catch(Exception형 e){
//Exception형에 따라 예외를 처리하는 부분 1
}catch(Exception형 e){
//Exception형에 따라 예외를 처리하는 부분 2
}

ArrayException.java

public class ArrayExceptionTest {
	
	public static void main(String[] args) {
		String language[] = {"언어","C언어","자바"};
		
		int i=1;
		while(i<4){
			try{
				System.out.println(language[i]);
			}catch(ArrayIndexOutOfBoundsException e){
				System.out.println("배열의 첨자를 다시 설정합니다.");
				i=-1;			
			}
			i++;
		}
	}
}

◎ finally

try - catch명령을 사용할때 예외의 발생과는 상관없이 무조건 실행하고 싶은 명령이 있다면 finally명령을 사용하면 된다. 이때 finally명령은 try-catch 명령이 종료된 후에 처리되는 명령이기 때문에 catch명령 다음에 사용해야 한다.

try{
//예외가 예상되는 부분
}catch(Exception형 e){
//Exception형에 따라 예외를 처리하는 부분
}finally{
//무조건 실행하고 싶은 부분
ArrayExceptionTest2
public class ArrayExceptionTest2 {
	
	public static void main(String[] args) {
		String language[] = {"언어","C언어","자바"};
		
		int i=1;
		while(i<4){
			try{
				System.out.println(language[i]);
			}catch(ArrayIndexOutOfBoundsException e){
				System.out.println("배열의 첨자를 다시 설정합니다.");
				i=-1;
			}finally{
				System.out.println("언제나 나오는 부분");
			}
			i++;
		}
	}
}

◎ throws와 throw

신뢰성 있는 코드를 작성하도록 하기 위해서 자바에서는 '선언하거나 처리하라(Declare or Handle'라는 규칙을 정해두었다. 이 규칙은 예외가 발생할 가능성이 있는 곳은 try-catch 명령으로 처리하고, 만일 처리하지 못하는 경우에는 throws 명령으로 선언해야 한다는 뜻이다. 자바에서는 예외가 발생하면 해당하는 명령으로 감싸고 있는 try-catch명령을 찾고, 만약 try-catch 명령이 없을 경우에는 예외가 발생한 부분을 호출한 상위 클래스로 올라가게 된다. 따라서 예외를 처리해 주지 않으면, 연속적으로 예외가 던져지고(throw), 마지막에는 자바 가상머신(JVM)이 에러 메시지를 출력하고 프로그램이 종료되게 된다. 

모든 예외에서 try-catch명령으로 처리를 해주는게 옳지만, 예외가 발생할 가능성이 있는 모든 곳을 다 처리한다는 것은 사실상 불가능한 일이다. 이럴 때는 thows명령으로 발생 가능한 예외를 선언해 주면, '이 부분이 예외를 발생시킬 가능성은 있지만 처리는 하지 않고, 이 부분을 호출한 곳으로 처리를 미룬다'는 뜻이 된다.

public class ThrowsTest {

	public int divide(int x, int y) throws ArithmeticException
	{
		int result;
		
		try{
			result = x/y;
		}catch(ArithmeticException e){
			throw(e);
		}
		return result;
	}
	public static void main(String[] args) {
		{
			ThrowsTest x = new ThrowsTest();
			for(int i=5; i>=0; i--){
				int dive_100 = x.divide(100,i);
				System.out.println("100을 "+i+"로 나누면:"+dive_100);
			}	
		}
	}
}



Posted by 김마농
try - catch문 기본 형태
public class IDNotFoundException extends Exception{
	public IDNotFoundException(){}
	public IDNotFoundException(String message){
		super(message);
	}
}


항상 위와 같은 패턴을 사용하기 때문에 익숙해줘야 한다. 

금일 실시한 Exception 소스들



Posted by 김마농

Finally

- finally를 사용할려면 try, catch, finally를 같이 써야 하며, finally에는 무조건 실행해야하는 코드가 들어온다.

- 코딩할때는 대게 외부자원을 끊는 코드로 쓰이게 된다. 


try{
1.___________________
2.___________________
3.___________________
}catch(AException){
4.___________________
finally{
5.___________________
6.___________________

- 1번이 AException이 있을 경우, 1번은 실행이 안되고, 4번 -> 5번-> 6번 실행된다.

- AException이 없을 경우, 1번-> 2번-> 3번 -> 5번 -> 6번이 실행된다.

- 2번이 BException일경우 1번 -> 2번 실행안되고 -> 5번이 실행된다.

(만약 finally가 아니라면 빠져 나간다.)


<File, Network, DB같은 외부자원으로 이용하는 코딩패턴>

try{
1.연결
2.주고받기(통신)
}catch(XXXXXXXXX XX){
문구
finally{
3.연결끊기


try : 오류날 가능성이 있는 코드(실행 코드)

1. try{}catch(){}

2. try{}finally{} //catch 없어도 쓸수 있다.

catch : try block에서 난 오류를 처리하는 코드

finally : try와 catch의 상황과 상관없이 무조건 실행(정상)되어야 하는 코드

1. try -> catch -> finally(이 순서대로 배치되어야 한다.)


printStackTrace() : 익센셥 일어나는 위치 확인해주는 역할



Posted by 김마농

throws : 예외 발생한 메소드를 호출한 caller 메소드에서 처리하도록 하는 것.
try, catch, fianlly : 발생한 예외를 직접 처리 하는 것

throws
-발생한 Exception에 대해 자신이 책임을 지지 않고 자신을 호출한 곳으로 Exception을 던져주는 역할

throws구문
[제한자] returnType 메서드이름([매개변수]) throws ExceptionType , ..... { }
ex : public void go() throws AException, BException{}


 메소드 overriding 복습
-하위 class에서 부모의 메소드 재정리
◇규칙-전제 : 이름 통일
 ① return Type, 매개변수가 동일
 ② 하위의 접근제한자가 상위것과 같거나 더 넓어야 한다.
 ③ 부모가 throws한 것만 할 수 있다.
   - 부모에서 throws 한것을 안할 수 있다. 



  Super클래스
public void go() throws AException{
~~~~}
Sub클래스
public void go(){}
가능하다 
public void go() throws AException, BException
불가능하다, 더 던지는것은 불가능하며, 최상위 부모는 보지 않고 바로 위 부모만 확인해야 한다.
public void go() throws A1Exception, A2Exception
부모타입이라면 던질수 있다. 

try, catch, finally의 사용
try{ // 오류가 발생 할지 안 할지 확실치 않으므로 일단 시도 (try)
    오류(예외)가 발생할 가능성이 있는 코드
}
catch(예외타입 e){ // 예외타입에 맞는 예외가 발생한다면 잡는다 (catch) / 다른 타입이 발생한다면 못 잡는다.
    처리코드
}

~try내부에 여러 코드를 일괄 처리 할 수 있지만 Exception이 발생하면 Exception을 처리하고 try/catch밖의 실행구문을 실행한다.
 
public class ExceptionTest1 {
	public static void main(String[] args) {
		//uncheck 계열의 Exception
		//ArrayIndexOutOfBoundsException - 배열의 index범위를 넘었을때 발생
		//NullPointerException - null값을 가진 변수의 instance멤버 호출시 발생
		//ArithmeticException - 산술 연산상 문제 발생시 발생(0으로 나눈 경우)
		String str = null;
		try{System.out.println(str.concat("def"));//null포인터 인셉션 일어남//100%
		}catch(NullPointerException ne){
			System.out.println("NullPointerException 1번);
		}
		try{System.out.println(10/0);
		}catch(ArithmeticException eee){
			System.out.println("ArithmeticException 2번");
		}try{
			int[] arr={10,20,30};
			System.out.println(arr[10]);
		}catch(ArrayIndexOutOfBoundsException eeee){
			System.out.println("ArrayIndexOutOfBoundsException 3번");
		}		
		System.out.println("메소드 종료");
	}
}

<결과창>

 예외 처리 없이 정상적으로 실행시 1번 구문에 있는 try문 안에 있는 구문 종료후 catch문을 건너뛰고 2번으로 가고 2번  도 이상없으면 3번으로 이동후 3번도 이상없으면 System.out.println("메소드 종료") 구문을 출력하고 종료되어야 한다. 
 하지만 위 소스는 모든 것에 예외처리를 주었다. 또한 각각 try-catch구문을 따로 해놓아 예외처리를 따로따로 처리한  다.

<금일 진행한 소스코드> 
  <Divide.java와 ExceptionTest.java, ZeroDivideException.java SET>
ExceptionTest 결과값
 
Posted by 김마농
오류
- 프로그램이 정상적으로 실행하지 못하는 상황


오류의 종류
Error : 심각한오류 - H/W적 오류
Exception(예외) : mild(덜 심각)한 오류 - S/W적 오류
                         실행시 정상적인 흐름, 프로그래머가 의도한 흐름으로 가지 못하는 상황을 일컫는다.



Throwable : 오류의 최상위


Unchecked
- 컴파일러가 Exception 처리여부를 check 안함
- 처리(Handling)보다는 code수정을 통해 해결한다.
발생이유 : Code상의 문제 때문에 발생
                 Complier의 check가 불가능한 경우 

Checked
 - 컴파일러가 Exception 처리 여부를 check함
 - check하지 않았을 경우 complie 에러 발생
 - Exception Handling을 통해 해결한다.
발생이유 : Code상 문제가 아니라 User가 잘못 사용하거나 실행 환경상 문제로 발생.
               발생확률은 50:50이며 처리가 필요하다. 

Exception 관련 Keyword
오류를 발생
- throw

오류를 처리하는 역할
- throws
- try : catch 또는 finally와 함께 사용되어야 한다.
- catch : try와 함께 사용되어야 한다.
- finally : try와 함께 사용되어야 한다.

Exception Class 정의하는 법
◇ Exception class 작성
1. checked : Exception을 extends
  unchecked : RuntimeException을 extends

2. public class로 정의
3. no-argument 생성자 정의
4. 필요한 Attribute, 메소드 구현
5. class의 이름 : ~~Exception(~~는 Exception 발생원인으로 네이밍한다.)

 Exception의 발생
 - 구문 : throw Throwable의 객체;

Posted by 김마농
BigDecimal
java.Math.BigDecimal - double로 표현이 안되는 부동소수점(실수)로 표현
              BigInteger  - long으로 표힌이 안되는 정수를 표현

BigDecimal의 생성
new BigDecimal("10.5");
BigDecimal 사용 예
import java.math.BigDecimal;
public class BigDecimalTest {
    public static void main(String[] args) {
        System.out.println(2.00 - 1.10); // 0.9나와야 하는데 0.899999999 나옴
        BigDecimal b1 = new BigDecimal("2.00");
        BigDecimal b2 = new BigDecimal("1.10");
        System.out.println(b1.subtract(b2)); // 제대로 나옴
    }
}
BigDecimal 나눗셈시 주의사항
- 나눗셈 계산이 끝나지 않고 무한히 반복될때(무한소수)exception이 발생하므로 표기할 자리수와 처리방식을 정해주어야 함.
import java.math.BigDecimal;
public class BigDecimalTest {
	public static void main(String[] args) {
		System.out.println(2.00-1.10);
		BigDecimal d1 = new BigDecimal("2.00");
		BigDecimal d2 = new BigDecimal("1.10");
		//+:add(), -:subtract(), / : divide(), *:multiply
		BigDecimal result = d1.subtract(d2);
		double d = result.doubleValue();
		System.out.println(result +" :"+d);
		//첫번째 인수 : 나눌수, 2번째 인수는 scale : 소수점이하 몇 자리까지, 3번째는 소수점 이하 처리 방식
		result = d1.divide(d2,3,BigDecimal.ROUND_CEILING);//소수점자리 3자리까지 반올림처리
		System.out.println("나눈결과 : "+result);
	}
}
Posted by 김마농
 
//Exception클래스 만들기
//0으로 숫자를 나눴을때의 예외상황을 표현하기 위한 클래스
public class ZeroDivideException extends Exception{
	public ZeroDivideException(){}//Exception 클래스 형태
	public ZeroDivideException(String message){
		super(message);
	}
}
 


Posted by 김마농

3. 자바

2012. 3. 25. 11:18 : 프로그래밍/자바
Abstractron(추상화)
- 구체적인것들에서 공통적인 것을 뽑아내는 과정
- 프로그래밍에서는 객체를 >>class로 구상하는 것을 추상화라고 한다.
- 즉 class자체가 추상적이라 할 수 이다. 실제 존재하진 않지만 객체들의 공통점을 지니고 있는 틀.

객체 -> 구체적
클래스 -> 추상적, 틀

<Java Class 선언>
Class 선언 구문
[제한자 modifier]class Class식별자[identifier]
예)public class Helloworld
-제한자는 class가 가지는 기능/역할을 사용자에게 설명해주는 역할을 담당한다.

변수 : 값을 저장하는 저장소
1. 선언 : 저장소를 만드는 작업 변수식별자
[modifier]DataType 변수식별자;
예) int i;

2. 값을 변수에 대입(할당)
변수식별자 = 값(value)
예)i=10;

3. 선언 + 대입
int age = 10;

4. 같은 Type 변수를 동시에 선언
int age, grade, student;

-종류
숫자
-정수 : short, byte, long, int
-실수 : float, double

문자 : char, string

논리 : boolean(true, false)


동작(behavior)

 Attribute(속성)
-instance class로 부터 실제 만들어진 개체
-member변수(variable = 값을 저장하는 저장소)
 

 ◎ 메소드 정의-동작/기능
하나의 기능을 실행하기 위한 명령문(실행문)들의 묶음
선언 : [제한자]return type 식별자([변수선언(인수 parameter)
 
예제
public class student{
         string id;               =
         string name;         =   이부분을 Attribute라고 한다.
         int score;              =
Posted by 김마농