용어

-스트림 : 일반적으로 데이터, 패킷 등의 일련의 연속성을 갖는 흐름을 의미한다.

(흐르는 데이터 - 물의 흐름)

 

-입.출력 스트림 : 데이터를 읽고 쓰는 구조를 프로그램의 구조로 모델링 해놓은 것.

 

-버퍼 : 데이터를 임시적으로 담아두는 공간

 

자바의 입출력 스트림 개념

:단 방향으로 흐르며(진행되며) 버퍼를 가질 수 있다. 자바의 입출력 스트림은 FIFO(First In First Out)의 구조를 갖는다.

또 문자(Character Stream) , 바이트(Byte Stream)으로 분류한다.

 

 

문자(Character Stream)문자 최상위 스트림

 

-Reader Class(입력 스트림)

:문자 데이터를 읽어 들이는 스트림.

 

-Writer Class(출력 스트림)

:문자 데이터를 출력하기 위한 스트림.

 

바이트(Byte Stream)바이트 최상위 스트림

 

-InputStream Class(입력 스트림)

:바이트 데이터를 읽어 들이는 스트림.

 

-OutputStream Class(출력스트림)

:바이트 데이터를 출력하기 위한 스트림.

 


 

package io;

import java.io.IOException;

public class IOEx2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int b = 0 , count = 0;
		try {
			b = System.in.read();
			//Ctrl + z 가 아니면 무한 반복
			//문자 하나를 연속적으로 입력받는다.
			while(b != -1) {
				System.out.print((char)b);
				b = System.in.read();
			}
		}catch(IOException e) {
			e.printStackTrace();
		}
		//문자를 입력받아 문자열로 (여러 문자를 입력 받을 수 있도록)흉내
		System.out.println("\n byte InputStream Test.... total byte : "  + count);
	}
}

 

이 코드는 InputStream 클래스의 read()메소드를 이용해서 문자 하나하나를 연속적으로 입력 받아 마치 문자열로 받는 것처럼 흉내내는 코드이다. 

 

Apple을 입력하면 내가 입력한 문자 : A부터 내가 입력한 문자 : e 까지 반복해서 출력한다.

 

 

 

 

 

 

 

 


 

package io;

import java.io.IOException;

//배열을 문자열로 읽기
public class IOEx3 {

	public static void main(String[] args) {
		byte b[] = new byte[20]; //문자 담을 배열 공간 확보(버퍼처럼 활용)
		System.out.print("입력 : ");
		char c = ' ';
		try {
			//0번부터 5까지 입력받아라
			System.in.read(b, 0 ,5);
		}catch(IOException e) {
			e.printStackTrace();
		}
		System.out.print("출력: ");
		//0번부터 5까지 출력해라
		System.out.write(b, 0, 5);
		System.out.println();
 	}

}

 

 

다음은 배열을 문자열로 읽는 코드이다.  크기 20만큼 byte라는 이름을 갖는 배열을 선언하여 이 배열을 버퍼처럼 활용하면서 문자열을 입력받아 출력한다. 자바 docs 도움말을 보면 input stream에서 최대 bytes의 길이만큼 데이터를 읽을 수 있다고 나와있다. 

System.in.read(b,0, 5)는 배열 b를 인덱스 0 부터 5까지 입력 받으라는 뜻이고

System.out.write(b, 0 ,5)도 마찬가지로 

배열 b를 0부터 5까지 출력하란 뜻이 된다. 

Hello World!를 입력하게 되면 배열 b에는 Hello만 저장되게 되고 출력하면 Hello가 출력되는 것을 확인할 수 있다.

 

Exception

-키보드 입력, 파일 처리, 네트워크 처리, DB처리 등 외부와의 작업을 하는 경우

예의치 못한 에러가 발생할 수 있으므로 자바에서는 반드시 예외처리를 하도록 하고 있다.

 

예외 처리 방법1

: try - catch는 보통 명확환 오류일 때 사용하며, 다중 catch가 가능하다.

 

		try {
		//예외발생 지역
		//실행코드 1
		//int c = System.in.read(); - 예외 발생 (예외 발생 시 밑에 코드 실행 안함)
		//실행코드 3
		}catch(Exception e) {
			//예외 처리 지역
		}finally {
			//반드시 실행하는 지역(예외가 발생하던 안하던 반드시 실행)
			//
		}

 

 

