분류 전체보기 23

[재귀] 재귀 함수와 stringify 구현

재귀 함수 재귀 함수란 자기 자신을 호출하는 함수를 말한다. 알고리즘에서 재귀란 동일한 구조의 더 작은 문제로 나눌 수 있고 이를 통해 전체 문제를 해결하는 방법이다. 보통 중첩된 반복문이 많아 중첩 횟수를 예측하기 어렵거나, 변수 사용을 줄이기 위한 상황에서 재귀를 사용한다. 재귀 함수 장점 반복문의 사용을 줄일 수 있어서 코드가 간결해지고 변수를 여러 개 사용하지 않아도 된다. 재귀 함수 단점 코드의 흐름을 직관적으로 파악하기 어렵다. 지역변수, 매개변수, 반환 값을 모두 stack에 저장하여 반복문에 비해 많은 메모리를 사용한다. 메서드 종료 이후 복귀를 위한 context switching 비용이 발생한다. 재귀 함수 사용을 사용하려면? 문제를 작은 단위로 쪼갤 수 있어야 한다. 재귀 함수 탈출 ..

💡 Algorithm 2022.09.21

[Java] JVM(Java Virtual Machine)

JVM이란? JVM은 자바로 작성한 코드를 해석해서 실행해주는 프로그램이다. JVM은 각 운영체제에 적합하게 개발되어 있고 자바는 JVM을 매개로 운영체제와 소통하기 때문에 운영체제로부터 독립적이다. (C++과 차이점) JVM 작동 과정 자바로 코드를 작성한 후에 실행하면 먼저 컴파일러가 실행되고 컴파일이 진행된다. 그 결과 .java 파일(자바 코드 파일)은 .class 파일(바이트 코드 파일)로 변환된다. JVM은 운영체제로부터 실행에 필요한 메모리를 할당받는다. 그림에서 Runtime Data Area가 이를 가리킨다. 그 후, 클래스 로더(Class Loader)가 .class 파일을 JVM으로 불러들여 Runtime Data Area에 로드시킨다. 로드가 완료되면 실행 엔진(Execution E..

📙 Java 2022.09.19

[Java] 스레드(Thread)

스레드란? 프로세스는 실행 중인 애플리케이션을 의미하며 프로세스 내에서 실행되는 소스 코드의 실행 흐름을 스레드라고 한다. 하나의 스레드를 가지는 프로세스를 싱글 스레드 프로세스, 여러 개의 스레드를 가지는 프로세스를 멀티 스레드 프로세스라고 부른다. 자바를 실행하면 가장 먼저 실행되는 메서드는 main이며, 메인 스레드가 main 메서드를 실행시킨다. 스레드를 생성하는 2가지 방법 스레드가 실행할 코드는 run() 메서드 내에 작성해야 하며 run() 메서드는 Runnable 인터페이스(방법 1)와 Thread 클래스(방법 2)에 정의되어 있다. 방법 1. Runnable 인터페이스를 구현한 클래스에서 run()을 구현 Runnable 인터페이스를 구현할 클래스를 작성한 후, run()의 바디에 스레드..

📙 Java 2022.09.18

[Java] 스트림(Stream)

스트림이란?! 스트림은 배열, 컬렉션의 요소들을 순차적으로 참조하여 람다식으로 처리할 수 있게 해주는 반복자이다. 스트림을 활용하면 많은 양의 데이터에 복잡한 연산을 수행할 수 있고 가독성과 재사용성이 높은 코드를 작성할 수 있다. 특징 선언형 프로그래밍으로 코드를 처리하기 때문에 내부의 동작 원리를 모르더라도 메서드 이름을 보고 무슨 일을 하는지 이해하기가 쉽다는 장점이 있다. 또한 for문, while문에서 index나 iterator를 사용하여 코드로 직접 모든 요소를 반복하는 외부 반복자와 달리 내부 반복자를 이용하여 병렬 처리가 쉽다. 내부 반복자를 이용하면 컬렉션 내부에서 어떻게 요소를 반복시키는지는 추상화시키고 개발자는 처리해야 할 코드만 작성하면 되기 때문이다. 또한 스트림은 데이터를 변경..

📙 Java 2022.09.17

[Java] 람다식과 함수형 인터페이스

람다식이란? 람다식(Lambda Expression)은 함수형 프로그래밍 기법을 지원하는 자바의 문법 요소이다. 메서드를 하나의 식으로 표현한 것으로 코드를 간결하고 명확하게 작성할 수 있다는 장점을 갖는다. 람다식에서는 기본적으로 반환 타입과 함수 이름을 생략하기 때문에 익명 함수라고 부르기도 한다. 이론적으로 공부하기보다 코드로 보면 더 명확하게 이해할 수 있다. // 기존 방식 int sum(int num1, int num2) { return num1 + num2; } // 람다식 (int num1, int num2) -> { num1 + num2 } // 메서드 바디에 실행문이 하나만 존재할 때 중괄호 생략 가능 (int num1, int num2) -> num1 + num2 // 매개변수 타입을..

📙 Java 2022.09.17

[Java] 컬렉션(Collection)

컬렉션 프레임워크의 구조 List 데이터의 순서가 유지되며 중복이 가능하다. ArrayList, Vector, Stack, LinkedList 등이 List 인터페이스를 구현한다. Set 데이터의 순서가 유지되지 않고 중복을 허용하지 않는다. HashSet, TreeSet 등이 Set 인터페이스를 구현한다. Map 키(key)와 값(value) 쌍으로 데이터를 저장한다. 데이터의 순서가 유지되지 않으며 키는 중복을 허용하지 않지만 값에는 중복된 값을 저장할 수 있다. HashMap, HashTable, TreeMap, Properties 등이 Map 인터페이스를 구현한다. Collection 메서드 추가 add(Object o): 객체 및 컬렉션의 객체들을 컬렉션에 추가 addAll(Collection ..

📙 Java 2022.09.17

[Java] 제네릭과 예외 처리

제네릭(Generic) 클래스나 메서드를 작성할 때, 타입을 구체적으로 지정하는 것이 아니고, 추후에 지정하도록 일반화시키는 것을 말한다. (C++의 템플릿과 동일한 느낌이다!) 제네릭이 사용된 클래스를 제네릭 클래스라고 하며 특정 메서드만 제네릭으로 선언할 경우 제네릭 메서드라고 부른다. class GenericEx { private T item; public GenericEx(T item) { this.item = item; } public T getItem() { return item; } public void setItem(T item) { this.item = item; } } 위의 코드에서 클래스 선언부에 내부에 작성한 T를 타입 매개변수라고 한다. 클래스 이름 옆에 클래스 내부에서 사용할 타..

📙 Java 2022.09.16

[Java] 추상화(Abstraction)

자바에서는 추상 클래스와 인터페이스를 활용하여 추상화를 구현한다. abstract 제어자 ‘추상적인’이라는 의미를 갖고 있는 abstract 제어자를 사용하여 추상 메서드와 추상 클래스를 나타낸다. 추상 메서드는 메서드의 시그니처(이름, 매개변수)만 있고 구체화된 바디는 없는 메서드이며 추상 메서드가 하나 이상 들어있는 클래스를 추상 클래스라고 한다. 구체화되지 않은 추상 클래스만을 기반으로 객체 생성은 할 수 없다. 하지만 상속관계의 상위 클래스에서 이를 활용하면 하위 클래스에서 추상 메서드의 바디를 구현하여 각 상황에 맞게 효율적으로 코드를 작성할 수 있다. final 제어자 final 제어자가 앞에 붙으면 값 변경이 불가능하거나 확장되지 않는 성질을 나타낸다. 메서드 앞에 있으면 해당 메서드는 오버..

📙 Java 2022.09.07

[Java] 다형성(Polymorphism)

다형성 다형성이란 하나의 객체가 여러 형태를 가질 수 있는 것을 뜻한다. 자바에서는 한 타입의 참조 변수를 통해 여러 타입의 객체들을 참조할 수 있게 해주는 것을 의미한다. 참조 변수의 타입 변환 참조 변수의 타입 변환으로 사용할 수 있는 멤버의 개수를 조절할 수 있다. 타입 변환은 상속 관계에 있는 클래스 사이에서만 가능하다. 업캐스팅(하위→상위 클래스 타입 변환)은 형변환 연산자인 괄호를 생략할 수 있지만, 그 반대인 다운캐스팅(상위→하위 클래스 타입 변환)의 경우에는 반드시 괄호를 작성해줘야한다. 클래스의 규모가 커지면 참조 변수의 타입 변환이 가능한지 여부를 instanceof 연산자를 통해 알 수 있으며 이를 활용하여 에러를 최소화할 수 있다. 참조 변수 instanceof 타입의 반환 값이 f..

📙 Java 2022.09.07

[Java] 캡슐화 💊

캡슐화 캡슐화란 객체와 관련된 속성과 기능을 캡슐로 만들어 외부로부터 정보를 보호하는 것을 의미한다. 캡슐화의 가장 큰 장점은 정보를 은닉할 수 있다는 것이다. 객체의 기능과 속성이 외부로부터 함부로 변경되지 못하게 해 준다. 또 각각의 객체가 독립적으로 존재하기 때문에 코드 확장 시에도 오류를 최소화할 수 있어서 유지보수에 용이하다. 자바에서는 접근 제어자(Access Modifier)와 getter, setter 메서드를 중심으로 캡슐화를 수행한다. 접근 제어자(Access Modifier) 자바에서 제어자는 접근 제어자와 기타 제어자(static, final, abstract, native, transient, synchronized 등)로 구분할 수 있다. 하나의 대상에 대해 여러 제어자를 사용할..

📙 Java 2022.09.06