본문 바로가기
Back-end

2023.08.04 TIL

by 신재권 2023. 8. 4.

Java

API

Application Programming Interface의 약자로 애플리케이션에 선언되어 있는 클래스와 메서드에 대한 상세한 설명이 포함된 문서

Object 클래스

자바에서는 기본적으로 아무런 상속을 받지 않으면 Object 클래스를 상속받는다.

만약 다른 클래스 상속을 받고 있으면, 여러 단계로 상속이 가능하기 때문에, 결국은 Object 클래스를 상속 받게 된다.

Object 클래스에 있는 메서드를 통해 클래스의 기본적인 행동을 정의할 수 있기 때문에, 모든 클래스는 Object 클래스를 상속 받는다.

  • clone() : 복사본 리턴
  • equals() : 동일성 확인
  • finalize() : 가바지 컬렉터에 의해 이 메서드가 호출
  • getClass() : 현재 Class 클래스의 객체를 리턴
  • hashCode() : 해시코드 리턴
  • toString() : 객체를 문자열로 표현하는 값 리턴

쓰레드 처리를 위한 메서드

  • notify() : 모니터에 대기하고 있는 단일 스레드를 깨운다.
  • notifyAll() : 모니터에 대기하고 있는 모든 스레드를 깨운다.
  • wait() : 다른 스레드가 현재 객체에 대한 notify() , notifyAll() 메서드를 호출할 때 까지 현재 스레드가 대기하도록 한다.
  • wait(long timeout) : wait()과 동일한 기능, ms 단위로 대기 시간 지정 가능
  • wait(long timeout, int nanos) : ms + 나노초로 정밀한 대기 시간 지정 가능

toString()

실제 Object 클래스에 구현되어 있는 toString() 메서드는 다음과 같다.

getClass().getName() + ‘@’ + Integer.ptoHexString(hashCode())

getClass().getName() 메서드를 호출하면, 현재 클래스의 패키지 이름과 클래스 이름이 나온다.

결국 toString() 메서드도 Object 클래스를 통해 상속 받은 것 이므로, Override를 통해 메서드를 재정의 할 수 있다.

equals()

객체는 == 만으로 같은지 확인이 안되기 때문에 equals()를 사용한다.

==는 기본 자료형에서만 사용한다. 값을 비교하는 것이 아닌 주소값을 비교한다.

기본적으로 Object 클래스에는 hashCdoe() 값을 비교한다.

실제로 객체에 사용할 때는 재정의 해야 한다.

재정의 하여 비교해야 하는 값을 모두 비교한다.

eqauls() 재정의는 다음 조건을 만족해야 한다.

  • null이 아닌 x 객체의 x.equlas(x) 결과는 항상 true
  • null이 아닌 x, y 객체가 x.equals(y) 가 true 라면, y.equals(x)도 반드시 true 여야 한다.
  • null이 아닌 x,y,z 가 있을 때 x.equals(y), y.equals(z) 가 true라면, x.equals(z)도 반드시 true를 리턴해야 한다.
  • null이 아닌 x, y 객체가 변경되지 않는 상황에서는 몇번을 호출하더라도, 항상 값이 같아야 한다.
  • null이 아닌 x 객체의 x.equals(null)은 항상 false 여야 한다.

hashCode()

hashCode()는 기본적으로 객체의 메모리 주소를 16진수로 리턴한다.

즉 어떤 두 객체가 동일하다면, hashCode() 값도 동일해야 한다.

equals() 메서드를 오버라이드 하면 hashCode()도 오버라이드 하여 동일한 결과가 나오도록 만들어야만 한다.

hashCode() 재정의는 다음 조건을 만족해야 한다.

  • 자바 애플리케이션이 수행되는 동안, 어떤 객체에 대해 이 메서드가 호출되면 항상 동일한 int 값을 리턴해주어야 한다.
  • 어떤 두 객체에 대하여 equlas() 가 true 반환시, hashCode() 메서드 호출시 동일한 int 값이 나와야 한다.
  • 두 객체를 equals() 메서드를 사용해 false 반환시, hashCode() int 값이 무조건 달라야 할 필요는 없다. 하지만 서로 다른 int 값을 제공하면 hashtable의 성능을 향상시키는데 도움이 된다.

Network

계층별 데이터를 부르는 방법

애플리케이션의 데이터에는 다양한 프로토콜의 헤더가 추가되어 네트워크 상으로 내보내진다.

네트워크 아키텍처의 계층에 따라 데이터를 부르는 방법이 다르다.

  • 애플리케이션 : 메시지
  • 전송 : 세그먼트(TCP), 데이터그램(UDP)
  • 인터넷 : 패킷, 데이터 그램
  • 네트워크 인터페이스 : 프레임

