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회성으로, 재사용이 불가능하다.
- 람다식의 호출이 까다롭다.
- 람다를 남발하면 오히려 가독성이 떨어져 코드가 지저분해질 수 있다.
- 함수형 인터페이스: 추상 메소드가 오직 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
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 24일차 (23/10/24) - MySQL (0) | 2023.10.24 |
---|---|
수업일지 23일차 (23/10/23) - MySQL (3) | 2023.10.23 |
수업일지 21일차 (23/10/19) - Java (0) | 2023.10.19 |
수업일지 20일차 (23/10/18) - Java (0) | 2023.10.18 |
수업일지 19일차 (23/10/17) - Java (2) | 2023.10.17 |