TIL 23.08.08

황은하·2023년 8월 8일
0

TIL

목록 보기
56/146

📌Today I Learned

Java 수업

Ex65_File

파일 입출력

  • 응용 프로그램 <- (데이터(*.txt)) -> 저장장치

저장장치

  • 데이터 1, 0으로 저장
  • 데이터의 자료형 존재X > 모두 다 문자

인코딩, Encoding

  • 문자 코드(자바 데이터)를 부호화(1, 0) 시키는 작업
  • 자바 프로그램("홍길동") > 텍스트 파일(100100100110110)

디코딩, Decoding

  • 부호화 데이터를 문자 코드로 변환하는 작업
  • 텍스트 파일(100100100110110) > 자바 프로그램("홍길동")

인코딩/디코딩 규칙
1. ISO-8859-1
2. EUC-KR
3. ANSI
4. MS949(CP949)
5. UTF-8
6. UTF-16
7. ASCII

ANSI(ISO-8859-1, EUC-KR, MS949)
1. 영어(숫자, 특수문자, 서유럽 등) : 1byte
2. 한글(한자, 일본어 등) : 2byte

UTF-8(Unicode) * 무조건 이걸 사용 > 국제 표준
1. 영어: 1byte
2. 한글: 3byte

UTF-16(Unicode)
1. 영어: 2byte
2. 한글: 2byte

ansi로 저장 - utf8로 읽음 -> 한글만 깨짐
utf8을 utf16으로 읽음 -> 한글만 깨짐
=> 읽고 쓸 때의 규칙이 다른 경우 문자의 기본 크기 때문에 파일이 깨질 수 있다.

파일 쓰기

  • 스트림 객체

쓰기 스트림 객체

  1. 생성 모드, Create Mode > 덮어쓰기 > 더 많이 사용!
  • 기본 값
    a. 파일이 존재하지 않으면 자동으로 생성한다.
    b. 파일이 존재하면 항상 덮어쓰기를 한다.
  1. 추가 모드, Append Mode > 기존 내용 > 이어 쓰기
    a. 파일이 존재하지 않으면 자동으로 생성한다.
    b. 파일이 존재하면 항상 이어쓰기를 한다.

스트림 객체 생성 > 스트림 열기

  • 바이트 단위 쓰기(1byte)

한 번의 write마다 파일에 작성되는게 아니고 버퍼에 저장되어 있다가 한번에 작성된다.

스트림 닫기 ***

  • 저장이 안된다.
  • 잠긴 파일이 된다.

재귀함수를 이용하여 디렉토리 내부의 모든 파일을 읽는 방법

public static void main(String[] args) {
		File dir = new File("C:\\class\\code\\java\\파일_디렉토리_문제\\폴더 삭제");

		// 탐색
		delete(dir);
	}

	private static void delete(File dir) {
		File[] list = dir.listFiles();

		for (File f : list) {
			if (f.isFile()) {
				//action
			}
		}

		for (File d : list) {
			if (d.isDirectory()) {
				delete(d);
			}
		}
	}

파일 읽기

  • FileInputStream > FileReader > BufferedReader
// *************** 외워 ****************

// FileInputStream
FileInputStream stream = new FileInputStream(Ex65_File.FILE);

int code = -1;

while ((code = stream.read()) != -1) {

	System.out.println(code);
}

stream.close();


//FileReader
try {
	FileReader reader = new FileReader("C:\\class\\code\\java\\file\\member.txt");
    
	int code = -1;

	while ((code = reader.read()) != -1) {
		System.out.print((char) code); // 문자코드로 읽어옴. 그래서 숫자로 변경하려면 문자 코드를 문자로 형변환 시켜야 함.
	}

	reader.close();

} catch (Exception e) {
	System.out.println("at Ex65_File.m4");
	e.printStackTrace();
}


//BufferedReader
try {
	// 키보드 입력 읽기
	BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
	// System.in -> 키보드 입력 스트림을 읽어주는 것

	// 파일 읽기
	BufferedReader reader2 = new BufferedReader(new FileReader("C:\\class\\code\\java\\file\\memo.txt"));
	// 위의 둘은 클래스가 같아서 사용법이 같다.

	String line = null;

	while ((line = reader2.readLine()) != null) {
		System.out.println(line);
	}

	reader.close();

	System.out.println("종료");

} catch (Exception e) {
	System.out.println("at Ex65_File.m6");
	e.printStackTrace();
}