웹 브라우저의 데이터에 HTTP 헤더를 추가하면 HTTP 메시지가 된다.

HTTP 메시지에 TCP 헤더를 추가하면 TCP 세그먼트가 된다.

TCP 세그먼트에 IP 헤더를 추가하면 IP 패킷이 된다.

IP 패킷에 이더넷 헤더와 FCS를 추가하면 이더넷 프레임이라 부른다.

IP란?

IP(Internet Protocol)은 중요한 프로토콜이다.

IP의 역할은 엔드투엔드 통신을 하는 것이다.

즉, 네트워크 상의 PC에서 다른 PC로 데이터를 전송하는 것이 IP 역할이다

IP 패킷

IP로 데이터를 전송하기 위해 데이터에 IP 헤더를 추가해 IP 패킷으로 만들어야 한다.

IP 헤더에는 여러 정보가 포함되어 있지만, 가장 중요한 것은 IP 주소이다.

IP 주소는 데이터의 출발지와 목적지가 있기 때문이다.

 

IP로 전송하는 데이터란, 애플리케이션 데이터에 애플리케이션 층 프로토콜의 헤더와 전송계층 프로토콜 헤더가 추가된 것이다.

그리고 IP 패킷에는 네트워크 인터페이스층 프로토콜의 헤더가 추가되어 네트워크 내보내진다.

만약 목적지가 다른 네트워크이면 중간에 라우터가 존재한다.

 

출발지 호스트에서 보낸 IP 패킷은 경로에 있는 라우터가 전송해서 최종적으로 목적지 호스트 까지 도달한다. 이것을 라우팅이라한다.

IP 패킷 내부에는 출발지 IP 주소(32비트), 목적지 IP 주소(32비트)를 포함해 총 20 바이트가 된다.

IP 주소

IP 주소란 TCP/IP 에서 통신 상대가 되는 호스트를 식별하기 위한 식별 정보이다.

IP 헤더를 추가해 IP 패킷으로 만든다.

IP 헤더에는 목적지 IP 주소와, 출발지 IP 주소가 지정되어야 한다.

인터페이스에 IP 주소 설정

IP 프로토콜은 호스트의 운영체제에서 동작한다.

호스트 내부에서 인터페이스와 IP 프로토콜 부분을 연관지어 IP 주소를 설정하게 된다.

 

PC 에는 유선랜, 무선랜 등 복수의 인터페이스를 가질 수 있다.

각 인터페이스마다 IP 주소 설정이 가능하다.

 

IP 주소는 호스트 자체가 아닌, 호스트의 인터페이스를 식별한다.

IP 주소 표기

IP 주소는 32비트이므로, 0과 1이 32개 나열된다.

그런 긴 숫자열은 이해하기 어려우므로, 8비트 씩 10 진수로 변환 후 ‘.’을 통해 구분한다.

이러한 표기를 도트형 10진 표기라 한다.

데이터를 전송하는 주소의 차이

IP로 데이터를 전송할 때, 목적지가 몇개든 상관없다.

목적지의 개수에 따라 데이터 전송 방식을 3가지로 구분한다.

유니 캐스트

1:1 데이터 전송을 유니캐스트라고 한다.

PC 등에 탑재되어 있는 인터페이스에는 유니캐스트 IP 주소가 있는데, 유니캐스트 데이터 전송에는 목적지 호스트 유니캐스트 IP 주소를 IP 헤더의 목적지 IP 주소로 지정한다.

같은 데이터를 복수의 주소로 전송하고 싶을 때는 유니캐스트 데이터 전송을 반복하는 것보다, 브로드캐스트와 멀티캐스트를 사용하면 효율적이다.

브로드 캐스트

같은 네트워크 상의 모든 호스트에 완전히 똑같은 데이터를 전송하는 것을 브로드캐스트라 한다.

IP 헤더의 목적지에 브로드캐스트 IP 주소를 지정하면, 같은 네트워크 상의 모든 호스트에 데이터를 전송할 수 있다.

멀티 캐스트

같은 애플리케이션이 동작하는 등 특정 그룹에 포함되는 호스트에 완전히 똑같은 데이터를 전송하는 것을 멀티캐스트라고 한다.

IP 헤더의 목적지 주소에 멀티캐스트 IP 주소를 지정한다.

멀티캐스트 그룹에 포함되어 있는 호스트들은 반드시 같은 네트워크라고 할 수는 없다.

유니캐스트 IP 주소의 구성

호스트에 설정하는 IP 주소는 유니캐스트 IP 주소이다.

TCP/IP 통신의 대부분은 유니캐스트 이다.

 

IP 주소는 네트워크부와 호스트부라는 두 개의 부분으로 구성된다.

