// 에드센스

자바는 버전별로 어떤 차이가 있나요?

  • 1.5
    • Generic 도입
    • Enum 도입
    • Annotation 도입
  • 1.6
    • G1GC를 테스트용으로 사용하도록 추가함
  • 1.7
    • 다이아몬드 오퍼레이터(<>) 도입
      • 변수선언시 동일한 타입으로 선언하고 싶다면 타입 명시하지 않아도 되고, <>로만 사용하면 됨
  • 1.8
    • 람다식 도입
    • 디폴트 메서드 도입
    • 옵셔널 도입
    • 스트림 도입
  • 9
    • java.net.http 패키지 도입
    • 스트림 api 추가됨
    • 인터페이스에서 private 메서드 사용 가능
    • try with resources 도입
  • 10
    • var 키워드 도입 -> 로컬변수 타입추론
  • 11
    • String, File API 개선
    • 람다식 파라미터로 var 사용가능하도록 개선
  • 12
    • Switch문 개선 "->"사용하는 식으로
  • 13
    • Switch문이 값을 return할 수 있도록 yield 키워드 추가
    • 줄바꿈된 문자열을 자동으로 선언할 수 있는 문법 (""" 어쩌구 저쩌구 """)
  • 14
    • record 타입 추가
    • NPE 에러내용이 더욱 상세하게 나옴
  • 15
    • sealed class
      • 다른 클래스가 상속을 받지 못하도록 제한하는 클래스
  • 16
    • OpenJDK 버전 관리가 Mercurial에서 Git으로 바꾸미
  • 17
    • Pattern Matching for switch
     

 

  • 18
    • default CharSet이 UTF8로 바뀜
    • 기존에는 런타임 환경에 따라 알아서 선택됐었음

자바 Stream API에 대해 설명해주세요

  • 자바8부터 추가된 기능
  • 일련의 데이터의 흐름을 쉽게 처리할 수 있게 도와주는 기능
  • 컬렉션(배열포함)의 요소를 함수형 연산(람다함수)을 통해 하나씩 참조하며 처리할 수 있게 도와주는 반복자

 

Stream API의 특징을 알려주세요

  • 원본 데이터를 변경하지 않는다
  • 일회용이다 -> 한번 사용이 끝나면 재사용 불가 -> 닫힌 스트림 사용시 IllefalStateException 발생
  • 내부 반복으로 작업 처리 -> for, while과 다르게 반복문법을 내부에 숨기고있기에 간결하고 안전한 코드

 

Stream API의 처리 단계를 알려주세요

  • 생성
    • Stream 객체를 생성하는 단계
  • 가공
    • 중간 데이터를 연산하는 과정
  • 결과만들기
    • 가공된 데이터를 원하는 형태로 출력함

TBD...

배열의 중복제거를 위한 방법을 알려주세요

  • Set을 사용
    • Set에 넣으면 중복제거됨
  • ArrayList를 사용
    • ArrayList의 contain을 사용하여 중복확인 후 중복이 제거된 새로운 리스트 생성
  • Stream의 distinct() 사용

자바 컬렉션에 대해 설명해주세요

  • 데이터의 집합
  • 자료구조들을 자바 클래스로 구현해둔 것
  • C에서는 LinkedList를 사용하려면 직접 코드짜야하지만
  • 자바에서는 컬랙션을 인스턴스화하면 된다

 

컬렉션의 장점은 뭐죠?

  • 표준화되어있기에 재사용성이 높다
  • 검증된 성능과 품질
  • 이미 구현되어있는것을 갖다쓰는거기에 편리

 

컬렉션은 어떻게 구성되어있죠?

 

  • 컬랙션 프레임워크는 크게 2개로 나뉜다
    • 컬렉션 인터페이스
    • 맵 인터페이스
  • 맵이 따로인 이유는
    • 두개의 데이터를 묶어서 한쌍으로 다루기에

 

Iterator 인터페이스는 뭐죠?

  • 컬렉션 인터페이스들보다 상위 최상위 인터페이스
  • 이터레이터 객체를 관리하는 인터페이스

https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

 

MVC 패턴에 대해 설명해주세요

  • 디자인 패턴중에 하나다
  • Model, View, Controller

  • 사용자가 Controller 조작
  • Controller는 Model에서 데이터를 가져옴
  • View를 제어하여 사용자에게 전달
  • Model이란?
    • DB, 변수, 상수 등의 데이터
  • View란?
    • 텍스트박스, 체크박스 등 유저 인터페이스
    • 출력을 담당
    • 사용자들이 보는 화면
  • Controller란?
    • 사용자와 데이터를 연결하는 다리역할
    • 사용자가 무언가를 클릭하거나 수정하는 이벤트를 처리하는 부분
  • MVC 패턴을 사용해야하는 이유
    • 각각 기능에 집중할 수 있다
    • 확장성 유연성 증가

