728x90

 

기반 스트림 + 보조 스트림

성능향상

 

 

 

public class practice_everyday09_Run {
	public static void main(String[] args) {
		practice_everyday09 pe9 = new practice_everyday09();
		
		pe9.Stream_outputByte();
		pe9.Stream_inputByte();

	}	
}

 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class practice_everyday09 {
		
		// 1.바이트 기반+보조
		// 2.문자 기반+보조
		
		
		// 1.바이트 기반+보조 : 입력
	public void Stream_outputByte() {
		// 목적 : 파일에 바이트기반으로 데이터를 빠르게 쓰고 싶다
		FileOutputStream fos;
		BufferedOutputStream bos = null;
		try {
			fos = new FileOutputStream("D:\\test\\test.txt");
			bos = new BufferedOutputStream(fos);
			
			bos.write(65);
			byte[] arr = {66,67,68,69};
			bos.write(arr);
			
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void Stream_inputByte() {
		// 목적 :파일에 있는 데이터를 바이트 기반으로 빠르게 읽어오고 싶다
		FileInputStream fis;
		try {
			fis = new FileInputStream("D:\\test\\test.txt");
			BufferedInputStream bis = new BufferedInputStream(fis);
			
			int val;
			while((val=bis.read()) != -1) {
				System.out.println(val);
			}	
		} catch (IOException e) { // IOE
			e.printStackTrace();
		}
		
		

	// 2.문자 기반+보조

		
		
	}	
}
728x90
반응형
728x90

 

 

 

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class practice_everyday07 {
	public static void main(String[] args) throws IOException {
		
		// 문자 기반 스트림
		// FileReader
		// FileWriter
		
		FileWriter fw = new FileWriter("D:\\file\\file2\\first.txt");
		fw.write("initiate\n");
		fw.append("2\n");
		char[] cArray = {'c','h','e','e','r'};
		char[] sArray = {'u','p'};
		fw.write(cArray);
		fw.write(sArray);
		fw.close();
		
		FileReader fr = new FileReader("D:\\file\\file2\\first.txt");
		int i;
		while((i=fr.read()) != -1) {
			System.out.print((char)i);
		}
		fr.close();
		
	}	
}
728x90
반응형
728x90

 

1)charAt ()

charAt(int index):char

받는 데이터의 원하는 인덱스번호의 자리 문자 하나를 반환

2) concat()

concat(String str):String

원래 문자열 끝에 매개변수로 들어온 값을 이어붙인 문자열 반환

3) equals()

equals(Object anObject):boolean

4)substring()

substring(int beginIndex):String

해당 인덱스 넘버부터 문자열 시작

substring(int beginIndex, int endIndex):String

5)replace()

replace(char oldChar, char newChar):String

A to B 사이의 문자열 일부 반환

public class practice_everyday01 {
	public static void main(String[] args) {	
		
		// String methods
		String str = "힘을 내라";
		
		// 1)charAt ()
		// charAt(int index):char
		char cheer = str.charAt(0);
		System.out.println("1."+cheer); // 힘
		
		// 2) concat()
		// concat(String str):String
		// 원래 문자열 끝에 매개변수로 들어온 값을 이어붙인 문자열 반환
		String cstr = str.concat(" cheer up");
		System.out.println("2."+cstr);
		
		
		// 3) equals()
		// equals(Object anObject):boolean
		System.out.println("3."+str.equals("equal"));
		
		// 4)substring()
		// substring(int beginIndex):String
		// 해당 인덱스 넘버부터 문자열 시작
		// substring(int beginIndex, int endIndex):String
		// A to B 사이의 문자열 일부 반환
		
		System.out.println("4.1."+str.substring(0,3));
		System.out.println("4.2."+str.substring(2));
		
		
		// 5)replace()
		// replace(char oldChar, char newChar):String
		
		System.out.println("5."+str.replace('힘','손'));
	}	
}
728x90
반응형
728x90

 

File class의 많이 쓰는 메소드

f1.mkdir() : 해당 디렉토리 생성. 생성하려는 폴더 직전까지의 경로가 다 생성되어있어야 생성하려는 폴더 생성가능

경로 생성이 제대로 안되어있으면 생성이 안될 뿐 에러발생은 안난다