사내 네트워크와 인터넷 등은 복수의 네트워크가 라우터 또는 레이어3 스위치로 서로 연결되어 있다.

 

IP 주소의 전반의 네트워크부를 이용해 각 네트워크를 식별한다.

후반부의 호스트 부로 네트워크 내 호스트의 인터페이스를 식별한다,

브로드캐스트 IP 주소

같은 네트워크에 있는 모든 호스트에 일괄적으로 데이터를 전송할 때 이용하는 브로드 캐스트 IP 주소는 32비트가 모두 1인 IP 주소이다.

즉, 255.255.255.255가 브로드캐스트 IP 주소이다.

255.255.255.255 모든 네트워크 인터페이스에 대해 브로드 캐스트를 수행하는 특수한 주소이다.

멀티캐스트 IP 주소

멀티캐스트 IP 주소는 224.0.0.0~ 239.255.255.255 로 범위가 정해져 있다.

이 범위 중 미리 정해져 있는 멀티캐스트 IP 주소가 있다.

224.0.0.2는 같은 네트워크 상의 모든 라우터 라는 그룹이다.

사용자가 자유롭게 그룹을 결정하기 위해서 239로 시작되는 범위를 이용할 수 있다.

서브넷 마스크

IP 주소는 전반의 네트워크부와 후반의 호스트부로 구성된다.

네트워크부와 호스트부의 구분은 고정된 것이 아닌 가변적이다.

32비트 IP 주소의 어디까지가 네트워크부인지 명시한 것이 서브넷 마스크이다.

 

서브넷 마스크는 IP 주소 처럼 32비트이다.

1은 네트워크 부를 나타내며, 0은 호스트 부를 나타낸다.

서브넷 마스크는 반드시 연속한 1과 연속한 0이다. 교대로 나타나는 서브넷 마스크는 없다.

비트의 나열로만은 파악하기 어려우므로 IP 주소처럼 10진수 씩 4자리씩 끊어 표기한다.

또한 , / 뒤에 연속한 1의 개수를 표기하는 경우도 있다. 이 방식을 프리픽스 표기라고 부른다.

서브넷 마스크와 IP 주소

IP 주소가 192.168.1.1이고, 서브넷 마스크가 255.255.255.0 인 것을 192.168.1.1/24 처럼 표기가 가능하다.

비트로 나누어서 보면 다음과 같다.

 

1100 0000.1010 1000.0000 0001.0000 0001 은 192.168.1.1 을 비트로 나눈 것이다.

1111 1111.1111 1111.1111 1111.0000 0000 은 255.255.255.0을 비트로 나눈 것이다.

 

1이 연속하는 부분 가지 네트워크부이고, 0 등장 시점부터 호스트 부이다.

즉 서브넷 마스크에서 1이 24개 연속되므로 192.168.1.1/24 로 나타낼 수 있다.

네트워크 주소와 브로드캐스트 주소

IP 주소 후반 호스트부를 모두 비트 0으로 채우면, 네트워크 자체를 식별하기 위해 이용하는 네트워크 주소가 된다.

호스트부를 모두 1비트로 채우면 브로드캐스트 주소가 된다.

즉 192.168.1.1 의 네트워크 주소는 192.168.1.0이 되고, 192.168.1.255 는 브로드캐스트 주소가 된다.

위 브로드캐스트 주소를 이용하면 192.168.1.0~192.168.1.255 범위의 모든 장치에게 메세지를 브로드 캐스트 한다.

물리적 접속, 논리적 접속

네트워크에 접속할 때는 물리적 접속 단계, 논리적 접속 단계로 나누어져 있다.

TCP/IP 계층으로 말하면, 물리적인 접속은 네트워크 인터페이스 층이고, 논리적인 접속은 인터넷 층이다.

물리적 접속이란 물리적인 신호를 주고받을 수 있게 하는 것이다.

 

즉, 이더넷의 인터페이스에 LAN 케이블을 삽입하거나, 무선 LAN 케이블을 삽입하거나 무선 LAN 액세스 포인트에 접속하거나, 휴대전화 기지국의 전파를 포착하는 등의 일이 물리적 접속이다.

 

물리적 접속 이후에 논리적인 접속으로 IP 주소 설정도 필요해진다.

TCP/IP를 네트워크의 공통언어로 사용하고, IP 주소를 지정하여 통신한다.

IP 주소가 없다면 통신할 수 없다.

 

예를 들어 호스트 IP 주소에 192.168.1.1/24를 설정함으로 써 그 호스트는 192.168.1.0/24인 네트워크 접속해서 TCP/IP를 사용한 통신을 할 수 있다.

 

일반적인 사용자를 위해 DHCP 등의 기술로 IP 주소를 자동으로 설정한다.

LAN 케이블 꽂아 물리적인 접속이 완료되면, 자동적으로 논리적인 접속도 완료된다.