객체지향에 대해 설명해주세요

  • 객체란? -> 현실에 존재하는 대상
  • 프로그래밍에서 필요한 데이터를 추상화시켜 상태행위를 가진 객체를 만들고
  • 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법론

 

객체지향의 장단점이 뭐죠?

  • 장점은
    • 코드 재사용성이 좋다. 상속을 통한 확장도 가능
    • 유지보수가 쉽다. 절차지향에서는 일일이 찾아서 수정해야하지만, 객체지향에서는 클래스 내부를 보면 된다
    • 대형 프로젝트에 적합하다. 클래스단위로 모듈화 가능이기에 협업에 용이
  • 단점은
    • 개발속도가 상대적으로 느리다
    • 설계하기 쉽지 않다

 

클래스와 인스턴스가 뭐죠?

  • 클래스는
    • 대상의 속성과 행위를 변수와 메서드로 정의한 것
  • 인스턴스는
    • 정의한 클래스를 실제 메모리에 할당시키는 것

 

객체지향의 특성은 뭐가있죠?

  • 캡슐화
    • 클래스라는 캡슐에 속성과 행위를 묶고, 외부로부터 보호하는 것
      • 데이터 보호
      • 데이터 은닉 -> 필요한 부분만 노출
    • 접근제어자
    • 게터, 세터 -> 결합도를 낮출 수 있다
  • 상속
    • 기존 클래스를 재활용하여 새로운 클래스를 만드는 것
    • 속성과 행위를 물려받음
    • 중복을 제거하고 필요한 부분만 수정할 수 있다
  • 추상화
    • 객체지향 관점에서 클래스를 정의하는 것
    • 객체의 본질적이고 공통적인 부분만 추출하여 정의하는 것
      • 추상클래스
      • 인터페이스
  • 다형성
    • 객체의 속성이나 행위가 상황에 따라 여러가지 형태를 가질 수 있는 것
    • 상위클래스의 참조변수가 하위클래스 객체를 참조하는 것
      • 오버로딩
      • 오버라이딩
        • 오버로딩 오버라이딩처럼 메서드가 상황에따라 다르게 동작할 수 있고
      • 아래 사진처럼 상위클래스 변수가 하위클래스 변수를 받을 수 있는것
      • 이것이 다형성

 

 

 

참고:

https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95

 

객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화 -

객체 지향 프로그래밍은 객체의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미합니다. 객체 지향 프로그래밍의 기본적인 개념과 그 설계를 바르게 하기 위

www.codestates.com

 

정말 오오오오오랜만에 글을쓴다

다시 잘 써보자고


가비지란?

  • JVM의 힙영역에 할당됐던 메모리중 필요없게 된 메모리를 가비지라고 한다
  • C언어의 경우 free() 함수를 통해 직접 메모리 해제
  • 자바는 gc가 해준다
Person person = new Person();
person.setName("lsh");
person = null;

// 가비지 발생
person = new Person();
person.setName("ksh");
 

가비지 컬렉션 장점

  • 개발자가 완벽하게 신경쓰지 않아도 된다

가비지 컬렉션 단점

  • 언제 메모리가 해제될지 개발자가 알 수 없다
  • GC 동작중에는 STW, 오버헤드 발생

 

 

GC란

  • 힙 영역에서 유효하지 않은(사용하지 않는) 메모리를 자동으로 수거하는 기능
  • 힙 영역은 다음 두가지가 전제가 된다
    • 대부분의 객체는 금방 unreachable 상태가 된다
    • 오래된 객체 -> 새로운 객체로의 참조는 아주 적다
  • 따라서 힙 영역은 객체의 생존 기간에 따라 Young 영역과 Old 영역으로 나눔

young영역

  1. young은 eden과 survivor1, 2로 구성
    1. eden
      1. eden은 new를 통해 새로 생성된 객체가 위치함
      2. 정기적인 gc 수행 후 살아남은 객체들은 survivor1,2로 넘김
    2. survivor
      1. 최소 1번 이상의 gc에서 살아남은 객체가 위치한 영역
      2. survivor1이나 survivor2중 하나는 꼭 비어있어야 한다
  2. 이곳에서의 gc 동작을 Minor gc라고함

 

