자바는 객체지향 프로그래밍 언어입니다.
JVM 위에서 동작하기 때문에 운영체제에 독립적입니다.
가비지 컬렉션을 통한 자동적인 메모리 관리가 가능합니다.
JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느립니다.
스택 기반으로 동작하며, 자바 바이트 코드를 운영체제에 맞게 해석해주는 역할을 하고, 가비지컬렉션을 통한 자동적인 메모리 관리를 해줍니다.
오버라이딩은 상위 클래스의 메소드를 하위 클래스에서 재정의 하는 것을 말하고, 오버로딩은 매개변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러개 정의하는 것을 말합니다.
현실 세계의 사물과 같은 객체를 만들고, 그 객체에서 필요한 특징을 뽑아서 프로그래밍을 수행하는 것입니다.
특징으로는 추상화, 캡슐화, 상속성, 다형성이 있고, 모듈 재사용으로 확장 및 유지보수가 용이합니다.
SOLID 원칙이 있습니다.
SRP, 단일 책임 원칙으로 하나의 클래스는 하나의 책임만 가져야 합니다.
OCP, 개방 폐쇄 원칙으로 확장에는 열려있고, 수정에는 닫혀있어야 합니다.
LSP, 리스코프 치환 원칙으로 상위 타입은 항상 하위 타입으로 대체될 수 있어야 합니다.
ISP, 인터페이스 분리 원칙으로 클라이언트는 자신이 사용하지 않는 메소드에 의존되지 않도록 인터페이스를 분리해야 합니다.
DIP, 의존성 역전 원칙으로 자주 변하는 클래스에 의존하지 않아야 합니다.
추상 클래스는 abstract 지시자로 정의되고, 추상 메소드를 하나 이상 포함하고 있습니다.
인터페이스는 interface 지시자로 정의되고, 모든 메소드가 추상 메소드로 이루어져 있습니다.
추상 클래스와 인터페이스의 차이는 그 존재의 목적에 있습니다.
추상 클래스는 상속 받아서 기능을 재활용하고 확장하는 것에 목적이 있다면, 인터페이스는 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는 것을 보장하는 것에 목적이 있습니다.
JVM에서 메모리를 관리해주는 모듈로, 힙 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거합니다.
개발자가 메모리를 직접 관리하지 않아도 되어서 개발 속도가 향상되는 장점이 있지만, Mark and Sweep이라는 참조되지 않는 객체를 찾는 과정이 있는데, 이때 스레드가 잠깐 중단되어서 성능이 떨어진다는 단점이 있습니다.
GC를 실행하는 스레드를 제외한 모든 스레드의 작업을 중단하고 참조되지 않는 객체를 찾아 제거하고 작업이 다시 진행됩니다.
크게 5가지 영역으로 구분됩니다.
우선 스레드마다 PC Register, JVM Stack, Native Methond Stack이 있고, 스레드 공통으로 Method Area, Heap 영역이 있습니다.
PC Register는 현재 수행중인 JVM 명령어를 가지고 있습니다.
JVM Stack은 호출된 메소드의 매개변수, 지역변수, 리턴 값이 저장됩니다.
Native Method Stack은 자바 외의 언어인 C나 C++과 같은 것들을 수행하기 위한 영역입니다.
Method Area: 클래스 별로 전역변수, 정적변수, 메소드 정보들이 저장됩니다.
Heap: 런타임 중 생성되는 객체들이 동적으로 할당되는 곳입니다.
클래스, 변수, 메소드의 접근 범위를 설정해주는 자바의 예약어로, 총 4가지 종류가 있습니다.
public: 모든 접근을 허용합니다.
protected: 같은 패키지에서만 접근을 허용하고, 다른 패키지에서 접근하려면 해당 클래스를 상속받아야 합니다.
default: 같은 패키지에서만 접근을 허용하고, 기본적으로 default 입니다.
private: 같은 클래스 내에서만 접근을 허용합니다.
접근 제한자를 사용하는 이유는 무분별한 접근이나 수정을 막기 위해서 입니다.
다수의 데이터를 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스의 집합입니다.
자바 컬렉션에는 List, Set, Map 인터페이스를 기준으로 여러 구현체가 있고, 이에 더해 Stack, Queue 인터페이스도 있습니다.
List는 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용합니다. 구현체로 Vector, ArrayList, LinkedList가 있습니다.
Set은 순서가 없는 데이터의 집합으로, 데이터의 중복을 허용하지 않습니다. 구현체로 HashSet, TreeSet, LinkedHashSet이 있습니다.
Map은 키와 값이 한 쌍으로 이루어져 있고, 키를 기준으로 중복을 허용하지 않으며, 순서가 없습니다.
둘 다 List 인터페이스를 구현한 클래스입니다.
동기화에 차이가 있습니다.
벡터는 한번에 하나의 스레드만 접근 가능하여 스레드 세이프하고, 어레이 리스트는 동시에 여러 스레드가 접근할 수 있어 스레드 세이프 하지 않습니다.
따라서, 어레이 리스트에서 여러 스레드가 동시에 엑세스 하는 경우 개발자가 명시적으로 동기화하는 코드를 추가해야 합니다.
모두 Set 인터페이스를 구현한 클래스입니다.
HashSet은 정렬을 해주지 않고, TreeSet은 오름차순으로 자동 정렬해주며, LinkedHashSet은 입력된 순서대로 데이터를 관리합니다.
HashMap은 해시 함수를 통해 키와 값이 저장되는 위치를 결정하므로, 키의 순서가 없습니다.
LinkedHashMap은 키의 순서가 삽입한 순서대로 정렬됩니다.
HashTable은 HashMap과 마찬가지로 키의 순서가 없지만, 동기화를 지원합니다.
TreeMap은 레드-블랙 트리로 구현되어 있으며, 키의 순서가 정렬됩니다.
타입이 외부에서 사용자에 의해 지정되는 것을 의미합니다.
잘못된 타입이 들어올 수 있는 문제를 컴파일 단계에서 방지할 수 있습니다.
지역변수는 중괄호 내부, 함수의 매개변수에서 사용되는 변수로, 함수에서 벗어나면 사라집니다.
전역변수는 클래스 안의 전체 영역에서 사용하는 변수입니다.
정적변수는 프로그램이 종료되기 전까지 메모리에 값이 사라지지 않는 변수입니다.
인스턴스 생성 없이 바로 사용 가능하기 때문에 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어서 비용을 줄이고 효율을 높일 수 있습니다.
클래스, 메소드, 변수를 선언할 때 사용할 수 있으며, 한 번만 할당하고 싶을 때 사용합니다.
final 변수는 한 번 초기화 되면 값을 변경할 수 없습니다.
final 메소드는 다른 클래스에서 해당 메소드를 오버라이딩할 수 없습니다.
final 클래스는 다른 클래스에서 해당 클래스를 상속할 수 없습니다.
자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술이며, 반대로 직렬화된 바이트 형태의 데이터를 다시 객체로 변환하는 과정을 역직렬화라고 합니다.
클래스명과 같은 이름의 메서드로, 객체가 생성될 때 호출됩니다.
일반 메서드와 마찬가지로 오버로딩이 가능합니다.
static 키워드를 사용한 변수, 메서드, 클래스가 메모리에 올라갈 때 함께 초기화되며, 인스턴스 생성 없이 사용할 수 있습니다.
메서드 영역에서 메모리를 관리합니다.