f1.mkdirs() : 해당 디렉토리 생성. 생성하려는 폴더 직전까지 없는 경로도 같이 생성

f1.creatNewFile()

f1.delete

f1.exists() : 존재하냐?

f1.isFile() : 파일이냐?

f1.getName() : 파일명 get

f1.getAbsolutePath() : 절대경로 반환

f1.getPath() : 상대경로 반환

f1.length() : 파일용량

f1.getParent() : 상위 폴더 경로 반환

 

 

 

 

import java.io.File;
import java.io.IOException;

public class practice_everyday06 {
	
	public static void main(String[] args) {
		
	File f = new File("D:\\file\\file1.txt");		// 경로지정 방법1
//	File f = new File("D:/file.txt");  		// 경로지정 방법2
//	File f = new File("D:/file.txt",true);  // ,true : 파일 내용 추가
		
		f.mkdir();  // 해당 디렉토리 생성. 생성하려는 폴더 직전까지의 경로가 다 생성되어있어야 생성하려는 폴더 생성가능
					// 경로 생성이 제대로 안되어있으면 생성이 안될 뿐 에러발생은 안난다
		f.mkdirs(); // 해당 디렉토리 생성. 생성하려는 폴더 직전까지 없는 경로도 같이 생성
		
		f.exists(); // true
		f.isFile(); // false
		System.out.println(f.exists());
		System.out.println(f.isFile());
		
	File ff = new File("D:\\file\\file2");
		System.out.println(ff.exists()); // false
		System.out.println(ff.isFile()); // false
		
		ff.mkdirs();	// 파일 생성 
		System.out.println(ff.exists()); // true
		System.out.println(ff.isFile()); // false
		System.out.println();
		
		System.out.println(ff.getName()); // file2
		System.out.println(ff.getAbsolutePath());  // D:\file\file2
		System.out.println(ff.getPath()); //상대경로 // D:\file\file2
		System.out.println(ff.length()); 		  // 0
		System.out.println(ff.getParent()); 	  // D:\file
		
		
		
		
		
		
		try {
			f.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		
		
		
	}	
}

 

 

728x90
반응형
728x90

 

StringBuffer & StringBuilder 클래스는

불변 클래스인 String 클래스랑 다르게 문자열 수정이 가능한 가변 클래스다

 

String이 수정이 불가능하다니 무슨 말일까?

String 타입의 변수에 값을 넣어보면 언제든 바꿀 수 있는걸 알 것이다. 근데 사실 이게 데이터 자체가 수정되는게 아니라 시스템 내부에서는 String 타입의 변수에 값이 들어오면 메모리에 새로운 공간과 주소값을 생성시키고 기존의 것을 삭제하고 대체하는 식으로 작동한다. 그럼 주소값도 달라지고 눈에 보이는건 수정된 걸로 보이지만 말이다. 근데 이 둘 StringBuffer & StringBuilder은 말그대로 데이터 자체를 수정시킨다. 주소값 변함없이.

 

String 클래스와 이 둘의 차이

 - String : 변경이 적고 읽기만 많은 경우에 유리. 수정불가.

 - StringBuffer & StringBuilder : 문자열에 대한 수정이 많이 일어나는 경우 유리. 수정가능.

 

StringBuffer & StringBuilder의 차이는?

StringBuffer 동기화 o / 상대적으로느림 / 안전

StringBuilder 동기화 x / 빠름

둘이 동기화처리 빼고는 기능이 모두같다

동기화가 들어가면 상대적으로 안전하다. 데이터에 대해 락을 걸어놓고 진행하기에 처리속도가 상대적으로 느릴 수 있고 동기화가 안들어가면 락이 없어 그마만큼 속도가 다소 빠르다.

 

StringBuffer & StringBuilder

메모리 관리를 위해 에전에는 String대신 쓰기도 했다고 하나 요새는 성능들도 많이 좋아지고 String을 대개 많이쓴다고한다. 퍼나빌더를 쓴다고 눈에띄게 빨라지는게 아니라고 한다. 또한 자동으로 수용량(capacity)가 증가한다.

 

 

StringBuffer 안에 쓸 수 있는 많이 쓰는 메소드들

1) append()

받아온 값을 뒤에 추가로 이어주는 메소드

 

2) insert()

원하는 자리에 값 추가 시킬 수 있는 메소드

 

