자료구조 기본 자료구조 자료 구조란 여러 데이터의 묶음을 저장하고, 사용하는 방법을 정의한 것이다. 자료 구조를 설명하기에 앞서, 데이터는 문자, 숫자, 소리, 그림, 영상 등 실생활을 구성하고 있는 모든 값이다. 그러나 데이터는 그 자체만으로 어떤 정보를 가지기 힘들다. 그렇기에 데이터는 분석하고 정리하여 활용해야만 의미를 가질 수 있다. 데이터를 정해진 규칙 없이 저장하거나, 하나의 구조로만 정리하고 활용하는 것보다 데이터를 체계적으로 정리하여 저장해두는 것이 데이터를 활용하는 데 있어 훨씬 유리하다. 개발자들은 무수한 상황에 데이터를 효율적으로 다룰 수 있는 여러 방법을 연구해두었고, 이런 방법들을 모아 자료 구조라고 이름을 붙였다. 그 중 알고리즘 테스트에서 가장 자주 등장하는 네 가지는 다음과 ..
알고리즘 재귀 함수 재귀 함수의 이해 사전적 의미로 재귀는 원래의 자리로 되돌아가거나 되돌아오는 것을 의미한다. 재귀 함수는 자기 자신을 호출하는 함수를 일컬으며, 반복적인 작업을 해야하는 문제를 간결한 코드로 풀어낼 수 있다. 재귀 함수의 장점 여러 반복문을 사용하지 않아 코드가 간결하고 수정에 용이함 여러 변수를 사용할 필요가 없음 재귀 함수의 단점 코드의 흐름을 직관적으로 파악하기 어려움 반복문에 비해 많은 메모리 사용 메서드를 호출하고 종료된 후에 복귀를 위한 컨텍스트 스위칭 비용 발생 재귀 함수의 사용 조건 문제의 크기를 점점 작은 단위로 나눌 수 있어야 함 재귀 호출이 종료되는 시점이 존재해야 함 재귀 함수의 동작 원리 재귀 함수의 입출력 값을 정의한다 // int타입을 요소로 갖는 배열을 입..
Java 심화 자바 가상 머신(Java Virtual Machine) JVM은 자바 프로그램을 실행시키는 도구이다. 즉, JVM은 자바로 작성한 소스 코드를 해석해 실행하는 별도의 프로그램이다. 자바는 운영체제로부터 독립적이고, 자바의 독립성은 JVM을 통해 구현되는데, 이유는 다음과 같다. 먼저 프로그램이 실행되기 위해서는 CPU, 메모리, 각종 입출력 장치 등과 같은 컴퓨터 자원을 프로그램이 할당받아야 한다. 프로그램이 자신이 필요한 컴퓨터 자원을 운영체제에게 주문하면, 운영체제는 가용한 자원을 확인한 다음, 프로그램이 실행되는 데에 필요한 컴퓨터 자원을 프로그램에게 할당해준다. 이 때, 프로그램이 운영체제에게 필요한 컴퓨터 자원을 요청하는 방식이 운영체제마다 다르다. 이것이 프로그래밍 언어가 운영체..
Java 심화 스레드(Thread) 애플리케이션이 실행되면 운영체제가 해당 애플리케이션에게 메모리를 할당해주며 애플리케이션이 실행되는데, 이처럼 실행 중인 애플리케이션을 프로세스라고 하며, 프로세스 내에서 실행되는 소스 코드의 실행 흐름을 스레드라고 한다. 단 하나의 스레드를 가지는 프로세스를 싱글 스레드 프로세스, 여러 개의 스레드를 가지는 프로세스를 멀티 스레드 프로세스라고 한다. 프로세스는 데이터, 컴퓨터 자원, 스레드로 구성되며, 스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행한다. 메인 스레드(Main thread) 자바 애플리케이션을 실행하면 가장 먼저 실행되는 메서드는 main 메서드이며, 메인 스레드가 main 메서드를 실행시켜준다. 메인 스레드는 main 메서드의..
Java 심화 파일 입출력(I/O) InputStream, OutputStream 자바에서는 입출력을 다루기 위한 InputStream, OutputStream을 제공한다. 스트림은 단방향으로만 데이터를 전송할 수 있기에, 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요하다. 입출력 스트림은 어떤 대상을 다루느냐에 따라 종류가 나뉘며, File을 다룰 때는 FileInputStream / FileOutputStream을 사용하고, 프로세스를 다룰 때는 PipedInputStream / PipedOutputStream을 사용한다. FileInputStream 터미널을 이용한 파일 생성 code라는 문자열이 입력된 codestates.txt 라는 이름의 파일을 생성 echo code >> cod..
Java 심화 스트림(Stream) 배열, 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다. 스트림을 사용하면 List, Set, Map, 배열 등 다양한 데이터 소스로부터 스트림을 만들 수 있고, 이를 표준화된 방법으로 다룰 수 있다. 스트림은 데이터 소스를 다루는 풍부한 메소드를 제공하고 이를 활용하면 다량의 데이터에 복잡한 연산을 수행하면서 가독성과 재사용성이 높은 코드를 작성할 수 있다. 스트림의 특징 스트림 처리 과정은 생성, 중간 연산, 최종 연산 세 단계의 파이프라인으로 구성 스트림은 원본 데이터 소스를 변경하지 않음(read-only) 일회용(onetime-only) 내부 반복자 스트림의 생성 스트림으로 데이터를 처리하기 위해서는 가정 먼저 스트림을 생성..
Java 심화 람다(Lambda) 함수형 프로그래밍 기법을 지원하는 자바의 문법 요소이다. 메서드를 하나의 '식(expression_'으로 표현한 것으로 코드를 매우 간결하면서 명확하게 표현할 수 있다는 큰 장점이 있다. 자바는 JDK 1.8 이후 람다식 등 함수형 프로그래밍 문법 요소를 도입하며 기존의 객체지향 프로그래밍과 함수형 프로그래밍을 혼합하는 방식으로 보다 효율적인 프로그래밍을 할 수 있게 되었다. 람다식의 기본 문법 기본적으로 반환타입과 이름을 생략 가능 익명 함수(annonymous function)라 부르기도 함 메서드 바디에 문장이 실행문이 하나만 존재할 때 중괄호와 return문을 생략 가능하며 이 경우 세미콜론까지 생략해야 함 매개변수 타입을 함수형 인터페이스를 통해 ..
Java 심화(Effective) 애너테이션(Annotation) 애너테이션이란 소스 코드가 컴파일되거나 실행될 때에 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해주는 문법 요소이다. @로 시작하며 클래스, 인터페이스, 필트, 메서드 등에 붙여서 사용할 수 있다. 애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속받을 수 없다. 에너테이션의 종류 JDK에서 기본적으로 제공하는 애너테이션 표준 애너테이션 : JDK에 내장되어 있는 일반적인 애너테이션 메타 애너테이션 : 다른 애너테이션을 정의할 때 사용하는 애너테이션 표준 애너테이션 @Override 메서드 앞에만 붙일 수 있는 애너테이션 선언한 메서드가 상위 클래스의 메서드를 오버라이딩하거나..