Java

4 minute read

JAVA

  • JDK: Java Development Kit
  • JRE: Java Runtime Environment
  • JVM: Java Virtual Machine

변수 영역

  1. 클래스 멤버 변수 : static 영역 (JVM 종료 시까지 존재)
  2. 지역 변수 : stack 영역 (해당 스택 영역 종료 시 삭제)
  3. 객체 멤버 변수 : heap 영역 (객체와 함께 가비지 컬렉터에 의해 정리됨)

객체 지향의 4대 특성

  1. 캡슐화 : 정보 은닉 (접근 제어자 등)
  2. 상속 (Inheritance, Extends)
  3. 추상화 (Abstraction) : 모델링
  4. 다형성 : 오버로딩, 오버라이딩

오버로딩, 오버라이딩

  • Overloading : 같은 메서드 이름, 다른 인자 목록으로 다수의 메써드를 중복 정의
  • Overridding : 같은 메서드 이름, 같은 인자 목록으로 부모 클래스의 매서드를 자식 클래스에서 재정의

접근 제어자

  1. public : 모두 접근 가능
  2. protected : 상속 / 같은 패키지 내의 클래스에서 접근 가능
  3. default : 같은 패키지 내의 클래스에서 접근 가능
  4. 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)

screenshot

Weak Generational Hypothesis
“대부분의 객체는 금방 Unreachable 상태가 된다”라는 가설
해당 가설의 장점을 살리기 위해 전체 가 아닌 일부 만 검사할 수 있게 공간을 나눔

Young Generation Area

  • 새로 생긴 객체가 들어간다
  • Minor GC : 상대적으로 빠른 속도
  • Eden 영역과 2개의 Survivor 영역으로 구성된다
  • 하나의 survivor 영역은 항상 비어있다

    실행 순서

    1. 새로 생성한 객체는 Eden 영역에 존재
    2. Eden 영역에 대한 GC가 1회 발생 한 후 살아냄은 객체를 Survivor 중 한 곳으로 옮긴다
    3. 하나의 Survivor 영역이 가득 차게되면 GC 한 후 살아남은 객체를 다른 Survivor로 옮긴다
    4. 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 스프링 입문을 위한 자바 객체지향의 원리와 이해

Categories:

Updated: