728x90

 

수업내용 정리 (Java)

 

1. Stream (데이터의 흐름)

 예제 ㄱ 

더보기
FileInputStream fis = null;
  • 파일을 읽어오기에 앞서 선언해둔 stream에 null값을 넣지 않으면 close() 메소드를 사용할 때 오류가 난다.
  • 이해가 안 가면 외우기..!

 

try {
	fis = new FileInputStream("input.txt");
	int i;
	while((i=fis.read()) != -1) {
		System.out.print((char)i);
	}
	System.out.println();
}
  • i는 fis.read()값을 가지고, i가 -1이 아닐 때 while문을 돌려 파일을 읽어온다.

 

 catch (FileNotFoundException e) {
	System.out.println("FileInputException 예외 발생");
	e.printStackTrace();	// 위치 추적
}
  • 해당 코드는 오류가 난다.
  • 위의 fis.read()의 예외처리를 하지 않았기 때문인데, 이것을 해결하기 위해서 catch를 하나 더 만들어도 되지만 러프하게 처리해도 되는 경우에는 이미 만들어둔 catch의 FileNotFoundException을 Exception으로 바꾸면 해결이 된다. ( Exception이 FileNotFoundException의 조상타입이라 가능한 방법이다.)
  • 밑에 고친 코드를 올려놓았다.
// 고친 코드
 catch (Exception e) {
	System.out.println("Exception 예외 발생");
	e.printStackTrace();	// 위치 추적
}

 

finally {
	try {
		fis.close();
	} catch (IOException e) {
		System.out.println(e);	// 원칙: e.getMessage()
		e.printStackTrace();
	}
}
System.out.println("continue");
  • 코드가 try에서 멈추든, catch에서 멈추든 무조건 실행되는 구간, finally
  • fis.close()를 넣고, 마찬가지로 실행되지 않을 수 있기 때문에 예외처리를 해준다.
더보기
char ch1='A'; char ch2='B';
Writer out=new FileWriter("hyper.txt");
out.write(ch1);
out.write(ch2);
out.close();
  • char 변수에 각 각 A, B를 담아 두 개 선언한다. (유니코드를 사용하기 때문에 2byte씩 가지고 있다.)
  • FileWriter을 통해 파일을 생성한다.
  • 파일 안에 적을 내용을 write(스트림)를 통해 전송한다.
  • 할 일이 끝났다면 close를 통해 닫아준다.
  • 해당 클래스가 들어있는 자바 패키지 파일을 보면 이 텍스트 파일이 생겨난 것을 확인할 수 있다.
더보기
  • 개행 뜻: 강제 줄 바꿈
  • 개행은 newLine 메소드의 호출을 통해서 이뤄진다. 이렇듯 \n이 아닌 newLine 메소드 호출을 통해서 개행을 구분하는 이유는 시스템에 따라서 개행을 표현하는 방법이 다르기 때문이다.

 

// 문자열 출력을 위한 스트림의 구성
BufferedWriter out = new BufferedWriter(new FileWriter("String.txt"));
out.write("박지성 - 메시 멈추게 하는데 집중하겠다.");
out.newLine();
out.write("팀이 승리하는 것을 돕기 위해 최선을 다하겠다.");
out.newLine();
out.write("환상적인 결승전이 될 것이다.");
out.newLine();
out.write("기사 제보 및 보도자료");
out.newLine();
out.write("press@goodnews.co.kr");
out.close();
System.out.println("기사 입력 완료.");
  • 빠른 출력을 위해 BufferedWriter을 사용 (필터)
  • newLine()으로 줄바꿈
  • 쓰기가 끝났다면 close를 통해 닫아준다.

 

// 문자열 입력을 위한 스트림의 구성
BufferedReader in = new BufferedReader(new FileReader("String.txt"));
String str;
while (true) {
	str = in.readLine();
	if (str == null)
		break;
	System.out.println(str);
}
in.close();
  • 빠른 읽기를 위해 BufferedReader을 사용 (필터)
  • readLine() 호출 시 개행 정보는 문자열의 구분자로 사용되고 버려지므로, 문자열 출력 후 개행을 위해서는 println을 사용해야 한다.
  • 읽기가 끝났다면 close를 통해 닫아준다.
더보기
File file = new File("C:\\myJava\\java");

 