old영역

  • young영역에서 reachable 상태를 유지하여 살아남은 객체가 복사되어 이곳에 위치하게된다
  • 이곳에서의 gc를 메이저gc 혹은 full gc라고함

  • card table
    • 예외적으로 old영역에 있는 객체가 Young영역에 있는 객체를 참조하는 경우도 있다
    • 이럴때를 대비하여 512바이트의 덩어리(청크)로 되어있는 카드테이블이라는 것이 있다
    • 마이너 gc가 발생할때 old영역에서 참조하는 young으로 참조하는 객체가 있는지 old영역을 확인안해도 되기에 효율적

 

왜 굳이 영역을 나누는가?

  • heap 영역을 나누는 이유는 heap 전체를 탐색하여 메모리를 해제하는 full gc로 인한 성능상의 이슈를 최소화 시키기 위함
    • weak generational hypothesis의 장점을 극대화 시키기 위함
    • 주로 old 영역의 객체는 크기가 큰 것들이 대부분이고 gc 소요시간이 Minor gc보다 오래걸린다
      • Minor gc와 Major gc의 비율간의 트레이드 오프
  • survivor 영역을 두개로 나누는 이유는 메모리 단편화 문제를 해결하기 위함

내부단편화

 

외부단편화

 

 

 

GC 동작 방식

  • young 영역과 old 영역의 세부적인 동작방식은 다르나 다음 두가지는 공통이다
    • Stop the world
      • gc 실행을 위해 jvm이 애플리케이션의 실행을 멈추는 작업
      • gc를 실행하는 쓰레드를 제외한 모든 스레드가 중단됨
      • gc튜닝은 대부분 이 시간을 줄이는것
    • Mark and sweep
      • 마크 -> 사용되는 메모리와 그렇지 않은 메모리를 식별하는 작업
      • 스윕 -> 마크단계에서 사용되지 않는것으로 판별된 메모리를 해제하는 작업
      • 컴팩션 -> 파편화된 메모리 영역을 앞에서부터 채워나가는 작업

 

Minor GC 동작 방식

사진출처: https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리

Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객

inpa.tistory.com

 

 

age란?

  • Survivor 영역에서 객체가 gc로부터 살아남은 횟수
  • 임계점에 다다르면 Promotion되어 old영역으로 이동한다
  • JVM중 일반적인 HotSpot JVM의 경우 age 임계값이 31이다
 

 

 

 

Major GC 동작 방식

  • young에서 age가 차서 넘어온 객체들
  • old 영역의 메모리가 부족해지면 major gc 수행
  • old 영역에서 한번에 삭제함
  • old 영역은 young 영역보다 상대적으로 큰 공간을 가지고있기에 gc 수행시간 길다 → STW
  • STW를 줄이기위해 여러 가비지 컬렉션 알고리즘이 존재

Minor Major GC 비교

  • 만약 gc가 동작해도 모든 객체가 reachable해서 삭제될 객체가 없다면? → OOM 발생

 

 

 

GC 알고리즘

Serial GC

  1. 1 core cpu일때 사용하기위함
  2. Gc를 처리하는 스레드가 1개라서 STW시간이 제일 길다
  3. 실무에서 사용하는 케이스가 거의 없다고한다

 

Parallel GC

  • 자바8의 default gc
  • Minor gc를 멀티스레드로 수행함 (Major gc는 여전히 싱글스레드)
  • Serial gc에 비해선 STW 감소
  • 스레드는 기본적으로 cpu 개수만큼 할당됨

 

Parallel old GC

  • Parallel gc를 개선함
  • old영역에서도 멀티스레드로 메이저 gc수행
  • Mark - summary - compact 방식

 

Cms GC

  • 어플리케이션의 쓰레드와 GC 쓰레드가 동시에 실행되어 stop-the-world 시간을 최대한 줄이기 위해 고안된 GC
  • 단, GC 과정이 매우 복잡해짐.
  • GC 대상을 파악하는 과정이 복잡한 여러단계로 수행되기 때문에 다른 GC 대비 CPU 사용량이 높다
  • 메모리 파편화 문제
  • CMS GC는 Java9 버전부터 deprecated 되었고 결국 Java14에서는 사용이 중지

 

