[TIL] JAVA - 복습

배고픈메꾸리·2021년 2월 20일
0

SSAFY

목록 보기
12/22

디버그 테스트 실기시험 생성자 초기화 예외처리 오버라이딩 싱글턴 디자인패턴(생성자 private 내부에서 생성해서 보내주기 직렬화 오류 , comparable

1. 입출력 처리

자바에서는 데이터를 읽어들이는 통로 , 내보내는 통로 두 가지가 있다.

ByteChar
입력스트림InputStreamReader
출력스트림OutputStreamWriter

어디에서 읽어오고 어디로 내보낼 것인지도 중요함
노드 스트림 : 필수적
필터 스트림 : 선택적

1.1 표준 입출력 (자동으로 준비됨)

  • System.in : 입력
  • System.out : 출력
  • System.err : 출력

1.2 표준 입출력의 대상변경

  • System.setOut()
  • System.setErr()
  • System.setIn()

1.3 java.util.Scanner

파일 입력 스트림등에서 데이터를 읽어 구분자로 토큰화하고 다양한 타입으로 형변환하여 리턴해주는 클래스

  • 대량의 데이터 처리 시 수행시간이 비효율적임

1.3.1 nextInt()

int 타입 반환
white space를 만나면 종료

1.3.2 nextDouble()

int 타입 반환
white space를 만나면 종료

1.3.3 next()

int 타입 반환
white space를 만나면 종료

1.3.4 nextLine()

문자열 반환
개행(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()을 쓰면 시작하자마자 개행문자를 읽고 끝나는 현상이 발생!!

1.4 java.io.BufferedReader

필터 스트림 유형 , 대량의 데이터 처리 시 수행시간이 효율적이다.

BufferedReader in = new BufferedReader ( new InputStreamReader(System.in));

Reader 계열의 스트림만 필터링 가능하다. System.inInputStream 타입이기 때문에 Reader 계열로 변경한 뒤에 넣어야 함.

1.4 StringTokenizer

StringTokenizer st = new StringTokenizer(in.readLine(), " ");

대상 문자열을 구분자를 가지고 나누어준다.

1.5 StringBuilder

문자열의 조작을 지원하는 클래스 자바에서 상수로 취급되는 문자열을 조작 시마다 새로운 문자열이 생성되는 것을 방지

  • append()
  • toString()
StringBuilder sb = new StringBuilder();
sb.append("Hello ");
sb.append("SSAFY").append("!!");

sb.setLength(sb.lendth()-2); // 마지막에 콤마 같은거 자르기
System.out.println(sb);

2. 알고리즘

2.1 시간 복잡도

빅-오(O) 표기법

  • 시간 복잡도 함수 중에서 가장 큰 영향력을 주는 n에 대한 표시
  • 계수는 생략하여 표시
    ex)
    O(3N+2)=O(3N)=O(N)O(3N+2) = O(3N) = O(N)

2.2 반복과 재귀

반복과 재귀는 유사한 작업을 수행할 수 있다.

2.2.1 재귀 함수

  1. 역할을 명확히! (함수의 역할 What)
  2. 언제 끝이 나는가? (기저 조건 = 조건의 끝)
  3. 각 함수가 수행될 때 필요한 가변적인 값? (매개변수)

함수 호출은 프로그램 메모리 구조에서 스택을 사용한다. => 재귀 호출은 반복적인 스택의 사용을 의미하며 메모리 및 속도에서 성능저하가 발생한다.

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하게 바라보자.

2.2.1.1 피보나치

이전의 두 수 합을 다음 항으로 하는 수열을 피보나치 수열이라고 함

  • 0 1 1 2 3 5 8 13
    F0=0,F1=1F_0 = 0 , F_1 = 1
    Fi=Fi1+Fi2F_i = F_{i-1} + F_{i-2}

만약 F7F_7 을 구한다면 F2F_2는 8번 호출됨. => 메모이제이션 필요

2.2.1.2 하노이 탑

  • 세개의 기둥과 서로 다른 N개의 원판으로 구성된다.
  • 원판을 세 번째로 모두 옮겨 놓아야 한다.
  • 한 번에 한 개씩 옮길 수 있고 절대로 큰 원판이 작은 원판 위에 놓이지 않아야 한다.


idea
1. N개의 원판을 임시 기둥으로 옮긴다.
2. N+1 원판을 목적 기둥으로 옮긴다.
3. 임시 기둥에 있던 N개의 원판을 목적 기둥으로 옮긴다.

원판의 개수와 , 시작 기둥 , 임시 기둥 , 목적 기둥 이 계속 바뀜 = > 매개변수 4개를 사용한 재귀 함수

움직일 원판이 없으면 return

profile
FE 개발자가 되자

0개의 댓글