3) delete()

데이터 삭제하는 메소드

delete(int start, int end) : StringBuffer

deleteCharAt(int index) : StringBuffer

 

4)reverse()

앞뒤 거꾸로 값을 바꿔놓는 메소드

 

728x90
반응형
728x90

1. hashCode()

hashCode() : int ← 매개변수x 주소값 반환

Returns a hash code for this string.

주소값을 보기 위해 사용하는 코드

객체의 주소값을 해시코드로 구현한 결과값

 

2. identityHashCode()

System.identityHashCode(변수명)

실주소값을 연산해놓은 결과값을 도출하는 메소드

 

728x90
반응형
728x90

 

한바퀴 도는 메소드 먼저 하나 만들었다

한바퀴 돌기 좋은 코드 로직인 것 같다

이제 예외(Exception)를 강제 발생시켜 예외처리 연습을 해보려한다

 

IOException 임포트 후에 예외 강제 발생 코드인 throw를 넣고 런시키니 뜬 에러메세지

Unhandled exception type IOException 

Unreachable code

 

Unhandled exception type IOException는  IOException을 예외처리 못했다는 의미이고

Unreachable code는 예외가 발생되면 발생된 곳 이후 코드들은 전부 작동하지 않기에 닿지않는 코드라고 에러가 뜨는 것이다. println 결력도 call_3메소드는 출력되지 않고 2까지만 되고 있다

이제 발생한 예외를 try catch문을 써서 직접 처리 해본다

 

 

코드 call_1 off까지 끝까지 잘 작동한다.

아래 빨간줄은 에러처럼 보이지만 catch문 안에 e.printStackTrace();에서 .printStackTrace()이 에러 정보를 보여주기 때문에 나오는 것이다. 에러메세지가 아니니 걱정하지 않아도 된다.

 

 

 .printStackTrace()지워보면 빨간줄이 전부 사라진다.

 

기능클래스의 메소드 call_3에서 직접 예외처리 했지만,

런파일에서 pe4.call_3를 try문 안에 넣고 해도 된다

728x90
반응형
728x90

 

String 안에 쓸 수 있는 많이 쓰는 메소드

1)charAt ()

2)concat()

3)equals()

4)substring()

5)replace()

 

 

public class practice_everyday01 {
	public static void main(String[] args) {	
		
		// String methods
		String str = "힘을 내라";
		
		// 1)charAt ()
		// charAt(int index):char
		char cheer = str.charAt(0);
		System.out.println(cheer); // 힘
		
		// 2) concat()
		// concat(String str):String
		// 원래 문자열 끝에 매개변수로 들어온 값을 이어붙인 문자열 반환
		String cstr = str.concat(" save it");
		System.out.println(cstr);
		
		
		// 3) equals()
		// equals(Object anObject):boolean
		System.out.println(str.equals(cstr));
		
		// 4)substring()
		// substring(int beginIndex):String
		// 해당 인덱스 넘버부터 문자열 시작. 
		// substring(int beginIndex, int endIndex):String
		// A to B 사이의 문자열 일부 반환
		
		System.out.println(str.substring(2));
		System.out.println(str.substring(0,3));
		
		
		// 5)5)replace()
		// replace(char oldChar, char newChar):String
		
		System.out.println(str.replace('힘','손'));
	}	
}
728x90
반응형
728x90

 

ch6-38 변수의 초기화

<변수의 초기화>

지역변수(lv)는 수동 초기화 해야함

멤버변수(iv,cv)는 자동초기화된다

 

지역변수(lv)는 수동 초기화 해야함

class InitTest {
    int x;        // 인스턴수변수(iv)
		int y = x;    // 인스턴스변수(iv)
   
    void method1() {
         int i;      // 지역변수
         int j = i;  // error : 지역변수를 초기화하지 않고 사용해서
    }
}

i의 모르는 값을 j의 모르는 값에 넣을려고 하니 에러난 것

 

수동초기화 해야하는 이유

호출 스택 메모리

계속 쌓였다가 없어졌다 한다(재사용이 빈번한 메모리)

계속 같은 공간을 여기저기서 사용한다

메소드가 호출될 때마다 이 공간을 0으로 초기화하면 성능저하됨

이를 방지하기 위해서 항상 0으로 초기화하는게 아닌 새로운 값으로 초기화한다