G1GC

  • Java 9 이상부터 default GC
  • 기존의 GC 알고리즘에서는 Heap 영역을 물리적으로 고정된 Young / Old 영역으로 나누어 사용하였지만, G1 gc는 아예 이러한 개념을 뒤엎는 Region이라는 개념을 새로 도입하여 사용.
  • 전체 Heap 영역을 Region이라는 영역으로 체스같이 분할하여 상황에 따라 Eden, Survivor, Old 등 역할을 고정이 아닌 동적으로 부여
  • Garbage로 가득찬 영역을 빠르게 회수하여 빈 공간을 확보하므로, 결국 GC 빈도가 줄어드는 효과를 얻게 되는 원리
    • 이전의 GC들처럼 일일히 메모리를 탐색해 객체들을 제거하지 않는다
    • 대신 메모리가 많이 차있는 영역(region)을 인식하는 기능을 통해 메모리가 많이 차있는 영역을 우선적으로 GC 한다. → 영역(region)을 나눠 탐색하고 영역(region)별로 GC가 일어난다.
    • 또한 이전의 GC 들은 Young Generation에 있는 객체들이 GC가 돌때마다 살아남으면 Eden → Survivor0 → Survivor1으로 순차적으로 이동했지만, G1 GC에서는 순차적으로 이동하지는 않는다. 
    • 대신 G1 GC는 더욱 효율적이라고 생각하는 위치로 객체를 Reallocate(재할당) 시킨다. 
    • 예를 들어 Survivor1 영역에 있는 객체가 Eden 영역으로 할당하는 것이 더 효율적이라고 판단될 경우 Eden 영역으로 이동시킨다.

 

ZGC

  1. Java 15에 release됨
  2. 대량의 메모리(8MB ~ 16TB)를 low-latency로 잘 처리하기 위해 디자인 된 GC
  3. G1의 Region 처럼,  ZGC는 ZPage라는 영역을 사용하며, G1의 Region은 크기가 고정인데 비해, ZPage는 2mb 배수로 동적으로 운영됨. (큰 객체가 들어오면 2^ 로 영역을 구성해서 처리)
  4. ZGC가 내세우는 최대 장점 중 하나는 힙 크기가 증가하더도 STW의 시간이 절대 10ms를 넘지 않는다는 것

참고: GC 성능 비교

 

 

G1GC

  • G1은 Garbage First 라는 뜻
  • 조기 승격(Promotion)에 덜 취약하다. → old로 너무 빠르게 이동되는 문제 → STW
  • 대용량 heap에서 확장성(특히 중단시간)이 우수하다.
  • full STW GC를 없애거나 확 줄일 수 있다.
  • Java 9 부터 default GC
  • RSet(Remembered Set)을 통해 어떤 객체가 어떤 리전에 저장되어있는지 추적 가능 → 전체 힙을 뒤질필요가 없어짐

 

G1GC 동작 과정

  1. Initial Mark - SWT : Old 영역에서 존재하는 객체들이 참조하는 Survivor 영역을 찾는다. SWT가 발생한다.
  2. Root Region Scanning : Initial Mark 단계에서 식별한 Survivor 영역에서 Old 영역을 가리키는 레퍼런스를 식별한다.
  3. Concurrent Mark : 힙 전체에 걸쳐 접근 가능한 살아있는 객체를 찾는다.
  4. Remark - STW : Concurrent Mark 단계를 검증하고, 최종적으로 살아남을 객체들을 식별한다. 이 단계에서는 SATB(Snapshot-At-The-Beginning) 알고리즘이 사용된다. STW가 발생한다.
  5. Cleanup - STW : 어플리케이션을 멈추고(STW) 살아있는 객체가 가장 적은 리전에 대한 미사용 객체를 제거한다. 이후 STW를 끝내고, 앞서 GC 과정에서 완전히 비워진 리전을 FreeList에 추가하여 재사용할 수 있게 한다.
  6. Copy : GC 대상 리전이었지만 Cleanup 과정에서 완전히 비워지지 않은 리전의 살아남은 객체들을 새로운 리전에 복사하여 Compaction 작업을 수행한다.

 

gc튜닝

  • 언제 튜닝해야하는가? → 성능저하의 원인이 명백히 gc때문일때
  • 튜닝의 핵심은
    • old영역으로 넘어가는 객체 최소화하기
    • Major gc 시간 짧게 유지하기

즉, Major gc를 적게발생시키고, 발생했다면 빠르게 끝내야함

 

GC튜닝 방법

  • 힙 크기 설정
    • 힙이 크면 gc수행시간이 늘어남, 힙이 작으면 gc가 더 자주 수행됨 -> 잘 조절해야함
  • Young영역과 Old영역 크기 비율 + Eden과 Survivor의 크기 비율
    • old영역이 커지면 → Major gc가 자주발생하지않음 하지만 발생하면 오래걸림

 

 

 

G1GC 튜닝포인트

