Java 32

[Java] 접근 제어자(access modifier)

접근 제어자(access modifier)는 한 번에 네 가지 중 하나만 선택할 수 있다. 클래스, 멤버변수, 메서드, 생성자에 사용되며, 해당하지 않는 외부에서의 접근을 막는다. 외부로부터 데이터를 보호하고(데이터가 유효한 값을 유지하고 외부에서 함부로 변경할 수 없도록), 내부에서만 사용되어 외부에는 불필요한 데이터를 감추기 위해 사용한다. private: 같은 클래스 내에서만 접근할 수 있다. default: 같은 패키지 내에서만 접근할 수 있다. protected: 같은 패키지 내 다른 패키지의 자식 클래스에서 접근할 수 있다. public: 모두 접근할 수 있다. 제어자 같은 클래스 같은 패키지 자식 클래스 전체 public O O O O protected O O O X (default) O O..

Java 2024.01.24

[Java] 제어자(modifier)

제어자(modifier)는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다. 클래스나 멤버변수와 메소드에 주로 사용되며, 여러 제어자를 조합하여 사용할 수 있다. static 인스턴스에 관계없이 같은 값을 가지며 변수 하나를 모든 인스턴스가 공유한다. static이 붙은 멤버변수, 메소드, 초기화 블럭은 인스턴스를 생성하지 않고도 사용할 수 있다. 이를 사용하면 인스턴스를 생성하지 않으므로 편리하고 속도도 더 빠르다는 장점이 있다. final 거의 모든 대상에 사용할 수 있다. 변수에 쓰면 값을 변경할 수 없고, 메소드에 쓰면 오버라이딩을 할 수 없고, 클래스에 쓰면 부모가 될 수 없다. 일반적으로 선언과 초기화를 동시에 하지만, 인스턴스 변수는 생성자에서 초기화 할 수 있다..

Java 2024.01.22

[Java] 오버로딩(overloading)과 오버라이딩(overriding)

