Java
String 클래스
String 클래스는 final로 선언되어 있기 때문에 상속이 불가능하다.
Object 를 상속받고 있고, Serializable, Comparable<String>, CharSequence를 구현한다.
Serializable 인터페이스는 구현해야 하는 메서드가 하나도 없는 인터페이스이다. 이 인터페이스를 구현하면, 해당 객체를 파일로 작성하거나 다른 서버에 전송 가능한 상태가 된다.
Comparable 인터페이스는 compareTo() 라는 메서드가 있다. 이 메서드는 매개 변수로 넘어가는 객체와 현재 객체가 같은지를 비교하는데 사용한다. 이 메서드의 리턴 타입은 int이다. 즉 객체의 순서를 처리할 때 용이하게 사요된다.
CharSequence 인터페이스는 해당 클래스가 문자열을 다루기 위한 클래스라는 것을 명시적으로 나타내는데 사용된다.
String의 생성자
- String() : 비어있는 String 객체 생성, null 로 선언하는 것이 더 효율적이다.
- String(byte[] bytes) : 현재 사용중인 플랫폼의 캐릭터 셋을 사용하여 제공된 byte 배열을 디코딩한 String 객체를 생성
- String(byte[] bytes, Charset charset) : 지정된 캐릭터 셋을 사용하여 지정한 byte 배열을 디코딩
- String(byte[] bytes, int offset, int length) : 현재 사용중인 플랫폼의 캐릭터 셋을 사용하여 배열 일부를 디코딩
- String(byte[] bytes, int offset, int length, Charset charset) : 지정된 캐릭터 셋을 사용하여 byte 배열의 일부를 디코딩한 String 객체를 생성
- String(byte[] bytes, int offset, int length, String charsetName) : 지정한 이름을 갖는 캐릭터 셋을 사용하여 byte 배열의 일부를 디코딩
- String(char[] value) : char 배열의 내용들을 붙여 String 객체 생성
- String(char[] value, int offset, int count) : char 배열의 일부 내용들을 붙여 String 객체를 생성
- String(int[] codePoints, int offset, int count) : 유니코드 코드 위치로 구성되어 있는 배열의 일부를 새로운 String 객체를 생성
- String(String original) : 매개변수로 넘어온 String과 동일한 값을 갖는 String 객체 생성, 다시 말해 복제본 생성
- String(StringBuffer buffer) : 매개변수로 넘어온 StringBuffer 클래스의 문자열의 값과 동일한 String 객체 생성
- String(StringBuilder builder) : 매개변수로 넘어온 StringBuilder 클래스에 정의되어 있는 문자열의 값과 동일한 String 객체 생성
String → byte
String에는 문자열의 값을 byte 배열로 변환하는 getBytes() 메서드가 있다.
- byte[] getBytes()
- byte[] getBytes(Charset charset)
- byte[] getBytes(String charsetName)
잘못된 캐릭터 셋을 지정하면 의도하지 않은 문자가 나온다.
객체 널 체크
객체가 널인지 아닌지는 실행시에만 확인할 수 있기 때문에, null 체크를 해야된다.
String 내용을 비교하고 검색
- int length() : 문자열의 길이를 리턴
- boolean isEmpty() : 문자열이 비어있는지 확인 (문자열의 길이가 0)
- boolean equals(Object anObject) : 같은지 확인
- boolean equalsIgnoreCase(String anotherStr) : 대소문자 구분 x
- int compareTo(String anotherStr) : 순서 비교 (사전순), 매개변수로 넘어온 String 객체가 앞에있으면 양수, 뒤에 있으면 음수 리턴
- int compareToIgnoreCase(String str) : 대소문자 구분 x
- boolean contentEquals(CharSequence cs)
- boolean contentEquals(StringBuffer sb)
String을 리터럴로 초기화하면 Constant Pool에 저장된다. 즉 같은 문자열이면 재사용이 된다. 즉 == 연산을 해도 같은 문자열이면 true 가 반환된다.
특정 조건에 맞는 문자열이 있는지를 확인
- booelan startsWith(String prefix) : 특정 문자열로 시작하는지 확인
- boolean startsWith(String prefix, int toffset)
- boolean endsWith(String suffix)
- boolean contains(CharSequence s) : 특정 문자열을 포함하는지 확인
- boolean matches(String regex) : 정규 표현식
- boolean regionMatchers(boolean ignoreCase, int toffset, String toher, int ooffset, int len)
- booelan regionMatchers(int toffset, String other, int ooffset, int len) : 문자열 중 특정 영역이 매개변수로 넘어온 문자열과 동일한지 확인
- ignoreCase : true 일 경우 대소문자 구분 x
- toffset : 비교 대상 문자열의 확인 시작 위치 지정
- other : 존재하는지를 확인할 문자열을 의미
- ooffset : other 객체의 확인 시작 위치 지정
- len : 비교할 char의 개수를 지정
String 에서 위치를 찾아내기
- int indexOf(int ch)
- int indexOf(int ch, int fromIndex)
- int indexOf(String str)
- int indexOf(String str, int fromIndex)
- int lastIndexOf(int ch)
- int lastIndexOf(int ch, int fromIndex)
- int lastIndexOf(String str)
- int lastIndexOf(String str, int fromIndex)
indexOf() : 앞에서 부터 문자열이나 char 를 찾는다.
lastIndexOf() : 뒤에서부터 찾는다.
char 단위 값 추출
- char charAt(int index) : 특정 위치의 char 리턴
- void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegion) : 매개변수로 넘어온 dst 라는 char 배열 내에 srcBegin 에서 srcEnd 에 있는 char를 저장한다. dst 배열의 시작 위치는 dstBegin 이다.
- int codePointAt(int index) : 특정 유니코드 값을 리턴, char 형변환시 char 출력 가능
- int codePointBefore(int index) :특정 위치 앞에 있는 char의 유니코드 값을 리턴, 리턴 타입은 int 지만, 이 값을 char로 형변환한다면 char 값을 출력할 수 있다.
- int codePointCount(int beginIndex, int endIndex) : 지정한 범위에 있는 유니코드 개수를 리턴
- int offsetByCodePoints(int index, int codePointOffset) : 지정한 index 부터 오프셋이 설정된 인덱스를 리턴한다.
char[] → String
- static String copyValueOf(char[] data) : char 배열에 있는 값을 문자열로 변환
- static String copyValueOf(char[] data, int offset, int count) : char 배열에 있는 값을 문자열로 변환, 단 off-set 위치부터 count까지의 개수만큼만 문자열로 변환
String → char[]
- char[] toCharArray() : 문자열을 char 배열로 변환하는 메서드
문자열의 일부 값을 잘라내는 메서드
- String subString(int begin index)
- String subString(int beginIndex, int endIndex)
- CharSequence subSequence(int beginIndex, int endIndex)
String[] 으로 나누는 메서드
- String[] split(String regex)
- String[] split(String regex, int limit)
문자열을 합치는 메서드, 공백 없애는 메서드
- String concat(String str) : 기존 문자열 + 매개변수 str을 리턴
- String trim() : 공백 제거
내용 교체 메서드
- String replace(char oldChar, char newChar)
- String replace(CharSequence target, CharSequence replacement)
- String replaceAll(String regex, String replacement)
- String replaceFirst(String regex, String replacement)
특정 형식에 맞춰 값을 치환
- static String format(String format, Object… args) : format에 있는 문자열의 내용 중 변환해야 하는 부분을 args의 내용으로 변환
- static String(format(Local l, Strinf format, Object args) : Local 타입의 l에 선언된 지역에 맞추어 출력
- %d : 정수
- %f : 소수
- %s : 문자
대소문자 변환
- String toLowerCase()
- String toLowerCase(Locale locale)
- String toUpperCase()
- String toUpperCase(Locale locale)
기본 자료형 → 문자열
- static String valueOf(type x)
- boolean
- char
- char[]
- char[], int offset, int count
- double
- float
- int
- long
- Object : toString()의 결과
불변 String의 단점 보완
String은 불변한 객체이다.
즉, 한번 만들어지면 더 이상 값을 바꿀수 없다.
StringBuilder는 Thread safe 하지 않고, StringBuffer는 Thread safe 하다.
속도는 StringBuilder가 훨씬 빠르다. Buffer는 동기화 과정이 있기 때문
Network
HTML
웹 페이지를 만드는 HTML 파일의 HT는 HyperText의 머릿글자이다.
하이퍼텍스트는 복수의 문서를 연결해 서로 참조할 수 있는 문서이다.
ML은 Markup Language의 줄임말로, 문서의 구조를 명확히 표현하기 위한 언어라는 뜻이다.
마크업 언어를 이용해 문서의 제목, 헤드라인, 단락, 리스트 등 구조를 명확히 함으로써, 컴퓨터로 문장 구조 분석을 간편하게 할 수 있다.
HTML에서는 태그를 사용해 구조, 링크, 문자 크기 등을 지정 가능하다.
스타일 시트
HTML 태그로 웹 페이지의 외관을 지정할 수 있지만, 스타일 시트를 따로 정의해 복수의 웹페이지를 동시에 변경할 수도 있다.
스타일 시트는 CSS 언어로 사용한다.
CSS를 사용하면 웹페이지 디자인도 간단히 변경할 수 있다.
웹사이트의 주소
웹 사이트를 볼 때는 웹 사이트의 HTML 파일을 다운로드 해서 웹 브라우저로 표시한다.
웹 사이트를 보기 위해 웹 페이지 파일을 지정해야 하는데, 전송받고 싶은 웹 페이지를 지정하는 것이 웹 사이트의 주소이다.
URL
URL은 Uniform Resource Locator의 약자로 https://로 시작한다.
http는 스킴이라 하며, 프로토콜을 나타낸다.
: 뒤에는 파일이 있는 장소를 나타내고, //는 호스트명이다.
웹 서버에서 접속할 때는 호스트명에서 IP 주소로 변환하는 DNS의 이름해석이 필요하다.
호스트명 뒤에는 포트번호가 이어지지만, 대부분 생략한다. 생략한 경우 지정된 스킴에서 프로토콜의 웰노운 포트를 사용한다.
즉, URL은 전송받고 싶은 웹 서버와 그 파일을 나타낸다.
<스킴>://<호스트명>/<경로명>
HTML 파일 전송
웹 사이트를 구성하는 HTML 파일을 전송하기 위해 HTTP(Hyper Text Transfer Protocol)를 이용한다.
즉, 웹 브라우저와 웹 서버 애플리케이션은 HTTP를 이용해 웹페이지 파일을 전송한다.
HTTP는 HTML 뿐 아니라 다양한 종류의 파일을 전송할 수 있다.
HTTP 파일 전송은 HTTP 요청과 응답을 주고받으며 이루어진다.
트랜스포트층의 프로토콜로서 TCP를 이용하므로, HTTP 통신하기전 TCP 커넥션을 맺는다.
HTTP 요청
HTTP 요청을 통해 웹 브라우저에서 웹 서버 애플리케이션으로 파일 전송을 요청한다.
HTTP 요청은 리퀘스트 라인, 메시지 헤더, 엔티티 바디의 세 부분으로 나뉜다.
- HTTP 요청
- 리퀘스트 라인 : 웹 서버에 대한 실제 처리 요청 전달
- 메서드 : 서버에 대한 요청(GET, POST, …)
- URI
- 버전(HTTP 버전)
- 메시지 헤더 : 요청 라인에서 이어지는 여러줄의 텍스트
- 웹 브라우저의 종류, 버전
- 대응하는 데이터 형식
- 엔티티 : POST 로 웹 브라우저에서 데이터를 보낼 때 사용
- 리퀘스트 라인 : 웹 서버에 대한 실제 처리 요청 전달
메시지 헤더와 엔티티 바디 사이에 공백 라인이 있다.
메서드 종류
- GET : URI로 지정한 데이터를 가져온다.
- HEAD : URI로 지정한 데이터의 헤더만 가져온다.
- POST : 서버에 데이터를 보낸다.
- PUT : 서버에 파일을 보낸다.
- DELETE : 서버의 파일을 삭제하도록 요청한다.
- CONNECT : 프록시 서버를 경유에 통신한다.
최종 캡슐화 결과
이더넷 헤더 IP 헤더 TCP 헤더 HTTP 헤더 웹 브라우저의 데이터 FCS
HTTP 응답
HTTP 요청에 대한 응답으로 HTTP 응답을 반환한다.
HTTP 요청과 비슷하게 리스폰스 라인, 메시지 헤더, 엔티티 바디로 구성된다.
- HTTP 응답
- 리스폰스 라인
- 버전 : HTTP 버전
- 상태 코드 : 웹 서버 애플리케이션의 처리 결과
- 설명문 : 상태 코드의 의미를 간단히 보여주는 텍스트
- 메시지 헤더 : 웹 서버 애플리케이션이 더 자세한 정보를 웹 브라우저에 전달하기 위해 이용
- 데이터 형식
- 갱신 날짜
- 엔티티 바디 : 웹브라우저에 돌려보낼 데이터, 주로 HTML 파일
- 리스폰스 라인
메시지 헤더와 엔티티 바디 사이에 공백 라인 존재
상태 코드
- 1xx : 정보, 추가 정보가 있음을 전달
- 2xx : 성공, 서버가 요청을 처리했음을 전달
- 3xx : 리다이렉트, 다른 URI로 다시 리퀘스트하도록 요청
- 4xx : 클라이언트 에러, 요청에 문제가 있어 처리 불가
- 5xx : 서버 에러, 서버쪽에 문제가 있어 처리 불가
최종 캡슐화 결과
이더넷 헤더 IP 헤더 TCP 헤더 HTTP 헤더 웹 브라우저의 데이터 FCS
웹 페이지 내용 커스터마이징
상황에 따라 웹 페이지의 내용을 커스터마이징 하고 싶을 때 HTTP 쿠키를 사용한다.
HTTP 쿠키는 웹 서버 애플리케이션이 웹 브라우저에 특정 정보를 저장해두는 기술
웹 서버 애플리케이션은 웹 브라우저의 요청에 대한 HTTP 응답에 쿠키를 포함하여 보낸다.(헤더에 포함)
웹 브라우저가 쿠키를 받을 수 있으면, 수신한 쿠키를 저장하고, 같은 웹사이트에서 요청을 보낼시 쿠키도 함께 포함된다.
즉, 쿠키를 이용함으로써, 웹 서버는 사용자의 로그인 정보나 사이트 내 웹 페이지 열람 이력을 관리할 수 있고, 커스터마이징도 가능하다.
웹 접속을 대신하는 서버
웹 페이지를 열람할 때 웹 브라우저와 웹 서버 애플리케이션은 서로 통신한다. 이때 프록시 서버를 거치는 경우도 있다.
프록시 서버란 웹 사이트 접속을 대행하는 서버이다.
서버를 프록시 서버로 동작시키려면, 서버에서 프록시 서버 애플리케이션을 실행해야 하고, 웹 브라우저에서 프록시 서버 설정을 할 필요가 있다.
- 클라이언트 PC → URL 입력
- 프록시 서버로 HTTP 요청 보냄
- 프록시 서버에서 URL로 지정된 웹서버에 HTTP 요청을 보냄
- 웹 서버에서 프록시 서버로 HTTP 응답을 보냄
- 프록시 서버에서 클라이언트 PC로 HTTP 응답을 보냄
웹 서버에서 보면 접속하는 것은 프록시 서버이고, 원래 클라이언트는 알 수 없게 된다.
관리자 입장에서의 목적
주로 기업 네트워크에서 프록시 서버를 도입한다.
- 클라이언트 PC의 웹 브라우저에서 어떤 웹 사이트에 접속하는지 확인
- 부정한 웹 사이트 접속 제한 가능 → URL 필터링, 웹 필터링
웹 애플리케이션
웹 브라우저를 유저 인터페이스로 이용하는 애플리케이션을 웹 애플리케이션이라 한다.
웹 브라우저를 유저 인터페이스로 이용하므로, 클라이언트 PC 용 전용 애플리케이션을 개발해 설치하거나 업데이트 등이 필요 없어진다.
즉, 웹 브라우저만 있으면 처리가 가능하다.
처리 자체는 웹 서버가 아닌 애플리케이션 서버를 사용하기도 한다. 또한 데이터베이스 서버와 연계하는 경우도 있다.
애플리케이션
웹 사이트에 접속하기 위해 이용하는 애플리케이션은 웹 브라우저이다.
Chrome, Edge, Safari 등 다양한 웹 브라우저가 있다.
웹 접속의 대전제는 TCP/IP 설정이 바르게 되어 있는 것이다.
웹 브라우저는 특별한 설정은 필요 없지만, 프록시 서버를 이용할 때는 프록시 서버의 IP 주소와 포트 번호를 설정해야 한다.
웹 서버에는 웹 서버 애플리케이션이 필요한데 대표적으로 Apache가 있다.
웹 접속에 이용하는 프로토콜은 HTTP 이다. 또한 전송 계층은 TCP, 인터넷 계층은 IP를 이용한다. HTTP의 웰 노운 포트는 80이고, 네트워크 인터페이스층은 이더넷을 이용한다.
웹 사이트에 접속할 때는 웹 사이트 주소인 URL을 이용한다.
URL로부터 웹 서버의 IP를 구하는 이름 해석을 위해선 DNS 가 필요하다.
DNS와 ARP는 자동으로 수행된다.
즉 HTTP/TCP/IP 이 필요하고, DNS와 ARP가 필요하다.
웹 사이트 접속 흐름
웹 사이트를 볼때는 DNS 이름 해석과 ARP의 주소해석 기능도 동작한다. 또한 TCP로 커넥션도 맺는다.
- 웹 브라우저에 URL을 입력
- URL에 포함된 웹 서버의 호스트명을 DNS 서버에 질의해 웹 서버의 IP 주소를 해석
- 라우터가 DNS 서버 기능을 가진다. 라우터 자체에는 목적지가 되는 웹 서버 IP 주소가 없으므로, 라우터에서 다시 DNS로 질의
- DNS서버에 질의할 때 이더넷의 MAC 주소 구하기 위해 ARP도 실행
- 웹 서버의 IP 주소를 알아내, IP 주소를 지정하여 웹 브라우저와 웹 서버 애플리케이션 간에 TCP 커넥션 확립
- HTTP 요청 및 응답을 주고 받음
요청 및 응답의 크기가 크면 TCP에서 분할하고, 분할된 파일을 조립하여, 웹 브라우저에 내용을 표시하면 사용자는 웹 사이트를 볼 수 있다.
'Back-end' 카테고리의 다른 글
GC (0) | 2023.08.12 |
---|---|
JVM (0) | 2023.08.11 |
2023.08.07 TIL (0) | 2023.08.07 |
2023.08.06 TIL (0) | 2023.08.07 |
2023.08.04 TIL (0) | 2023.08.04 |