파일 쓰기

  • FileOutputStream > FileWriter > BufferedWriter
//FileOutputStream
try {
	File file = new File(Ex65_File.FILE);

	// 스트림 객체 생성 > 스트림 열기
	// - 바이트 단위 쓰기(1byte)
//	FileOutputStream stream = new FileOutputStream(file);
	FileOutputStream stream = new FileOutputStream(file, true); // 이어쓰기 모드

//	stream.write('홍'); // 65 - A
//	stream.write('길');
//	stream.write('동');

	String txt = "Hello~ Hong!!";
//	for (int i = 0; i < txt.length(); i++) {
//		stream.write(txt.charAt(i));
//	}

	stream.close();

	System.out.println("종료");
} catch (Exception e) {
	System.out.println("at Ex65_File.m1");
	e.printStackTrace();
}

//FileWriter
try {
	FileWriter writer = new FileWriter("C:\\class\\code\\java\\file\\member.txt");

	writer.write("홍길동");

	writer.close();

	// 다시 열기
	writer = new FileWriter("C:\\class\\code\\java\\file\\member.txt");

	writer.write("아무개");

	writer.close();

	System.out.println("종료");

} catch (Exception e) {
	System.out.println("at Ex65_File.m3");
	e.printStackTrace();
}

//BufferedWriter
try {

	BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\class\\code\\java\\file\\memo.txt"));

	writer.write("하나");
	writer.write('A');
	writer.write("\r\n");
	writer.write("둘");
	writer.newLine(); // FileWriter에 없음. = writer.write("\r\n");
	writer.write("셋");

	writer.close();

	System.out.println("종료");
} catch (Exception e) {
	System.out.println("at Ex65_File.m5");
	e.printStackTrace();
}

정규표현식

'_'가 1개 또는 2개일 때 split 하려고 하는데 split안에 들어갈 값을 어떻게 적어야 할 지 몰랐다. 정규표현식을 찾아보니
{1,2} -> 1개 또는 2개 라는 뜻을 알았다.

.split("_{1,2}");

이렇게 사용하니 _ 또는 __ 가 구분자가 되어 배열이 만들어졌다.

Ex66_Anonymous

익명 객체, Anonymous Object

  • 익명 클래스, Anonymous Class
  • 이름 없는 클래스
  • 재사용 할 수 없다. 일회용이다. (반대로 실명 클래스는 재사용할 수 있다.)
  • 익명 클래스를 사용하면 구현부가 없는 인터페이스에서 다른 객체로 상속받아 사용하지 않고, 인터페이스에서 바로 구현부를 만들어 사용할 수 있다.

-> 인터페이스 뒤에 익명 클래스를 붙이면 인터페이스도 일반 클래스처럼 사용할 수 있다.
-> 클래스는 이미 선언부가 있어서 다른 곳에 선언한 것을 불러와 사용한다.
-> 인터페이스는 구현부가 없기 때문에 바로 뒤에 익명 클래스를 선언하여 사용할 수 있다.

AAA b3 = new AAA() {

	@Override
	public void aaa() {
		System.out.println("aaa");
	}

};

Ex67_sort

배열 or 컬렉션

  • 오름차순 정렬, 내림차순 정렬
  1. 직접 알고리즘 구현
  2. JDK 제공 기능

2 + 1 > JDK 제공 + 커스터마이징 + 익명 클래스 사용(선택)


Git 설정

github에 잔디가 깔리지 않는 것을 확인했다. 찾아보니

$ git config --global user.email

이 잘못 등록되어있었다. github에 등록된 메일 주소가 아니라 repository 주소가 등록되어 있었다.
그래서 user.email을 github에 연결된 메일로 변경했다.
그 후 다시 push를 하니까 잔디가 다시 깔리기 시작했다.
이전에 안깔리던 잔디를 수정해서 깔지 고민이다.

유저 이메일을 수정하니 집에서도 push가 잘 된다! 기쁜 소식~


문제

과제 : 120~126
오늘 푼 문제 : 111~126


오류

파일 경로 // 대신 //// 사용하기.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=johoonx2&logNo=110140250387


프로젝트 만들 것 참조

https://m.blog.naver.com/dnflsmsskek/222794136605

profile
차근차근 하나씩

0개의 댓글