오버로딩(overloading)과 오버라이딩(overriding)은 명칭은 비슷하지만 사용하는 상황과 용도는 엄연히 구분된다. 오버로딩은 메소드명은 같지만 매개변수의 개수 또는 타입이 다른 것을 의미한다. 컴파일 시 메소드의 이름이 같아도 다른 매개변수로 메소드를 구분할 수 있다. 그러나 오버라이딩은 상속받은 메소드의 내용에 관한 것이다. 상속받은 클래스가 클래스 자신에 맞게 메소드의 내용을 변경하는 경우이다. 오버라이딩을 사용하기 위해서는 상속받은 메소드의 이름과 매개변수와 반환타입이 모두 같아야만 한다. public class Parent { void parentMethod() {} } public class Child extends Parent { void parentMethod(int i) {} ..

Java 2024.01.19

Thread safety

프로그램을 실행하면 OS로부터 실행에 필요한 자원을 할당받아 프로세스가 된다. 쓰레드는 프로세스를 구성하는 것 중 하나이다. 프로세스의 자원을 이용하여 실제로 작업을 수행하는 역할이다. 모든 프로세스에는 하나 이상의 쓰레드가 존재한다. 쓰레드가 하나일 때 싱글 쓰레드, 둘 이상일 때 멀티 쓰레드라고 부른다. 멀티 쓰레딩의 장점으로는 CPU의 사용률을 향상시키고, 자원을 보다 효율적으로 사용할 수 있고, 사용자에 대한 응답성이 향상되고, 작업이 분리되어 코드가 간결해진다는 점 등이 있다. 그러나 이에 장점만 있는 것은 아니다. 하나의 쓰레드에 문제가 생기면 전체 프로세스에 영향을 주기도 하며, 쓰레드를 많이 생성할 경우 잦은 전환(Context Swiching)으로 인해 성능 저하가 발생할 수 있다. 또 ..

Java 2024.01.17

자바의 실행 과정

자바 언어로 프로그래밍을 하기 위해서는 자바 개발도구(Java Development Kit, JDK)가 필요하다. JDK에는 자바 가상 머신(Java Virtual Machine, JVM)과 자바 클래스 라이브러리(Java API) 등 자바 개발에 필요한 프로그램이 설치된다. JDK의 bin 디렉토리에 있는 주요 파일은 다음과 같은데, 자바를 다루는 과정에 이용된다. 'javac.exe'는 자바 컴파일러로, 자바 소스 코드를 바이트 코드(JVM이 이해할 수 있는 기계어로, 바이트 코드를 해당 OS의 기계어로 변환하여 OS로 전달하는 역할)로 컴파일한다. 'java.exe'는 자바 인터프리터로, 컴파일러가 생성한 바이트 코드를 해석하고 실행한다. .java의 실행 과정은 다음과 같다. 1. 개발 도구를 이..

Java 2023.12.11

[자료구조] 그래프(Graph)

그래프(Graph)란 인터넷, 도로, 운송, 전력, 상하수도망, 신경망, 화학성분 결합 등 광범위한 분야에서 활동되는 자료구조입니다. 연결된 정점 간 관계를 표현할 수 있습니다. 모든 정점이 서로 연결된 완전 그래프는 정점이 N개일 경우 간선의 수는 n(n-1)/2개입니다. 가중치(Weighted) 그래프는 간선에 값이 있어 이동 비용이 발생합니다. 가중치는 실제 두 정점 사이의 거리가 될 수도 있고, 두 정점을 연결하는 간선을 지나는 데에 소요되는 시간일 수도 있습니다. 응용에 따라 가중치가 음수인 경우도 존재합니다. 최소 신장 트리(Minimum Spannig Tree)를 찾기 위한 알고리즘과 다양한 최단 경로를 찾는 알고리즘에 활용할 수 있습니다. 그래프는 정점(Vertex)과 간선(Edge)의 집..

Java/자료구조 2023.07.08

[Spring] 8. 애플리케이션 만들기

9장부터는 앞서 공부한 내용을 토대로 웹 애플리케이션을 제작합니다. 12장까지에 걸쳐 데이터베이스 조작과 비즈니스 로직 처리, 레이어 생성까지 다루고 있습니다. 책에 적힌 코드를 기반으로 하되 제가 선호하는 방식으로 코드가 작성된 부분이 있습니다. 책에서는 PostgreSQL과 JDBC를 쓰지만 저는 MySQL과 JPA를 썼습니다. 두 차이로 달라지는 부분을 제외하고는 모든 코드가 동일하게 작성되었습니다. 항목 값 Project Gradle Project Spring Boot 3.1.1 Artifact quiz Packaging jar Java 17(temurin) Package name com.example.quiz Dependencies Spring Boot DevTools Lombok Spring ..

Java/Spring 2023.07.07

[자료구조] 우선순위 큐(Priority Queue)

우선순위 큐(Priority Queue)란 가장 높은 우선순위를 가진 항목에 접근하거나 삭제하는 연산과 임의의 우선순위를 가진 항목을 삽입하는 연산을 지원하는 자료구조입니다. 스택이나 큐도 일종의 우선순위 큐로, 스택의 경우 가장 마지막으로 삽입된 항목이 가장 높은 우선순위를 가지며, 최근 시간일수록 높은 우선순위를 부여하는 우선순위 큐입니다. 큐의 경우 먼저 삽입된 항목이 우선순위가 더 높습니다. 따라서 이른 시간일수록 더 높은 우선순위를 부여하는 우선순위 큐입니다. 우선순위 큐는 배열, 연결 리스트, 힙을 이용하여 구현할 수 있습니다. 정렬된 배열과 연결 리스트에서의 삽입과 삭제의 시간 복잡도는 각각 O(N)과 O(1)입니다. 그러나 힙의 경우에는 각각 O(logN)이므로 일반적으로는 힙 자료구조가 ..

Java/자료구조 2023.07.06

[자료구조] 이진 힙(Binary Heap)

이진 힙(Binary Heap)이란 완전 이진 트리로서 부모의 우선순위가 자식의 우선순위보다 높은 자료구조입니다. 다른 트리 자료구조와 다르게 중복 값을 허용합니다. 각 노드에 대해 부모의 우선순위가 자식의 우선순위보다 높은 것을 힙 속성(Heap Property)이라 합니다. 이진 힙에는 키가 작을수록 높은 우선순위를 가지는 최소 힙(Minimum Heap)과 클수록 더 높은 우선순위를 가지는 최대 힙(Maximum Heap)이 있습니다. 최솟값 또는 최댓값을 빠르게 찾아내는 데 유용합니다. 그러나 형제 노드 간 우선순위 보장이 없으므로 반 정렬 상태입니다. 최소 힙 삽입과 삭제 구현 코드 import java.util.ArrayList; class MinHeap { ArrayList heap; pub..

Java/자료구조 2023.07.04

[자료구조] 해시 테이블(Hash Table)

해시 테이블(Hash Table)이란, 키와 값을 대응시켜 저장하는 데이터 구조입니다. 키를 배열의 인덱스로 그대로 사용하면 메모리 낭비가 심해질 수 있습니다. 해시 테이블에서는 이러한 문제를 해결하여 키를 간단한 함수를 사용해 변환한 값을 배열의 인덱스로 이용하여 항목을 저장합니다. 이를 해싱(Hashing)이라고 합니다. 해싱에 사용되는 함수를 해시 함수(Hash Function), 해시 함수가 계산한 값을 해시값(Hash value) 또는 해시 주소라고 합니다. 배열을 이용하여 해시 테이블 직접 구현한 코드 class HashTable { Integer[] table; int elementCount; HashTable() {} HashTable(int size) { this.table = new I..

Java/자료구조 2023.07.02