Java
JAVA
- JDK: Java Development Kit
- JRE: Java Runtime Environment
- JVM: Java Virtual Machine
변수 영역
- 클래스 멤버 변수 : static 영역 (JVM 종료 시까지 존재)
- 지역 변수 : stack 영역 (해당 스택 영역 종료 시 삭제)
- 객체 멤버 변수 : heap 영역 (객체와 함께 가비지 컬렉터에 의해 정리됨)
객체 지향의 4대 특성
- 캡슐화 : 정보 은닉 (접근 제어자 등)
- 상속 (Inheritance, Extends)
- 추상화 (Abstraction) : 모델링
- 다형성 : 오버로딩, 오버라이딩
오버로딩, 오버라이딩
- Overloading : 같은 메서드 이름, 다른 인자 목록으로 다수의 메써드를 중복 정의
- Overridding : 같은 메서드 이름, 같은 인자 목록으로 부모 클래스의 매서드를 자식 클래스에서 재정의
접근 제어자
- public : 모두 접근 가능
- protected : 상속 / 같은 패키지 내의 클래스에서 접근 가능
- default : 같은 패키지 내의 클래스에서 접근 가능
- private : 자신만 접근 가능
abstract
- 선언부는 존재하지만, 구현부가 없는 것들 (추상 메서드, 추상 클래스 등)
- 객체를 생성할 수 없음 -> 하위 클래스에 메서드의 구현을 강제시킨다.
- 추상 메서드가 하나라도 존재하면 해당 클래스는 추상 클래스이다.
static block
- 클래스가 스태틱 영역에 배치될 때 실행되는 코드
- 패키지 or 클래스가 처음 사용될 때 스태틱 영역에 배치된다.
- 스태틱 영역에 배치되면 프로그램 종료 시까지 해당 메모리를 반환할 수 없다.
public class Ex {
static {
// Ex 클래스가 스태틱 영역에 배치 될 시 바로 실행
}
{
// Ex 인스턴스가 생성될 시 바로 실행
}
}
final
- public final class ~ (final class) : 해당 클래스에 대해 상속을 허용하지 않는다.
- final void ~ (final method) : 해당 메서드에 대해 오버라이딩을 허용하지 않는다.
- final int ~ (final varible) : 해당 변수에 대해 값 변경을 허용하지 않는다. (다른 언어에서의 const)
interface
- public abstract method, public static final variable 만 갖을 수 있다. (붙이지 않아도 자동으로 자바에서 변형해준다.)
- JAVA8 에서부터는 public static method (구체 스태틱 메서드), public default method (구체 인스턴스 메서드 -default 붙여줘야 함) 사용 가능!
// 동일 코드
interface Math {
int x = 3;
void cal();
}
interface Math {
public static final int x = 3;
public abstract void cal();
}
SOLID
- High Cohesion, Loose Coupling (응집도는 높이고 결합도는 낮춘다)
- 재사용성, 수정, 유지 보수에 용이하게 하기 위해서
- 결합도 : 모듈 간의 상호 의존 정도
- 응집도 : 모듈 내의 요소들이 갖는 기능적 관련성
1. SRP (Single Responsibility Principle) - 단일 책임 원칙
“하나의 클래스를 수정해야되는 이유는 오직 한 가지여야 한다.”
2. OCP (Open Closed Principle) - 개방 폐쇄 원칙
“소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해서는 열려있어야 하고, 수정에 대해서는 닫혀있어야 한다.”
3. LSP (Liskov Substitution Principle) - 리스코프 치환 원칙
“서브 타입은 언제나 자신의 기반 타입(base type) 으로 교체할 수 있어야 한다.”
“하위 클래스의 인스턴스는 상위 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데 문제가 없어야 한다.”
- 계층도가 아닌 분류도 형식으로 상속해야 함
4. ISP (Interface Segregation Principle) - 인터페이스 분리 원칙
“클라이언트가 사용하지 않는 메소드에 영향받지 않아야 한다.”
- 인터페이스를 이용해 제한된 메서드만 호출할 수 있게 만듦
5. DIP (Dependency Inversion Principle) - 의존 역전 원칙
“클래스를 참조할 일이 있을 때 그 클래스를 직접 참조하지 말고 그 대상의 추상 클래스를 만들어서 참조해야 한다” “자신보다 변하기 쉬운 것에 의존하면 안된다”
Maven (아파치 메이븐)
자바의 프로젝트 관리 도구로, pom.xml 에 필요한 라이브러리를 dependency로 정의해놓으면 네트워크를 통해 자동으로 다운받아준다.
node.js의 NPM에 대응되는듯
- 정해진 라이프사이클에 의해 진행된다.
- 프로젝트 관리 기능 포함
- 메이븐 라이브러리 찾는곳
Survlet (서블릿)
클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Survlet 인터페이스를 구현한 자바 프로그램
개발자가 해야할 일들을 간소화 시켜줌 (ex. 소켓 생성, 포트 연결, …)
Survlet Container (서블릿 컨테이너)
- 아파치 톰캣, 제티 등이 있다
- 서블릿의 라이프사이클을 관리하고 요청이 들어올 때마다 새로운 스레드를 생성한다
람다 (JAVA8 Spec)
- 함수형 인터페이스 : 추상 메서드를 하나만 갖는 인터페이스
- 자바의 람다식은 함수형 인터페이스로만 접근 가능하다
- 변수에 저장, 메서드의 인자로 전달, 메서드의 반환값으로 사용 가능하다
- java.util.function.* 에 필요한 함수형 인터페이스가 없는 경우 정의해 사용한다
// Runnable에 단 하나 존재하는 추상메서드 run() 에 대한 식을 이렇게 기술할 수 있다.
// 두 식은 같음
Runnable a = (인자 목록) -> { 로직 }
Runnable b = new Runnable() {
public void run() {
//로직
}
}
// 커스텀
@Functionalinterface //optional -> 컴파일러가 함수형 인터페이스 조건에 맞는지 검증해줌
interface MyFunctionalInferface {
public abstract int something(int param);
}
MyFfunctionalInterface t = (x) -> { return x * x; }
= x -> { return x * x; } // 인자 하나인 경우 소괄호 생략 가능
= x -> return x * x // 로직이 한 줄인 경우 중괄호 생략 가능 + 세미콜록생략
public class Ex {
public static void main(String[] args) {
doIt(x -> x * x); //이런 식으로 바로 접근도 가능
}
public static void doIt(MyFunctionalInterface mfi) { ... }
}
// 자주 사용하는 패턴
Arrays.stream(ages)
.filter(age -> age < 20)
.forEach(age -> System.out.println(...));
Arrays.stream(ages)
.sorted()
.forEach(System.out::println); // 인자에 대한 가공없이 출력하는 경우 이렇게도 사용 가능 (메서드 레퍼런스)
메서드 레퍼런스, 생성자 레퍼런스
- 메서드, 생성자를 간단하게 사용하는 방식
Java Garbage Collection (자바 가비지 컬렉션)
- Garbage : 더 이상 참조되지 않는 오브젝트
- stop the world : GC 실행 쓰레드를 제외한 나머지 쓰레드의 작업을 중지시킨다
- 객체의 사용 여부를 힙 메모리에서 찾아 사용중이지 않은 객체를 삭제시키는 작업
- unused object 란, 프로그램 어디에서도 참조되지 않는 객체를 말한다
- 마킹, 삭제, 압축의 세 과정으로 이루어진다
Generational Garbage Collection (Hotsopt JVM)
Weak Generational Hypothesis
“대부분의 객체는 금방 Unreachable 상태가 된다”라는 가설
해당 가설의 장점을 살리기 위해 전체 가 아닌 일부 만 검사할 수 있게 공간을 나눔
Young Generation Area
- 새로 생긴 객체가 들어간다
- Minor GC : 상대적으로 빠른 속도
- Eden 영역과 2개의 Survivor 영역으로 구성된다
- 하나의 survivor 영역은 항상 비어있다
실행 순서
- 새로 생성한 객체는 Eden 영역에 존재
- Eden 영역에 대한 GC가 1회 발생 한 후 살아냄은 객체를 Survivor 중 한 곳으로 옮긴다
- 하나의 Survivor 영역이 가득 차게되면 GC 한 후 살아남은 객체를 다른 Survivor로 옮긴다
- 1~3 계속 반복, 계속 살아남은 객체를 Old 영역으로 옮긴다
Old Generation Area
- 데이터가 가득 찰경우 GC
- Young 영역에서 계속 Reachable 상태를 유지하는 Old 영역으로 복사된다
- Major GC : 상대적으로 느린 속도
- Yoyng 영역을 참조하는 객체가 있을 경우 카드 테이블에 정보를 표시한다.
출처
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html https://d2.naver.com/helloworld/1329 스프링 입문을 위한 자바 객체지향의 원리와 이해