위 두 과정을 거쳐야 네트워크 접속을 하게 된다.

  1. 물리적인 접속 : 인터페이스에 케이블을 연결하는 등 물리적인 신호를 주고받을 수 있게 한다.
  2. 논리적인 접속 : 인터페이스에 IP주소/서브넷마스크를 설정한다.

Linux

컴퓨터 시스템 하드웨어 구성

컴퓨터 시스템 하드웨어 구성은 일반적으로 다음과 같다.

  • 좁은 의미의 컴퓨터 : CPU, 메모리
  • 외부 장치 : 입출력장치(디스플레이, 키보드, 마우스) 저장장치, 네트워크 어댑터

컴퓨터 시스템이 동작할 때 하드웨어는 다음 순서가 반복된다.

  1. 입력 장치 혹은 네트워크 어댑터를 통해 컴퓨터에 처리 요청이 들어온다.
  2. 메모리에 있는 명령을 읽어 CPU에서 실행하고, 그 결괏값을 다시 메모리의 다른 영역에 기록한다.
  3. 메모리의 데이터를 저장장치에 기록 하거나 네트워크 전송, 디스플레이 등을 통해 결괏값을 보여준다.

이러한 순서를 반복해서 사용자에게 필요한 하나의 기능으로 정리한 것을 프로그램이라 한다.

프로그램의 종류

  • 애플리케이션 : 사용자가 직접 사용한다. 오피스 프로그램, 핸드폰 앱 등
  • 미들웨어 : 여러가지 애플리케이션이 공통으로 사용하는 처리를 묶어 애플리케이션의 실행을 도와준다. 웹서버, DB 등
  • OS : 하드웨어를 직접 조작하여 애플리케이션이나 미들웨어의 실행에 필요한 기능을 제공한다.

일반적으로 OS는 여러 가지 프로그램을 프로세스라고 하는 단위로 실행한다.

각 프로그램은 1개 혹은 여러 개의 프로세스로 구성된다.

OS는 여러개의 프로세스를 동시에 실행할 수 있다.

리눅스의 역할(리눅스 = OS)

리눅스의 중요한 역할은 외부 장치를 조작하는 일이다.

리눅스가 없다면 여러 개의 프로세스가 각 디바이스를 조작하는 코드를 작성해야 한다.

위와 같이 실행 가능하지만 다음 단점들이 존재한다.

  • 모든 애플리케이션 개발자가 디바이스의 스펙을 상세히 알아야만 디바이스를 조작할 수 있다.
  • 개별 개발이므로개발 비용이 커집니다.
  • 멀티 프로세스가 동시에 디바이스를 조작할 경우 예상 외의 동작이 발생할 수도 있다

 

위 단점 때문에 리눅스는 디바이스 드라이버라고 하는 프로그램을 통해야만 디바이스를 다룰 수 있다.

리눅스는 디바이스가 같으면 같은 인터페이스로 조작한다.

만약 해킹 목적으로 의도된 프로세스가, 디바이스 드라이버를 통해 디바이스에 접근하는 룰을 깨면, 멀티 프로세스가 동시에 디바이스를 조작하려고 시도하는 상황이 발생한다.

 

리눅스는 위 문제를 피하고자 CPU 기능을 이용하여 프로세스가 직접 하드웨어에 접근 못하도록 차단한다.

즉, CPU에는 커널 모드와 사용자 모드 라는 두 가지 모드가 존재한다.

커널 모드로 동작할 때만 디바이스에 접근이 가능하다.

디바이스 드라이버는 커널 모드로 동작하고, 프로세스는 사용자 모드로 동작한다.

디바이스 조작 외에도 일반적인 프로세스로 실행하는 문제가 되는 기능이 있다.

  • 프로세스 관리 시스템
  • 프로세스 스케줄링
  • 메모리 관리 시스템

 

이러한 처리도 커널 모드에서 동작한다.

위와 같이 커널 모드에서 동작하는 OS의 핵심 부분이 되는 처리를 모아 담당하는 프로그램을 커널이라고 한다.

프로세스가 디바이스 드라이버를 포함한 커널이 제공하는 기능을 사용하려 할 때는 시스템 콜이라고 하는 특수한 처리를 통해 커널에 요청한다.

OS를 커널로 지칭하는 건 아니다. 커널 이외에도 사용자 모드에서 동작하는 다양한 프로그램으로 구성되어 있다.

'Back-end' 카테고리의 다른 글

2023.08.07 TIL  (0) 2023.08.07
2023.08.06 TIL  (0) 2023.08.07
2023.08.02 TIL  (0) 2023.08.02
2023.08.01 TIL  (0) 2023.08.01
2023.07.31 TIL  (0) 2023.07.31