👉🏻 자세히 공부하기
▪ 자바란?
- 객체(기능) 중심의 설계
- 대표적인 언어 : java
- JVM을 통해 여러 운영 체제에서 실행이 가능하다.
- 중간 계층으로 인해 악성 코드가 직접 운영 체제에 영향을 미치기 어렵다.(보안성이 뛰어나다.)
- 가비지 컬렉터를 통해 메모리를 관리해 준다.
- 사용하지 않는 메모리(더 이상 참조되지 않는) 자원을 자동으로 식별하고 회수
- 멀티 쓰레드를 지원한다.
thread
스레드란?
프로세스(실행 중인 프로그램) 내에 실제로 작업을 수행하는 주체로서, 두 개 이상의 스레드를 가지는 프로세스를 멀티 스레드 프로세스라고 한다.
프로그램을 실행 시킬 때, 코드의 흐름이 있어. 이 하나의 흐름을 쓰레드라고함.
main 메서드 -> ... 이후 코드가 하나씩 실행되는것.
ex) 예를 들을 여러 for문을 돌릴 때
+) 데몬스레드 역시 멀티 스레드가 지원이 된다면 가능
장점
- 사용자에 대한 응답성 향상
- 자원의 효율성(자원 공유)
- 동시성
단점
- 스레드 중 하나만 문제가 생기더라도 전체 프로세스에 영향을 끼침(상호 간섭)
- 스레드를 많이 생성할 경우, Context Switching이 많이 일어나 성능의 저하
- 여러 스레드가 공유 자원에 동시에 접근 할 경우, 동기화 이슈 발생
: 여러 쓰레드가 동시에 작업되고, 랜덤하게 끝이남.
- 이걸 순서를 정해줄 수 있는게 : 싱크로나이즈 - 쓰레드 동기화를 해줄 수 있다.
* 동기화 : 작업들 사이에 실행 시기를 맞추는 것.
💡 즉, 동일한 프로세스 내에서는 다른 스레드들과 전역 메모리를 공유할 수 있다는 장점이 있으나, 스레드 중에 하나가 문제가 있더라도 전체 프로세스에 영향을 끼지기 때문에 교착상태에 빠질 수 있다.
▪ 객체 지향 프로그래밍이란?
💡 OOP(Object Oriented Programming), 객체 지향 프로그래밍
- 특징
- 추상화 : 필요한 정보를 간소화, 추상화
- 캡슐화 : 객체에 필요한 데이터나 기능을 그룹화 (은닉)
- 상속 : 하위 - 가 상위 클래스의 기능을 사용하는 것, 중복 코드의 재사용성
- 다형성 : 이러한 특징들을 종합해서, 객체의 관계를 유연하게 해준다
오버로딩,오버라이딩
- 오버로딩 : 한 클래스 내의 메서드 중복 정의 (다른 인자)
- 오버라이딩 : 상위 클래스의 메서드를 재정의
추상클레스와 인터페이스
우선, 자바는 복잡성과 충돌 가능성으로 인해 다중 상속을 지원하지 않습니다.
- 추상 클레스와 인터페이스를 통해 추상화 하는 것은 다형성의 핵심 개념 중 하나 입니다.
- 인터페이스와 추상 클래스의 추상 메서드는 이를 구현한 클래스에서 반드시 구현해야 합니다.(강제성을 가지고 있습니다)
인터페이스
interface / implements - 다중 구현이 가능
상수와 추상 메서드만으로 이루어져 있다. (빈 틀)
공통의 기능을 정의하여 구현한 객체가 같은 동작을 한다는 것을 보장합니다.
클래스간의 관계를 느슨하게 유지할 수 있습니다.
추상 클래스
abstract / extends
자신의 기능을 하위 클래스로 확장시키는 것입니다.
인터페이스와는 다르게 '클래스로서' 명확한 계층 구조가 필요할 때.
공통의 코드를 공유나 구체적인 구현 공유가 필요할 때 사용합니다.
▪ SOLID 원칙
- Single : 단일 책임
: 클래스를 변경하는 이유는 오직 하나여야 한다.
- Open-Closed : 개방-폐쇄
: 확장에는 열려있고, 수정에는 닫혀있다.
- Liskov 치환
: 하위 타입은 상위 타입을 대체할 수 있어야한다.(상위가 하위로 바뀌더라도 정상 작동)
- Interface : 인터페이스 분리
: 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 작게 분리하는 것
- Dependency Inversion: 의존 역전
: 상위 모듈은 하위 모듈에 의존하지 않으며, 추상화(인터페이스)에 의존하도록 한다.
▪ 메모리 영역
1) Static Area (스태틱 메모리 영역 = Method Area)
- static을 통해 field에 선언된 변수 데이터를 저장하는 영역
2) Stack Area (스택 메모리 영역)
- 지역변수의 데이터 값이 저장되는 메모리 영역
- 기본 자료형(int, double, byte, long, ...)의 경우 값이 저장
- 참조형 타입 변수는 참조값만 저장된다.
이 참조값(=인스턴스의 주소 값)은 Heap 영역에 있는 객체를 가르키는 역할을 한다.
3) Heap Area (힙 메모리 영역)
- new 연산자를 통해 생성된 객체의 실제 데이터가 담기는 영역
💡 즉, Heap 은 참조형 데이터 객체의 실제 데이터들이 담기는 공간이고, Stack 영역의 객체는 Heap 영역의 참조 값이 갖게 된다.
👉🏻 메모리 영역
▪ 람다식
람다식은 익명 함수의 한 종류로서, 함수를 하나의 식으로 표현한 것입니다.
Stream API를 통해 효과적으로 사용할 수 있으며, 코드를 간결하게 나타내는 장점이 있습니다.
stream
흐름 을 통해
- map : 기존의 값들을 지정한 요소를 값으로 새로운 stream을 생성하며 변환
- sorted : 정렬 (기본값 - 오름차순)
- collector : 값을 수집할 때 사용한다. ex)Collectors.toList()