File 클래스 타입의 객체를 생성해 실제 사용하고자 하는 파일 위치 지정입니다. 괄호 안은 각자 컴퓨터 위치입니다.
input = new FileInputStream(file); >> 파일 내용을 가져오기 위한 객체 생성
while((i = input.read()) != -1)
while문과 read() 함수를 통해서 파일의 내용을 처음부터 끝까지 가져옵니다.
read() byte타입으로 데이터 1개 가져오게 됩니다.
이제 여기서 try-with-resources를 쓰게되면 저렇게 쓰지 않아도 됩니다.
java.lang.AutoCloseable 인터페이스 구현하고 있어야 합니다
클래스를 새로 만들어서 확인해 보시죠
try-with-resources
Override 만들기 전에 빨간 줄 뜨는데 un~눌러주시면 Override가 자동으로 생성됩니다.
위의 FileInputStream 클래스는 저희가 만든 거라서 실제 파일은 읽지 못합니다.
private ~ 는 파일명을 저장할 멤버 변수이고
public void read는 지정할 파일을 읽을 때 출력될 내용들입니다.
그럼 close는? AutoCloseable 인터페이스를 상속받아 구현한 파일을 닫을 때 실행하는 메서드입니다.
이제 실행할 파일을 만들어줍시다
try문이 실행이 되면 읽고 바로 닫는다고 나옵니다. close를 실행한 적이 없는데 말이죠..
자동으로 실행이 된 겁니다.
원래는 이렇게 사용을 해야 합니다.
하지만 위의 방법을 쓰면 정상적으로 실행이 되든 안 되는 close는 무조건 실행이 됩니다.
강제로 예외 발생 시키기는 코드입니다. 실행을 해보시면
이렇게 예외처리 코드가~~라는 구문이 추가로 실행이 됩니다.
예외처리를 먼저 하고 resources를 닫을 것인가
resources를 먼저 닫고 예외처리를 할 것인가의 차이입니다.
throws - 메서드 선언부 끝에 작성 - 메서드에서 처리하지 않은 예외를 호출한 곳으로 떠 넘기는 역할 thows 참고용 사진
이해를 위해서 코드로 확인해 봅시다.
현재는 throws를 쓰지 않았습니다.
실행 값도 잘 뜨네요 조금 더 코드를 추가해 줍시다.
숫자는 실행 순서입니다.
그리고 10, 3에서 3을 0으로 바꾸면 오류가 뜨는데
아래 result 쪽을 손을 봐줍시다 실행이 되게
정신없는 거 같아 죄송하네요 그래도 이해를 돕기 위해 적어봤습니다.
아직 throws를 적지 않았죠? 적어봅시다.
throws를 적으면 try catch를 하지 않습니다.(그래서 주석 처리함.) 그러면 어디서 예외처리를 해주냐?
위의 public static~에서 합니다
throws를 쓰면 method1을 부르는 곳에서 예외처리를 해야 합니다 = 예외 떠 넘기기
그럼 쓰는 이유는 뭘까요?
thorws 사용 시 각각의 메서드에서 예외처리 하던 것을 한 곳에서
예외처리를 할 수 있기 때문에 각각의 메서드의 소스코드가 간단해지기 때문에 사용을 합니다.
메서드 각각에 try ~ catch를 안 해주셔도 되는 거죠(소스코드 간단하고 안 귀찮게)
사용자 정의 예외 클래스 선언 1. 자바 표준 API에서 제공하지 않는 예외 2. 애플리케이션 서비스와 관련된 예외 ex) 잔고 부족, 계좌 이체 실패, 회원 가입 실패 등등 3. 선언 방법 참고용 사진
4. 코드에서 예외 발생시키는 법(강제)
참고용 사진
5. 호출된 곳에서 발생한 예외를 처리하도록
getMessage() 1. 예외 발생시킬 때 생성자 매개값으로 사용한 메시지 리턴 2. 원인 세분화하기 위해 예외 코드 포함(예: 데이터베이스 예외 코드) 3. catch() 절에서 활용
printStackTrace() 1. 예외 발생 코드 추적한 내용을 모두 콘솔에 출력 2. 프로그램 테스트하면서 오류 찾을 때 유용하게 활용
코드를 만들어봅시다.
파일 이름을 저렇게 길게 안 하셔도 됩니다.
클래스를 하나 더 만들어주세요
클래스 이름을 길게 만들어서 길어 보이는 겁니다!
마지막으로 실행할 클래스가 있어야겠죠?
try ~ catch에 있는 Balance~~ 가 실행이 되면서
저희가 직접 만든 에러가 뜨게 됩니다.
제네릭이란 걸 들어갈 텐데 이건 저도 처음 배우는 거라 개념 이해 정도만 해볼 생각입니다.
제네릭(Generic) 1. 컴파일 단계에서 잘못된 타입 사용될 수 있는 문제 제거 가능. 2. 자바 5부터 추가 3. 컬렉션, 람다식, 스트림, NIO에서 널리 사용 4. 제네릭을 모르면 API 도큐먼트 해석 어려우므로 학습 필요
왜 사용해야 하는가? 1. 이점 - 컴파일 시 강한 타입 체크 가능 - 실행 시 타입 에러가 나는 것을 방지 - 컴파일 시 미리 타입을 강하게 체크해서 에러 사전 방지
제네릭 타입이란? 1. 타입을 파라미터로 가지는 클래스, 인터페이스 2. 선언 시 클래스 또는 인터페이스 이름 뒤에 "<>" 부호 붙임 ex)<데이터타입, 클래스, 인터페이스> 3. "<>" 사이에는 타입 파라미터 위치 4. 타입 파라미터 - 일반적으로 대문자 알파벳 한 문자로 표현(대표적으로 T) - 개발 코드에서는 타입 파라미터 자리에 구체적인 타입을 지정해야 함.
제네릭 타입 사용 여부에 따른 비교 - 제네릭 타입을 사용하지 않은 경우 - Object 타입 사용 -> 빈번한 타입 변환 발생 -> 프로그램 성능 저하 참고용 사진 - 클래스 선언할 때 타입 파라미터 사용 - 컴파일 시 타입 파라미터가 구체적인 클래스로 변경
멀티 타입 파라미터 - 두 개 이상의 타입 파라미터 사용 가능
솔직히 이해하기 어렵네요 이론을 봐도 아무래도 코드를 좀 보면서 이해를 해봐야 할 거 같습니다.
실행할 클래스도 만들어줍시다.
이렇게 사용해야 합니다.
이렇게 코드를 추가하고 실행을 해봅시다.
분명 저희는 클래스를 하나 만들었는데 문자, 숫자형식으로도 사용 가능하게 됩니다.
이게 제네릭이라고 합니다.
제네릭은 여기서 끝입니다.
왜 이렇게 짧아?라고 생각이 드실 수 있는데 들어가면 너무 복잡하다고 생각이 들어 제네릭은 그만하겠습니다.
하지만 바로 이후에 하는 것도 제네릭을 사용하긴 합니다.
컬렉션 프레임워크 1. 컬렉션(사전적 의미로 요소(객체)를 수집해 저장하는 것) 2. 배열의 문제점 - 저장할 수 있는 객체 수가 배열을 생성할 때 결정 -> 불특정 다수 객체를 저장하기에는 문제 - 객체 삭제했을 때 해당 인덱스가 비게 된다 -> 객체를 저장하려면 어디가 비어있는지 확인해야 함. 3. 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리 (하지만 배열의 비해서 속도에 느림) 4. java.util 패키지에 포함 5. 인터페이스를 통해 정형화된 방법으로 다양한 컬렉션 클래스 이용
주요 인터페이스 사진
List 컬렉션 특징 - 인덱스로 관리, 중복해서 객체 저장 가능 - 배열과 비슷하지만 크기 조절이 가능 구현 클래스 - ArrayList, Vector, LinkedList
주요 메서드 주요 메소드 참고용 사진
add, set, get, isEmpty, remove를 제일 많이 사용한다고 한다.
ArrayList(가장 많이 사용) - 저장용량 초기 용량 : 10 (따로 지정 가능) 저장 용량을 초과한 객체들이 들어오면 자동적으로 늘어남. 고정도 가능 - 객체 제거 - 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐.
코드로 이해를 해봅시다.
빨간 부분이 뜰 건데 import 해주시면 됩니다.
총코드와 출력값입니다. 설명을 하려고 했는데 글이 너무 길어질까 봐 주석에다가 기재해 놨습니다.