public class ExceptionEx2 {
		// TODO Auto-generated method stub
		String str = "";
		public void foo(int i) {
			try {
				if(i == 1) {
					throw new Exception(); //고의적 예외 발생(밑으로 내려가지 않는다.)
				}
				str += "1"; 
			}catch(Exception e) {
				str += "2";
				return; //메소드를 빠져나감(함정)
			}finally {        //finally 반드 실행한다.
				str += "3";
			}
			str+= "4";
		}
		public static void main(String[] args) {
			ExceptionEx2 ee = new ExceptionEx2();
			ee.foo(0);
			ee.foo(1);
			System.out.println(ee.str);
		}
}

인자 0을 갖는 foo가 먼저 실행되어 처음으로 try문을 만나는데

if문에 해당되지 않으므로 str +="1"을 실행한다. 예외가 발생하지 않았으므로 catch문을 건너뛰고 반드시 실행되는 finally를 만나 str += "3";을 실행한다. 그 다음 str +="4"를 실행하고 빠져나온다. 다음 인자 1을 갖는 foo를 실행하게 되면 if(i == 1) 조건에 일치하므로 고의적으로 발생시킨 예외를 만나게 된다.

예외가 발생하면  str+="1"은 실행하지 않고 건너뛰어 catch문으로 가게되는데 str+="2";를 수행하고 반드시 실행되는 finally를 만나 13423이 출력되게 된다.

Random

-Random Object는 일련의 난수를 생성한다.

이렇게 생성된 Random Object는 int type, float type 등의 난수가 발생 가능하며

정수형 난수 발생은 특정 범위가 없다. 하지만 부동소수점을 갖는 실수형 난수들의 

난수는 0.0 에서 1.0 사이의 값을 받는다.

 

Random Object를 생성할 수 있는 생성자

Ex)

 

1. Random ran = new Random();

    int su1 = ran.nextInt(3);

 

2. Math class 기능으로 난수를 사용

    int su2 = (int)(Math.random() * 3);

 

import java.util.Random;

public class RandomEx {