지역변수는 메소드가 호출되서 작업하는 동안만 존재하기에 생명 주기가 굉장히 짧다(메소드는 빨리 실행되고 제거되는게 좋다)

옛날 다른 메소드가 쓰던 값을 새로운 값으로 초기화하는데 다른 메소드가 쓰던 값을 뭔지 모르는데 그 값을 덮어쓰는거고 그래서 수동 초기화 해야만함

인스턴스 변수는 유지기간이 비교적 길어서 초기화하고 쓴다(자동초기화)

인스턴스 변수(자동초기화)

 

 

멤버변수(iv,cv)는 자동초기화된다

class InitTest {
    int x;        // 인스턴수변수(iv)
		int y = x;    // 인스턴스변수(iv)

InitTest it = new InitTest();

 

 

데이터타입 별 초기화 값

 

 


 

 

 

 

ch6-39 멤버변수의 초기화

<멤버변수의 초기화>

1.명시적 초기화(=)

2.초기화 블럭 { }

3.생성자

 

 

1.명시적 초기화(=)

대입연산자(=) 이용

간단한 초기화 방법

 

1)기본형(primitive type) 변수의 초기화

int door = 4;

 

2)참조형(reference type) 변수의 초기화

Engine e = new Engine();

참조형 변수가 가질 수 있는 값

  • null or 객체주소
  • 기본값은 nul

참조형은 객체를 만들어넣어줘야한다

객체를 만들어 값을 넣어주면서 초기화해야함

 

2.초기화 블럭

복잡한 초기화

여러문장 넣기

(여러문장이 필요하면 대입연산자로는 불가능)

  • 인스턴스 초기화 블럭 : { }
  • 클래스 초기화 블럭 : static { }

 

3.생성자

iv초기화

복잡한 초기화에 사용

 

 

멤버변수 cv, iv 초기화의 3가지 방법

1.자동초기화 : 자동

2.간단초기화 : 대입연산자 =

3.복잡초기화 : { }, static { } , 생성자

  • cv 초기화에는 static { }
  • iv 초기화에는 생성자. // {}도 쓰긴하나 거의안씀

 

위의 이미지는 명시적 초기화로 간단하게 배열 생성 및 초기화하고 초기화블럭 static {}을 사용해서 cv 복잡초기화로 배열 안에 값을 for문 이용하여 채운 것

 

 

 

멤버변수 초기화 시점

1.클래스 변수 초기화 시점

클래스가 처음 로딩될 때 한번(메모리에 올라갈 때)

2.인스턴스 변수 초기화 시점

인스턴스가 생성될 때 마다

 

 

멤버변수 초기화 순서

 

 

 

 

728x90
반응형
728x90

 

객체 배열 == 참조변수 배열

 

객체의 배열이란?

참조변수 여러개를 묶어서 배열을 만든 것

Tv tv1, tv2, tv3;  // Tv데이터 타입인 변수tv1,tv2,tv3 

    ↓↓↓  배열로 전환하면

Tv[] tvArr = new Tv[3]; // 

참조변수 3개를 배열로 만든 것

그래서 객체의 배열이라 부름

만들어진 각 객체의 주소값이 링크되고 초기화 된 것

 

 

객체의 배열 초기화

// 객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

    ↓↓↓  간단히 초기화

Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
Tv[] tvArr = new Tv[3];
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

위의 코드의 세부과정

1)참조변수 tvArr 생성됨

2)tvArr 참조변수 3개가 배열로 생성되고 주소값 생성

(new)연산자가 heap영역에 배열 및 주소값 생성

 

3)tvArr[0] = new Tv(); 이 문장이 실행되서 tvArr[0] 문장이 실행되서 new Tv();가 tvArr[0]로 대입됨

만들어진 객체의 주소값 0x100이 tvArr[0]로 링크 되고 마찬가지로 tvArr[1],tvArr[2]도 주소값 링크됨

 

 

주의사항

Tv[] tvArr = new Tv[3];

이 코드만 만들어두면 참조변수 배열만 생성해둔 거기에 참조변수만 만들어둔 것이고 객체를 하나씩 넣어줘야하는데 안하고 객체를 호출하게 되면 객체생성이 안됬다고 에러남

 

 

728x90
반응형

+ Recent posts