디버그 테스트 실기시험 생성자 초기화 예외처리 오버라이딩 싱글턴 디자인패턴(생성자 private 내부에서 생성해서 보내주기 직렬화 오류 , comparable
자바에서는 데이터를 읽어들이는 통로 , 내보내는 통로 두 가지가 있다.
Byte | Char | |
---|---|---|
입력스트림 | InputStream | Reader |
출력스트림 | OutputStream | Writer |
어디에서 읽어오고 어디로 내보낼 것인지도 중요함
노드 스트림 : 필수적
필터 스트림 : 선택적
파일 입력 스트림등에서 데이터를 읽어 구분자로 토큰화하고 다양한 타입으로 형변환하여 리턴해주는 클래스
int 타입 반환
white space를 만나면 종료
int 타입 반환
white space를 만나면 종료
int 타입 반환
white space를 만나면 종료
문자열 반환
개행(Enter)를 만나면 종료
next()와 달리 문자열 안에 띄어쓰기를 할 수 있음
White space : Space , tab , 개행
nextLine을 제외한 3개는 값을 읽어가며 유효 데이터가 나오기 전까지의 잔재들을 버리고 유효 데이터가 나온 직후부터 White Space 가 나올 때 까지의 데이터를 저장한다.
ex)
space
space
안녕하세요 \n
=> 안녕하세요 만 저장
nextLine 은 개행문자는 읽어내고 출력시에 떼고 줌
ex)
space
안 녕 \n
=> space
안 녕 \n
(읽어들이지만 갖다 버림)
import java.util.Scanner;
public class 실험실 {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("정수 , 실수 , 문자열을 차례로 입력하세요.");
System.out.println("읽은 정수 : " + sc.nextInt());
System.out.println("읽은 실수 : " + sc.nextDouble());
System.out.println("읽은 문자열1 : " + sc.next());
System.out.println("읽은 문자열2 : " + sc.nextLine());
Scanner s2 = new Scanner(" 안\n 녕 \n");
System.out.println("읽은 문자열3 : " + s2.nextLine());
System.out.println("읽은 문자열4 : " + s2.nextLine());
}
}
nextInt() 를 사용한 후 입력하고 엔터를 치게 되면 개행문자는 남아있게 됨. nextLine()을 쓰면 시작하자마자 개행문자를 읽고 끝나는 현상이 발생!!
필터 스트림 유형 , 대량의 데이터 처리 시 수행시간이 효율적이다.
BufferedReader in = new BufferedReader ( new InputStreamReader(System.in));
Reader 계열의 스트림만 필터링 가능하다. System.in
은 InputStream 타입이기 때문에 Reader 계열로 변경한 뒤에 넣어야 함.
StringTokenizer st = new StringTokenizer(in.readLine(), " ");
대상 문자열을 구분자를 가지고 나누어준다.
문자열의 조작을 지원하는 클래스 자바에서 상수로 취급되는 문자열을 조작 시마다 새로운 문자열이 생성되는 것을 방지
StringBuilder sb = new StringBuilder();
sb.append("Hello ");
sb.append("SSAFY").append("!!");
sb.setLength(sb.lendth()-2); // 마지막에 콤마 같은거 자르기
System.out.println(sb);
반복과 재귀는 유사한 작업을 수행할 수 있다.
함수 호출은 프로그램 메모리 구조에서 스택을 사용한다. => 재귀 호출은 반복적인 스택의 사용을 의미하며 메모리 및 속도에서 성능저하가 발생한다.
int fact(int n)
{
if(n <=1) // basis part
return 1;
else // Inductive part
return n*fact(n-1);
}
재귀 | 반복 | |
---|---|---|
종료 | 재귀함수 호출이 종료되는 BASE CASE | 반복문의 종료 조건 |
수행시간 | (상대적)느림 | 빠름 |
메모리 공간 | (상대적) 많이 사용 | 적게 사용 |
소스 코드 길이 | 짧고 간결 | 길다 |
소스 코드 형태 | 선택 구조 (if...else) | 반복 구조 (for , while) |
무한 반복시 | 스택 오버플로우 | CPU를 반복해서 점유 |
입력 값 n 이 커질수록 재귀 알고리즘은 반복에 비해 비효율적일 수 있다.
FLAT하게 바라보자.
이전의 두 수 합을 다음 항으로 하는 수열을 피보나치 수열이라고 함
만약 을 구한다면 는 8번 호출됨. => 메모이제이션 필요
idea
1. N개의 원판을 임시 기둥으로 옮긴다.
2. N+1 원판을 목적 기둥으로 옮긴다.
3. 임시 기둥에 있던 N개의 원판을 목적 기둥으로 옮긴다.
원판의 개수와 , 시작 기둥 , 임시 기둥 , 목적 기둥 이 계속 바뀜 = > 매개변수 4개를 사용한 재귀 함수
움직일 원판이 없으면 return