	public static void main(String[] args) {
		Random ran = new Random();
		//float 0.0에서 1.0범위
		float a = ran.nextFloat();
		System.out.println("float형 난수 : " + a);
		
		//int n범위
		int b = ran.nextInt(3);
		System.out.println("int형 난수 : " + b);
		
		
		//Math class
		int c = (int)(Math.random()* 3);
		System.out.println("Int형 난수2 : " + c);
		
	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

import java.util.*;

public class RandomEx2 {
	public static void main(String args[]) {
		Random ran = new Random();
		Scanner sc = new Scanner(System.in);
		int me, com;
		
		System.out.println("무엇을 내시겠습니까? \n1.가위 \n2.바위 \n3.보 \n1~3의 값을 입력하세요 ->" );
		me = sc.nextInt();
		com = ran.nextInt(3)+1; // 1~3	
		if(com == 1 ) {
			System.out.println("컴퓨터는 가위를 냈습니다.");
		}else if(com == 2) {
			System.out.println("컴퓨터는 바위를 냈습니다.");
		}else {
			System.out.println("컴퓨터는 보를 냈습니다.");
		}
		int result = (me - com + 3) %3;
		switch(result) {
		case 0:
			System.out.print("비겼습니다.");
			break;
		case 1:
			System.out.print("이겼습니다.");
			break;
		case 2:
			System.out.print("졌습니다.");
			break;
		}
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/*
  로또 게임 만들기
  조건
  1) 1 ~ 45 숫자 중 6개 난수 발생
  2) 6개 난수 중 중복 X
 */
import java.util.*;

public class RandomEx3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Random ran = new Random();

		int num[] = new int[6];
		for (int i = 0; i < num.length; i++) {
			num[i] = ran.nextInt(45)+1;
			for(int j=0; i<j; j++) {
				if(num[i] == num[j]) {
					num[j] = ran.nextInt(45)+1;
					j= -1;
				}
			}
			System.out.println("로또 번호 : " +num[i]);
		}
	}
}

'JAVA' 카테고리의 다른 글

[JAVA] IO(Input / output) (1)  (0) 2020.10.01
[JAVA] Exception - 예외 처리(1)  (0) 2020.09.24
[JAVA] 콜렉션 (Collection / 제네릭(Generic)  (0) 2020.09.22
[JAVA] 콜렉션-Collection  (0) 2020.09.22
[JAVA] Wrapper클래스  (0) 2020.09.22

ArrayList - 제네릭( Generic )

 

제네릭(Generic)

:클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법으로 타입을 명시하여 배열과 같은 효과가있다.

만약 사용 목적이 확실하다면 제네릭을 사용하여 불필요한 코드(형 변환)를 줄일 수 있으며 

컬렉션 뒤에 ex) Vector<String>vc = new Vector<>();으로 타입을 명시하여준다. 

 

다음은 ArrayList를 String 타입으로 선언한 코드이다.

public class ArrayListEx {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<String>list = new ArrayList<>();
		
		list.add("JAVA");
		list.add("JDBC");
		list.add("Servlet/JSP");
		list.add(2, "Database");
		list.add("MYBATIS");
		
		int size = list.size();
		System.out.println("총 객체 수 : " + size);
		System.out.println("요소 출력 : " + list.get(2));
		System.out.println();
		
		//반복문으로 요소 출력
		for(int i=0; i<list.size(); i++) {
			String str = list.get(i);
			System.out.println(i + ":" + str);
		}
		
		//요소 삭제-삭제된 공간 당겨짐!
		System.out.println();
		list.remove(2);
		String skill = list.get(2);
		System.out.println("2 : " + skill);
		
		list.remove(2);
		skill = list.get(2);
		System.out.println("2 : " + skill);
		System.out.println();
		list.remove("MYBATIS");
		
		for(int i=0; i<list.size(); i++) {
			String str = list.get(i);
			System.out.println(i + ":" + str);
		}
		
	}

}

ArrayList도 마찬가지로 add와 get, remove로 객체를 저장, 추출, 삭제할 수 있다.

 

마찬가지로 삭제된 공간은 당겨진다!

'JAVA' 카테고리의 다른 글

[JAVA] Exception - 예외 처리(1)  (0) 2020.09.24
[JAVA] Random 클래스 - 가위바위보, 로또 번호 생성기  (0) 2020.09.24
[JAVA] 콜렉션-Collection  (0) 2020.09.22
[JAVA] Wrapper클래스  (0) 2020.09.22
[JAVA] GUI 스크롤바(RGB)  (0) 2020.09.20

자바에서 collection은 객체를 담을 수 있는 기억장소로서 여러가지 자료를 적절한 형태로 처리하고

저장하는 저장형태(묶음)의 자료구조를 말한다.

 

<콜렉션과 배열의 차이점>

 

-리사이즈가 가능하다.

  :기본 사이즈를 10이라고 했을 때 공간이 초과하면 공간이 n개 씩 증가하고 늘어나는 n의 개수를 직접 지정가능함.  

 

-객체 중복이 허용된다.(배열과 마찬가지로 인덱스 개념을 사용함)

 

-배열 공간이 삭제되면 배열은 null이 되지만 콜렉션은 삭제된 공간만큼 당겨진다.(하지만 배열보다 속도가 느리다.)

 

 

<종류>

1.Vector

Vector vc = new Vector(); 
		//add-객체 저장
		vc.add("홍길동1"); 
		vc.add("홍길동2");
		vc.add("홍길동3");

		//get-객체 추출 (강제 형 변환)
		String str1 = (String)vc.get(0);  //vc.get(index); 
		String str2 = (String)vc.get(1);
		String str3 = (String)vc.get(2);
		
		//출력
		System.out.println(str1);
		System.out.println(str2);
		System.out.println(str3);
        
        //검색의 용도 - 몇 번째 인덱스에 있는지 확인
		int index = vc.indexOf(name);
		