G1GC가 제공하는 파라미터가 많기에 튜닝 포인트도 많다

  • Maximum GC Pause Time
    • -XX:MaxGCPauseMillis 설정을 통해 GC 실행 중에 최대 일시 중지 시간을 지정함으로써 높은 지연 시간을 최소화 하거나 높은 처리량을 설정할 수 있다.

 

  • Young Gen 사이즈 세팅을 하지 말 것(-XX:MaxGcPauseMillis 설정을 할 경우)
    • -Xmn(new 영역)이나 -XX:NewRatio 설정을 피해야 한다.
    • G1GC 알고리즘은 일시 중지 목표 시간을 충족하기 위해 Young 영역을 임의로 수정하게 되는데 Young 영역을 명시적으로 설정할 경우 일시 중지 목표 설정이 정상적으로 작동하지 않는다.

 

  • 다른 GC 알고리즘에서 사용하던 JVM 인수 제거
    • 기본적으로 G1GC의 경우 다른 GC 알고리즘(Serial, Parallel, CMS)에서 사용하던 JVM 인수와 같이 사용할 경우 G1GC의 파라미터가 정상적으로 동작하지 않을 수 있다.

 

  • 문자열 중복 제거
    • -XX:+UseStringDeduplication 설정을 통해 문자열 중복을 제거 한다.
    • JDK 개발팀의 조사에 따르면 다음과 같은 자바 애플리케이션의 특징이 있다고 한다
      • 프로세스의 25%는 문자열임
      • 그 중 13.5%는 중복 문자열임
      • 평균 문자열의 길이는 45자임
    • 예를들어 멤버리스트 조회시 status가 “ACTIVE”라는 동일한 문자열이나 다 다른 메모리 공간 점유

 

그 외의 주요 파라미터

 

 

 

GC 튜닝보다 메모리 누수 예방이 우선

  • 메모리 누수 : 사용되지 않는 객체들이 힙영역에 남아있는것

Static 변수에 의한 누수

  • Static 변수는 클래스가 로드될때 생성되어 JVM이 종료될때까지 메서드 영역에 남아있는다 (사용 여부와 관계x)
  • Static 변수가 객체를 참조 중이라면 해당 객체는 GC의 대상이 되지 않는다
  • 더 이상 사용하지 않는다면 null을 할당하여 참조를 제거하자

 

무분별한 Autoboxing

public class Adder {
       public long addIncremental(long l)
       {
              Long sum = 0L;
              sum = sum + l;
              return sum;
       }
       public static void main(String[] args) {
              Adder adder = new Adder();
              for(long i ; i < 1000 ; i++) {
                adder.addIncremental(i);
              }
       }
}

 

 

컬렉션 클래스의 데이터를 해제하지 않는 경우

  • List, Map, Set 같은 컬렉션 클래스들에 객체가 담겨있는 경우 객체의 참조가 해제되지 않음
  • null 참조로 해제한다
      public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null; // 다 쓴 객체 참조 해제
        return result;
    }
  • Weak reference를 사용한다
    • 특정 key 값이 더 이상 사용되지 않는다고 판단되면 해당 Key - Value 쌍을 삭제
  • 자바에서 참조 종류는 다음 4가지가 있다
    • 강한 참조(Strong Reference)
      • 강한 참조는 Java의 기본 참조 유형으로 new 할당 후 새로운 객체를 만들어 해당객체를 참조하는 방식
      • 강함 참조를 통해 참조되고 있는 객체는 참조가 해제되지 않는 이상 가비지 컬렉션의 대상에서 제외된다.
Object obj = new Object();
// 만약 GC 를 원한다면 명시적으로 null 표시를 해줘야 한다.
obj = null;
  • 약한 참조(Weak Reference)
    • 약한 참조는 java의 lang 패키지의 WeakReference 클래스를 사용하여 생성한다.
    • 약한 참조는 GC가 발생하면 무조건 수거된다.
    • WeakReference가 사라지는 시점이 GC의 실행 주기와 일치한다.
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null;

System.gc();

// 무조건 null 을 확인하게 된다.
System.out.println(weakRef.get());
  • Soft Reference
    • Soft 참조는 강한 참조와 약한 참조와는 다르게 GC에 의해 수거될 수도 있고, 수거되지 않을 수도 있다.
    • 메모리에 충분한 여유가 있다면 GC가 수행된다 하더라도 수거되지 않는다. 하지만 메모리가 부족하면 수거될 확률이 높다.
Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<>(obj);
obj = null;

System.gc();