if(file.exists() == false) {
  • file.exists() == false는 file이 없다는 뜻이다.
  • isDirectory() == ture는 file이 폴더라면 이라는 뜻이다.
//	file.mkdir();	// 최하위 폴더 생성(중요!!)
	file.mkdirs();	// 상위폴더까지 생성
	System.out.println("존재하지 않습니다. 폴더를 생성합니다.");
}
  • mkdir()은 최하위 폴더만 생성하고, mkdirs()는 상위 폴더까지 생성한다.

 

 

2. 람다 (가볍게!) (참고)

 간단 설명 ㄱ 

더보기
  • 익명 함수
  • 장점
    1. 코드의 간결성: 복잡한 코드를 극단적으로 줄일 수 있다.
    2. 지연연산 수행: 지연연상을 수행함으로 불필요한 연산을 최소화할 수 있다. (아직 모르겠음!)
    3. 병렬처리 가능: 멀티스레드를 사용하여 병렬처리를 할 수 있다.
  • 단점
    1. 람다를 사용하면서 만든 무명함수는 1회성으로, 재사용이 불가능하다.
    2. 람다식의 호출이 까다롭다.
    3. 람다를 남발하면 오히려 가독성이 떨어져 코드가 지저분해질 수 있다.
  • 함수형 인터페이스: 추상 메소드가 오직 1개여야만 한다.

 

 예제 ㄱ 

더보기
package ex1;

@FunctionalInterface
interface Add{
	public int add(int x, int y);
}

public class LambdaTest1 {
	public static void main(String[] args) {
		Add addInst = (x, y) -> {System.out.print(x+"+"+y+"="); return x+y;};
		
		System.out.println(addInst.add(1,2));
	}
}

 

 

@FunctionalInterface
interface Add{
	public int add(int x, int y);
}
  • 한 클래스 내에서 퍼블릭 클래스 위나 아래에 인터페이스를 하나 생성하고, 추상 메소드를 하나 만든다.
  • 인터페이스 위의 @FunctionalInterface는 함수형 인터페이스에 메소드가 하나인지 하나이상인지 검사해준다.

 

public class LambdaTest1 {
	public static void main(String[] args) {
		Add addInst = (x, y) -> {System.out.print(x+"+"+y+"="); return x+y;};
		//Add addInst = (x, y) -> {return x+y;};
		//Add addInst = (x, y) -> x+y;
		
		System.out.println(addInst.add(1,2));
	}
}
  • 해당 코드는 람다식을 이용하여 인터페이스를 구현한 코드다.
  • (x, y)는 매개변수, 중괄호{} 안에 있는 코드는 실행할 코드다.
  • 실행코드가 두 문장 이상이거나 return이 들어가 있다면 중괄호{}를 써줘야 한다. 만약, 실행 코드가 한 문장이고, return도 없다면 중괄호{} 없이 작성해도 된다.

 

// 1
new Add() {
	@Override
	public int add(int x, int y) {
		return x+y;
	}
};
//2
Add addInst = new Add() {
	public int add(int x, int y) {
		return x+y;
	}
};
  • 1, 2 모두 위의 람다식과 같은 코드
더보기
package ex3;

public class LambdaTest2 {
	public static void main(String[] args) {
		MyNumber mN = (x, y) -> x>y ? x:y;
		System.out.println("Max="+mN.getMax(10,20));
	}
}

@FunctionalInterface
interface MyNumber {
	public int getMax(int x, int y);
}
  • 해당 코드는 삼항연산자를 이용해 람다식으로 두 수 중 최대값을 반환하는 것을 구현한 코드다.
  • (x, y) ⬅️ 매개변수
  • x>y ? x:y ⬅️ 실행코드 (삼항연산자)

 


 

질문한 내용이나 어려웠던 점 메모

 - 오늘 내용 전부 ㅠㅠ..

 


 

전체 피드백

  • 람다가 익숙해진다면 정말 코드를 짜는데 드는 시간이 줄어들 것 같지만, 람다를 이해하는 것은 제치고 머리에 집어넣는 것만으로도 오래 걸릴 것 같다는 생각이 들었다. 화이팅..

 


 

 + 최근 퇴실요정이 생겨서 퇴실을 잊지 않게 되었다!

 ++ 오늘은 일지도 공개로 제대로 올림!

728x90