		//name이라는 객체가 존재하는지 
		if(vc.contains(name)) {
			System.out.println("검색결과 있음 : " + vc.get(index)); //member.getName
			//회원 정보 삭제 - 리스트에 name이 존재하면 삭제
			if(vc.remove(name)) {
				System.out.println("삭제 완료!");
			}
		}
		//검색 결과를 오브젝트로 끌어내서 String으로 형 변환 후 출력
		System.out.println("<출력 결과 표현1>");
		for(int i=0; i<vc.size(); i++) {
			Object obj = vc.get(i);
			String str = (String)obj;
			System.out.println(str);
		}

add메소드로 객체를 저장하고 get메소드를 통해 저장한 객체를 추출한다. 객체로 저장된 홍길동1,2,3 들을 강제 형 변환을 해서 추출하여 출력하였다.

 

그 다음 remove메소드를 통해 저장한 객체를 삭제하였다.

콜렉션은 배열과 다르게 null이 되지 않고 삭제한 공간을 바로 뒤

에 있는 객체가 당겨진다.  

 

 

 

 

 

 

 

 

2. list

public class VectorEx2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List list = new Vector();
		//객체 넣기(회원 가입)
		list.add(new Board("제목1: ", "내용1", "글쓴이1"));
		list.add(new Board("제목2: ", "내용2", "글쓴이2"));
		list.add(new Board("제목3: ", "내용3", "글쓴이3"));
		list.add(new Board("제목4: ", "내용4", "글쓴이4"));
		list.add(new Board("제목5: ", "내용5", "글쓴이5"));
		
		//회원 탈퇴
		list.remove(2);
		list.remove(3);
		for(int i=0; i<list.size();i++) {
			Object obj = list.get(i);
			Board board = (Board)obj;
			System.out.println(board.subject + "\t" + board.content + "\t" + board.writer);	
		}
	}
}

list형태도 마찬가지로 add로 객체를 저장하고 

remove를 통해 삭제할 수 있다.

list형태를 이용해 회원 가입 시스템의 회원 가입과 회원 탈퇴 기능 구현이 가능하다. 

 

 

 

 

'JAVA' 카테고리의 다른 글

[JAVA] Random 클래스 - 가위바위보, 로또 번호 생성기  (0) 2020.09.24
[JAVA] 콜렉션 (Collection / 제네릭(Generic)  (0) 2020.09.22
[JAVA] Wrapper클래스  (0) 2020.09.22
[JAVA] GUI 스크롤바(RGB)  (0) 2020.09.20
[JAVA] GUI(AWT)  (0) 2020.09.16

기본 자료형 데이터(primitive type)를 객체로 바꿔주는 클래스래퍼클래스(Wrapper Class)라고 한다.

여기서 박싱(Boxing)언박싱(UnBoxing)이라는 개념이 나오는데

 

박싱(Boxing)기본 자료형(Primitive type)래퍼 클래스(Wrapper class)로 포장하는 것을 말하고

언박싱(UnBoxing)래퍼 클래스(Wrapper class)기본 자료형(Primitive type)으로 포장한 것을 다시 꺼내는 역할을 한다.

그렇다면 박싱과 언박싱을 사용하는 이유는 무엇일까?

 

이유는 제네릭이나 자료구조, 매개변수 등 primitive type이 아닌 referenct type을 사용하는 경우가 많기 때문이다.

특히 제네릭에서는 primitive type은 받지 않기 때문에 Wrapper클래스를 이용하여 제네릭을 사용해야 한다.

public class WrapperEx {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer num1 = new Integer(7); //박싱    기본자료형 --> Wrapper클래스     
		Integer num2 = new Integer(3); //박싱    기본자료형 --> Wrapper클래스 
	
		int int1 = num1.intValue();//언박싱    Wrapper클래스 ---> 기본 자료형
		int int2 = num2.intValue();//언박싱    Wrapper클래스 ---> 기본 자료형
	
		Integer result1 = num1+num2;  //10
		Integer result2 = int1-int2;  //4
		int result3 = num1 * int2;    //21
		
		
		System.out.println(result1);
		System.out.println(result2);
		System.out.println(result3);
	}

}

Java 5 버전부터 오토박싱과 오토언박싱을 지원하는데

명시적으로 표현해주지 않아도 오토 박싱과 오토 언박싱을 지원한다. 

'JAVA' 카테고리의 다른 글

[JAVA] 콜렉션 (Collection / 제네릭(Generic)  (0) 2020.09.22
[JAVA] 콜렉션-Collection  (0) 2020.09.22
[JAVA] GUI 스크롤바(RGB)  (0) 2020.09.20
[JAVA] GUI(AWT)  (0) 2020.09.16
[JAVA] 추상클래스  (0) 2020.09.14

+ Recent posts