// GC 가 여유롭다면 해시코드를 확인할 수 있다.
System.out.println(softRef.get());
  • Phantom Reference?
    • 가장 약한 참조 유형입니다.
    • 객체 수거시에도 참조가 남아있는 참조 유형입니다.
    • 객체의 finalize() 메서드가 호출된 직후에 GC 에 의해 수거됩니다.
    • java.lang.ref PhantomReference class 로 만들 수 있습니다.
    • 생성자에는 넣고자 하는 클래스와 함께 ReferenceQueue 를 인자로 받습니다.
    • PhantomReference 는 객체가 참조되지 않습니다.
    • 객체의 finalize 메서드가 호출된 직후 Phantom Reference 가 ReferenceQueue 에 등록됩니다.
    • 이를 통해 객체의 finalize() 메서드가 호출되었음을 알 수 있습니다.
    • 일반적으로 Phantom Reference 는 Native 객체나 Direct Memory 와 같이 JVM 에서 관리되지 않는 자원들을 해제하기 위해 사용됩니다.

 

CustomKey 사용으로 인한 누수

  • Map을 사용할 때 custom key를 사용할 때는 equals()와 hashcode()를 값을 기반으로 구현해야한다
  • 아래의 경우 Key값이 같은 객체로 인식하지 못해서 계속 Map에 쌓이게 되면서 메모리를 점유하게 된다
public class CustomKey {
    private String name;
    
    public CustomKey(String name) {
        this.name=name;
    }
    
    public staticvoid main(String[] args) {
        Map<CustomKey,String> map = new HashMap<CustomKey,String>();
        map.put(new CustomKey("Shamik"), "Shamik Mitra");
   }
}

 

 

해제되지 않은 리소스로 인한 누수

  • close()나 try with resources 구문으로 리소스 반환해야함
public class Main {
    public static void main(String[] args) {
        try (FileWriter file = new FileWriter("data.txt")) { // 파일을 열고 모두 사용되면 자동으로 닫아준다
            file.write("Hello World");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

프로토콜

  • 통신에 참여하는 주체간에 데이터를 주고받는 과정을 정의한 규칙
  • 효율성, 호환성을 위해 정해놓은 규칙으로, 다수의 벤더와 관련 제품군 등장 및 이용 가능

 

 

 


OSI 7계층과 TCP/IP 프로토콜

두 모델의 공통점

  • 두 호스트 사이에서 이루어지는 네트워킹을 계층구조로 나눈것임
  • 각 계층에서 일어나는 일들을 모듈화 가능

 

두 모델의 차이점

  • OSI의 7,6,5층을 TCPIP에서는 한 층으로 퉁침
  • 이 측면에서는 OSI가 문제해결과 성능개선이 더 좋음

https://velog.io/@sj_dev_js/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7%EA%B3%84%EC%B8%B5%EC%9D%84-%EC%99%9C-%EB%B0%B0%EC%9A%B8%EA%B9%8C

 

[네트워크] OSI 7계층을 왜 배울까?

네트워크를 공부할 때 가장 먼저 배우게 되는 것이 TCP/IP 모델 혹은 OSI 모델이다.오늘날의 네트워크에서 OSI모델은 참조적 모델일 뿐이고 실제로 쓰이는 것은 TCP/IP 모델이라는데 그렇다면 OSI 모

velog.io

 

 


1계층 : 물리계층

 

 

  • 상위계층(2계층)에서 받은 비트 스트림을 상대방의 물리계층으로 보내는 기능
  • 단지 데이터만 전달함
  • 전송단위(PDU)는 비트
  • 프로토콜: Modem, Cable, Fiber, RS-232C
  • 장비: 통신 케이블, 허브(리피터)

 

리피터란?

  • 전선(케이블)이 길수록 전기신호가 약해지는데 이를 증폭해줌
  • 지금은 네트워크 장비에 기본적으로 리피터기능이 탑재돼있기에 따로 리피터를 사용하지 않는다고함

허브란?

  • 컴퓨터 신호를 여러개의 다른 선으로 분산시키는 장치를 총칭함
  • 리피터는 1대1 연결만 가능
  • 허브는 다대다로 연결 가능
  • 얘도 리피터와 마찬가지로 전기신호의 증폭을 위해 사용
  • CSMA/CD 방식을 적용하기에 여러 장비에서 동시에 데이터를 전송하지는 못함 (A장비에서 데이터 전송중일때 B도 전송하면 충돌발생)
  • 특정 포트로만 데이터를 전송할수없고 모든 포트에 데이터를 전송하게 되기에 과도한 트래픽, 충돌 발생 -> 스위칭 허브 사용(레이어2에서 사용)

이렇게 생김

 

 


2계층 : 데이터링크 계층

 

  • 네트워크 기기들 사이에서 데이터를 전송하는 역할
  • 프레임이라는 단위
  • 3계층에서 내려준 패킷을 받아 헤더와 테일에 각각 주소와 제어정보를 추가함
  • 1계층을 통해 송수신되는 데이터의 전송 오류를 감지하여 재전송도 해줌
  • 맥주소를 가지고 통신
  • 맥주소란 컴퓨터의 물리적인 주소
  • ip주소가 시작점과 끝점의 주소라면 맥주소는 중간중간지점들의 주소
  • ex) 서울에서 부산으로 편지를 보낸다면 ip주소는 서울, 부산이 되고 맥주소는 서울우체국, 부산우체국1 등등이 된다
  • 프로토콜 : 이더넷, MAC, PPP, ATM, LAN, Wifi
  • 장비: 브릿지, 스위치

 

브릿지란?

  • 네트워크 세그먼트를 연결해주는 장치
  • 스위치가 나오기 전까지 브릿지가 주로 사용됐다고 함
  • LAN과 LAN을 연결하거나 컴퓨터 그룹(세그먼트)를 연결해주는 기능
  • 브릿지의 다섯가지 기능
    • Learning : A라는 호스트가 데이터를 주면 A의 맥주소를 브릿지의 맥주소 테이블에 저장
    • Flooding : 목적지 정보가 맥주소 테이블에 없다면 모든 포트로 데이터 전파
    • Forwarding : 목적지 정보가 맥주소 테이블에 있다면 해당 포트로 전송, 없다면 플로딩
    • Filtering : 브릿지를 건너지 못하게 막는 기능
    • Aging : 맥주소 테이블 데이터를 자동으로 삭제하는 일종의 TTL

 

스위치란?

  • 브릿지랑 비슷
  • 브릿지와의 차이는 -> 스위치는 하드웨어, 브릿지는 소프트웨어 방식이기에 스위치가 속도가 더 빠르다
  • 브릿지보다 포트수 많음, 포트별 속도지정이 가능
  • 여러모로 브릿지의 상위호환이기에 브릿지대신 스위치 사용한다
  • 스위치의 종류
    • L2스위치 : 기본적인 스위치. 데이터링크 계층에서 사용, 맥주소 기반으로 패킷 전달, 가격저렴
    • L3스위치 : L2스위치에 라우팅 기능이 추가됨, IP 정보를 보고 스위칭한다, 기능적으로 라우터와 똑같지만 라우터는 소프트웨어방식이기에 하드웨어 방식인 L3스위치가 더 빠르고 저렴
    • L4스위치 : 4계층 프로토콜인 TCP/UDP를 사용, IP와 포트 기반으로 스위칭, L4스위치에는 로드밸런싱 기능이 있음
    • L7스위치 : L4스위치와 기능,역할이 동일하나, L7스위치에서는 페이로드를 분석하여 패킷 처리. 페이로드를 분석함으로서 Dos, SYN Attack등 네트워크 공격 방어 가능. 가격 비쌈

 

 


3계층 : 네트워크 계층

  • 데이터그램이 가능 경로를 설정해줌
  • 데이터그램이란 네트워킹에서 데이터 전송의 단위, 그냥 데이터로 이해하면 될듯?
  • 라우팅 알고리즘을 통해 최적의 경로를 선택
  • 데이터를 목적지까지 안전하고 빠르게 전달하는게 중요 -> 이거를 라우팅이라고 한다
  • 전송단위 : 패킷
  • 프로토콜 : IP, ICMP
  • 장비 : 라우터, L3스위치

 

라우터란?

  • 네트워크에서 데이터 전송의 최적 경로를 찾아서 전송해주는 장비
  • L3와 기능 비슷, 하지만 소프트웨어 방식이기에 더 비싸고 느리고 초기설정 어려움
  • 라우터의 종류
    • 코어라우터, 센터라우터, 엣지라우터, 브로드밴드라우터, 핫스팟라우터, ISP라우터

 

 

 


4계층 : 전송계층

 

  • 발신지 - 목적지간 제어와 에러 관리
  • 패킷의 전송이 유효한지 확인하고 재전송을 하는 등 신뢰성있는 통신 보장
  • 오류검츨, 흐름제어, 패킷 생성, 전송, 재전송
  • 단위 : 세그먼트
  • 프로토콜 : TCP, UDP, ARP, RTR
    • 대부분 TCP
    • ACK을 통해 신뢰성있는 전송
    • UDP는 비연결성, 비신뢰성임. 수신자가 잘 받든말든 일단 데이터보냄, 에러나면 어플리케이션에서 알아서 처리해야함, 하지만 빠름, 실시간 서비스에서 적절
  • 장비: 게이트웨이, L4스위치

 

 

 


5계층 : 세션계층

  • 통신장치간의 상호작용을 설정, 유지, 동기화
  • 동시 송수신, 반이중, 전이중
  • 네트워크상 양쪽 연결을 관리하고 연결을 지속시켜줌
  • TCP/IP 세션을 만들고 없애는 역할

 

 


6계층 : 표현계층

 

  • 송신, 수신측 사이에서 데이터 형식을 정해줌(jpg, png등)
  • 7계층으로부터 받거나 주는 데이터의 인코딩, 디코딩이 이루어지는 계층
  • 프로토콜 : JPG, MPEG, SMB 등

 

 


7계층 : 응용계층

  • 사용자와 상호작용
  • 응용 SW
  • 프로토콜 : HTTP, DNS, Telnet, FTP등

 

 

 

 

 

참고:

https://youtu.be/8kI5OIrfZtI?si=-gZMcolC217Aht7y

https://backendcode.tistory.com/167

 

[네트워크] OSI 7 계층 (OSI 7 Layer)

이번에는 네트워크의 기본인 OSI 7 계층에 대해 정리할 것이다. 이번 글에서는 OSI 7 계층에 대해 다루고, 다음 글에서는 TCP/IP 4 계층에 대해 다루기 때문에 이어서 보면 이해하기 쉽다. 🖥️ 목차

backendcode.tistory.com

https://heisyoung.tistory.com/52

 

OSI 7계층 장비(리피터, 허브, 브리지, 스위치, 라우터)

1계층(물리 계층) - 리피터, 허브 리피터(Repeater) 긴 케이블일수록 신호가 약해지기 때문에 신호를 멀기 보내기 위한 증폭 장치이다. 지금은 다른 네트워크 장비에 기본적으로 리피터 기능이 탑재

heisyoung.tistory.com

 

 

 

 

메모

더보기

계층형 모델 (OSI 7Layer)

- 통신 장비들끼리 호환되도록 표준을 만든것

- 데이터가 전달되기위한 과정을 계층화 (ISO, DoD)

- 7단계중 한 곳에 이상이 생기면 다른 단계의 장비나 소프트웨어를 건들지 않아도 고칠 수 있다

- 복잡도를 줄이고 모듈화를 통한 기술발전, 호환성, 상호독립성

- 이 규칙을 따라야 네트워크 장비로서 다른 장비와 상호작용 가능

 

계층별 PDU(Process Data Unit)

1계층 - 비트

2계층 - 프레임

3계층 - 패킷

4계층 - 세그먼트

 

 

어플리케이션층에서 만들어진 data가

tcp udp 정보를 담은 세그먼트가 되고,

ip정보가 담긴 헤더가 붙은 패킷이 되고,

패킷의 정보에 이더넷 프로토콜의 정보를 담아서 프레임이되고

이 프레임이 전기적 신호로 전달됨

 

인캡슐레이션

디캡슐레이션

 

 

Encapsulation / Decapsulation

- 어플리케이션에서 만들어진 데이터가 해당 디바이스에서 네트워크를 통해 전달되는 과정

- 각 계층에서 동작하는 프로토콜별로 정보(헤더)가 추가되거나 벗겨지는 과정

 

 

어플리케이션

프레젠테이션

세션

...

 

내려가며 헤더가 붙음 -> 인캡슐레이션

이 헤더를 하나씩 떼어가며 정보를 읽는것 -> 네트워킹

 

 

어플리케이션 - 데이터 생성

- 구글검색

 

트랜스포트 - 세그먼트 생성 (세그먼트 = 포트정보+데이터)

- 디포트 : http이기에 80

- 소스포트

- 데이터

 

네트워크 레이어 - 패킷 생성 (패킷 = 세그먼트 + ip정보)

- dip(dns를 통해서 google.com의 ip를 획득하는 과정)

- 소스ip(내 ip)

- 데이터(세그먼트)

 

데이터링크 레이어 - 프레임 생성 (프레임 = 이더넷헤더 + 세그먼트)

- 이더넷헤더 추가

- dMAC(나와 연결된 같은 네트워크에서 어떤놈이 이 데이터를 받을지) (넥스트 홉)

- 소스MAC(내 기기의 MAC))

- 세그먼트

 

넥스트홉ip를 알아내는 과정을 라우팅이라고 함

라우팅 테이블을 룩업함

 

d는 destination(어디로 보낼지에 대한)

dip는 dns를 통해서 

dMAC은 라우팅과 ARP를 통해서

 

라우터는 dip를 보고 어디로 보내야할지를 결정 - 라우팅 테이블을 통해서

 

 

 

+ Recent posts