# CORS
자바 스크립트 -> 웹페이지 -> 서버에 응답요청해도되는지? -> 해도된다 ok신호 -> 응답요청 -> 응답 -> 자바스크립트에 데이터 전송

# HTTP messages 
- HTTP의 특징 : 무상태성 -> HTTP로 클라-서버 통신과정에서 서로의 상태를 확인하지 않음
- 응답 / 요청 두가지의 유형 존재

* 구조
- start line : 항상 첫줄에 위치하며 요청이나 응답상태를 나태냄
- Http headers : 요청을 지정하거나 메세지에 포함된 본문을 설명하는 헤더 집단
- empty line : 헤더 / 본문 사이에 위치(구분)
- body : 요청/응답 과 관련된 데이터나 문서를 포함, 유형에 따라 선택적으로 사용

* 요청 Requests {
Start Line // 3요소
1. 수행할 작업(GET, PUT, POST 등)이나 방식(HEAD or OPTIONS)을 설명하는 HTTP method를 나타냄
2. 요청 대상(일반적으로 URL이나 URI) 또는 프로토콜, 포트, 도메인의 절대 경로는 요청 컨텍스트에 작성
origin 형식 : ?와 쿼리 문자열이 붙는 절대 경로 
absolute 형식 : 완전한 URL 형식으로, 프록시에 연결하는 경우 대부분 GET method와 함께 사용
authority 형식 : 도메인 이름과 포트 번호로 이루어진 URL의 authority component 
asterisk 형식 : OPTIONS 와 함께 별표() 하나로 서버 전체를 표현
3. HTTP 버전에 따라 HTTP message의 구조가 달라짐. 따라서 start line에 HTTP 버전을 함께 입력

Headers : 요청의 Headers는 기본 구조를 따르며 헤더 이름(대소문자 구분이 없는 문자열), 콜론( : ), 값을 입력
- General headers : 메시지 전체에 적용되는 헤더로, body를 통해 전송되는 데이터와는 관련이 없는 헤더
- Request headers : fetch를 통해 가져올 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더를 의미. 
User-Agent, Accept-Type, Accept-Language과 같은 헤더는 요청을 보다 구체화. Referer처럼 컨텍스트를 제공하거나 If-None과 같이 조건에 따라 제약을 추가 가능
-  Representation headers : 이전에는 Entity headers로 불렀으며, body에 담긴 리소스의 정보(콘텐츠 길이, MIME 타입 등)를 포함

Body 
- 모든요청에 Body가 필요하지 않으며  GET, HEAD, DELETE, OPTIONS처럼 서버에 리소스를 요청하는 경우에는 본문이 필요하지 않음
- POST나 PUT과 같은 일부 요청은 데이터를 업데이트하기 위해 사용 
- body의 종류 : 
Single-resource bodies(단일-리소스 본문) : 헤더 두 개(Content-Type과 Content-Length)로 정의된 단일 파일로 구성
Multiple-resource bodies(다중-리소스 본문) : 여러 파트로 구성된 본문에서는 각 파트마다 다른 정보를 지님. 보통 HTML form과 관련
}

* 응답 Response {
Status line : 응답의 첫줄
1. 현재 프로토콜의 버전(HTTP/1.1)
2. 상태 코드 - 요청의 결과를 나타냄 (200, 302, 404 등)
3. 상태 텍스트 - 상태 코드에 대한 설명
- 예시) HTTP/1.1 404 Not Found.

Headers
- General headers : 메시지 전체에 적용되는 헤더로, body를 통해 전송되는 데이터와는 관련이 없는 헤더
- Response headers : 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더로, Vary, Accept-Ranges와 같이 상태 줄에 넣기에는 공간이 부족했던 추가 정보를 제공
- Representation headers : 이전에는 Entity headers로 불렀으며, body에 담긴 리소스의 정보(콘텐츠 길이, MIME 타입 등)를 포함하는 헤더

Body
- bodyd의 종류
Single-resource bodies(단일-리소스 본문) :
길이가 알려진 단일-리소스 본문은 두 개의 헤더(Content-Type, Content-Length)로 정의. 길이를 모르는 단일 파일로 구성된 단일-리소스 본문은 Transfer-Encoding이 chunked 로 설정되어 있으며, 파일은 chunk로 나뉘어 인코딩
Multiple-resource bodies(다중-리소스 본문) : 서로 다른 정보를 담고 있는 body
}


# API 
- 클라이언트 <--> 서버간의 통신 프로토콜
- 웹 애플리케이션 아키텍쳐에서는 HTTP 프로토콜을 사용, 주고받는 메세지는 HTTP message라고 부름
- 서버가 클라이언트에게 리소스를 활용할 수 있도록 인터페이스를 제공하는것을 API라고함 // 메뉴판과 같음


* HTTP API 디자인
- HTTP API는 그저 리소스를 달라는 GET요청이 아닌 사용자관리 API는 사용자 추가요청(CREATE), 삭제요청(DELETE) 가능
- CRUD 각각의 행동과 일치하는 HTTP메서드의 종류가 존재
- GET조회 / POST추가 / PUT(PATCH)갱신 / DELETE삭제가 있음

'Study > 기타' 카테고리의 다른 글

AWS 로컬 < -- > EC2 파일 복사하기  (0) 2023.03.18
AWS 수동배포  (0) 2023.03.18
AWS- IAM 사용자 추가 후 엑세스키 생성  (0) 2023.03.14
AWS EC2 - 배포 자동화를 위한 사용설명  (0) 2023.03.02
Html / Css  (0) 2022.11.17

#프론트엔드

 

서버 클라이언트 : 2티어 아키텍쳐 / 클라이언트 서버 DB : 3티어 아키텍쳐

 

HTML : 웹페이지의 구조 // 10.24

<> 태그의 집합, html->head(title)->body(h1, div(span))

<p> 하나의 문단 표현 / <section> 하나의 구역 표현

<img src = “파일주소”>/<a href = “인터넷주소” target=네이버</a>

<div> 태그 한줄을 차지 / <span> 컨텐츠 크기만큼 차지

<ul><li> 내용(리스트로 표시) / <ol> 넘버링 리스트

<input type= “text” (텍스트 박스) placeholder=“type here”(박스 안의 글)>

<input type= “radio” (체크박스) name=“그룹1”> 옵션1 <- name 같은이름 = 같은그룹

<textarea>줄바꿈 되는 입력폼

<button>로그인</button>

attribute name(속성의 이름) / attribute value(속성의 값) 으로 분류됨

CSS : 웹페이지 스타일(디자인)

<link rel:“stylesheet” href=“파일명“ /> <link>HTML 파일과 다른 파일을 연결하는 목적으로 사용

셀렉터 : id 한가지 요소(# 사용) / class 여러 요소(. 사용)

font-family : 폰트설정 ”“붙여 사용

굵기: font-weight

밑줄, 가로줄: text-decoration / letter-spacing / line-height

text-align : 가로정렬

- Flexbox : 부모를 조정해서 자식들을 한번에 변경할 수 있음

- 진한노랑(자식)/옅은노랑(부모) - 항상 부모요소에게 말을 걸어 자식요소를 조정한다.

x, y축은 고정적이지 않음 / 경우에 따라서 두 개가 바뀔 수 있음

flex-direction : row / column <- 축이 바뀐다

justify-content(가로축) : flex-start / align-items(세로축) : flex-end

정렬 방향 : row -> / column 아래 / row-reverse <- / column-reverse

ex) ul li

JavaScript : 상호작용

 

#CLI 명령어

pwd: 현재 위치를 확인하는 명령어

mkdir: 새로운 폴더를 생성하는 명령어

ls: 폴더나 파일의 목록을 출력하는 명령어

open (macOS): 현재 폴더를 파일 탐색기로 여는 명령어

cd: 폴더에 진입하는 명령어

touch: 새로운 파일을 생성하는 명령어

cat: 파일의 내용을 터미널에 출력하는 명령어

rm: 폴더나 파일을 삭제하는 명령어

mv: 폴더나 파일의 위치를 이동하거나, 이름을 변경하는 명령어

cp: 폴더나 파일을 복사하는 명령어 // 폴더복사 시 반드시 r 포함

sudo: 관리자 권한을 이해할 수 있다.

목록에 .zshrc가 있으면 nano .zshrc를 입력하여 편집창을 엽니다. // 환경변수 영구편집

- 목록에 .bashrc가 있으면 nano .bashrc를 입력하여 편집창을 엽니다.

nano /etc/profile을 입력하여 입력창을 엽니다.

- 참고로, 이 명령어  

서버 클라이언트 : 2티어 아키텍쳐 / 클라이언트 서버 DB : 3티어 아키텍쳐

 

HTML : 웹페이지의 구조 // 10.24

<> 태그의 집합, html->head(title)->body(h1, div(span))

<p> 하나의 문단 표현 / <section> 하나의 구역 표현

<img src = “파일주소”>/<a href = “인터넷주소” target=네이버</a>

<div> 태그 한줄을 차지 / <span> 컨텐츠 크기만큼 차지

<ul><li> 내용(리스트로 표시) / <ol> 넘버링 리스트

<input type= “text” (텍스트 박스) placeholder=“type here”(박스 안의 글)>

<input type= “radio” (체크박스) name=“그룹1”> 옵션1 <- name 같은이름 = 같은그룹

<textarea>줄바꿈 되는 입력폼

<button>로그인</button>

attribute name(속성의 이름) / attribute value(속성의 값) 으로 분류됨

CSS : 웹페이지 스타일(디자인)

<link rel:“stylesheet” href=“파일명“ /> <link>HTML 파일과 다른 파일을 연결하는 목적으로 사용

셀렉터 : id 한가지 요소(# 사용) / class 여러 요소(. 사용)

font-family : 폰트설정 ”“붙여 사용

굵기: font-weight

밑줄, 가로줄: text-decoration / letter-spacing / line-height

text-align : 가로정렬

- Flexbox : 부모를 조정해서 자식들을 한번에 변경할 수 있음

- 진한노랑(자식)/옅은노랑(부모) - 항상 부모요소에게 말을 걸어 자식요소를 조정한다.

x, y축은 고정적이지 않음 / 경우에 따라서 두 개가 바뀔 수 있음

flex-direction : row / column <- 축이 바뀐다

justify-content(가로축) : flex-start / align-items(세로축) : flex-end

정렬 방향 : row -> / column 아래 / row-reverse <- / column-reverse

ex) ul li

JavaScript : 상호작용

 

#CLI 명령어

pwd: 현재 위치를 확인하는 명령어

mkdir: 새로운 폴더를 생성하는 명령어

ls: 폴더나 파일의 목록을 출력하는 명령어

open (macOS): 현재 폴더를 파일 탐색기로 여는 명령어

cd: 폴더에 진입하는 명령어

touch: 새로운 파일을 생성하는 명령어

cat: 파일의 내용을 터미널에 출력하는 명령어

rm: 폴더나 파일을 삭제하는 명령어

mv: 폴더나 파일의 위치를 이동하거나, 이름을 변경하는 명령어

cp: 폴더나 파일을 복사하는 명령어 // 폴더복사 시 반드시 r 포함

sudo: 관리자 권한을 이해할 수 있다.

목록에 .zshrc가 있으면 nano .zshrc를 입력하여 편집창을 엽니다. // 환경변수 영구편집

- 목록에 .bashrc가 있으면 nano .bashrc를 입력하여 편집창을 엽니다.

nano /etc/profile을 입력하여 입력창을 엽니다.

- 참고로, 이 명령어서버 클라이언트 : 2티어 아키텍쳐 / 클라이언트 서버 DB : 3티어 아키텍쳐

 

HTML : 웹페이지의 구조 // 10.24

<> 태그의 집합, html->head(title)->body(h1, div(span))

<p> 하나의 문단 표현 / <section> 하나의 구역 표현

<img src = “파일주소”>/<a href = “인터넷주소” target=네이버</a>

<div> 태그 한줄을 차지 / <span> 컨텐츠 크기만큼 차지

<ul><li> 내용(리스트로 표시) / <ol> 넘버링 리스트

<input type= “text” (텍스트 박스) placeholder=“type here”(박스 안의 글)>

<input type= “radio” (체크박스) name=“그룹1”> 옵션1 <- name 같은이름 = 같은그룹

<textarea>줄바꿈 되는 입력폼

<button>로그인</button>

attribute name(속성의 이름) / attribute value(속성의 값) 으로 분류됨

CSS : 웹페이지 스타일(디자인)

<link rel:“stylesheet” href=“파일명“ /> <link>HTML 파일과 다른 파일을 연결하는 목적으로 사용

셀렉터 : id 한가지 요소(# 사용) / class 여러 요소(. 사용)

font-family : 폰트설정 ”“붙여 사용

굵기: font-weight

밑줄, 가로줄: text-decoration / letter-spacing / line-height

text-align : 가로정렬

- Flexbox : 부모를 조정해서 자식들을 한번에 변경할 수 있음

- 진한노랑(자식)/옅은노랑(부모) - 항상 부모요소에게 말을 걸어 자식요소를 조정한다.

x, y축은 고정적이지 않음 / 경우에 따라서 두 개가 바뀔 수 있음

flex-direction : row / column <- 축이 바뀐다

justify-content(가로축) : flex-start / align-items(세로축) : flex-end

정렬 방향 : row -> / column 아래 / row-reverse <- / column-reverse

ex) ul li

JavaScript : 상호작용

 

#CLI 명령어

pwd: 현재 위치를 확인하는 명령어

mkdir: 새로운 폴더를 생성하는 명령어

ls: 폴더나 파일의 목록을 출력하는 명령어

open (macOS): 현재 폴더를 파일 탐색기로 여는 명령어

cd: 폴더에 진입하는 명령어

touch: 새로운 파일을 생성하는 명령어

cat: 파일의 내용을 터미널에 출력하는 명령어

rm: 폴더나 파일을 삭제하는 명령어

mv: 폴더나 파일의 위치를 이동하거나, 이름을 변경하는 명령어

cp: 폴더나 파일을 복사하는 명령어 // 폴더복사 시 반드시 r 포함

sudo: 관리자 권한을 이해할 수 있다.

목록에 .zshrc가 있으면 nano .zshrc를 입력하여 편집창을 엽니다. // 환경변수 영구편집

- 목록에 .bashrc가 있으면 nano .bashrc를 입력하여 편집창을 엽니다.

nano /etc/profile을 입력하여 입력창을 엽니다.

- 참고로, 이 명령어

'Study > 기타' 카테고리의 다른 글

AWS 로컬 < -- > EC2 파일 복사하기  (0) 2023.03.18
AWS 수동배포  (0) 2023.03.18
AWS- IAM 사용자 추가 후 엑세스키 생성  (0) 2023.03.14
AWS EC2 - 배포 자동화를 위한 사용설명  (0) 2023.03.02
HTTP  (1) 2022.11.30

# 어노테이션

* 표준 애너테이션 : 특정 프로그램을 위한 주석
- @키워드를 붙여서 사용
- 오버라이딩 시 오타 방지목적 // @Overriding
- 관련경고 억제 // @SuppressWarnings({"deprecation", "unused", "null"}) 
- 함수형 인터페이스의 선언되었는지 확인 // @FunctionalInterface

* 메타 애너테이션 : 애너테이션을 위한 애너테이션, 적용대상 또는 유지기간을 정의
- @Target : 적용할 대상 지정
- @Documented :  javadoc으로 작성한 문서에 포함되도록 하는 애너테이션 설정
- @Inherited :  하위 클래스가 애너테이션을 상속 / 하위 클래스도 상위 클래스에 붙은 애너테이션들이 동일하게 적용
- @Retention : 애너테이션의 지속 시간을 결정
- @Repeatable : 애너테이션을 여러 번 붙일 수 있도록 허용 // @Repeatable(Works.class) , @Work("코드 업데이트")

* 사용자 정의 애너테이션
- @interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다. 
     타입 요소명(); } // 애너테이션 요소를 선언

# 람다식


* 람다식 : 단 하나의 추상메서드만 정의되어야함
- 메서드를 좀더 간단하고 편리하게 표현하기 위해 고안된 문법요소
- (매개변수 인자) -> { 수행기능 식 정의 / return 생략가능 }
- 실행문이 하나만 존재할 때 중괄호 생략 가능
- 매개변수 타입을 쉽게 유추할 수 있는경우 매개변수 타입 생략 가능 // 많은 경우 유추가 쉬워 대부분 생략 가능
- 람다식은 객체이며 익명클래스라 할 수 있음
- 람다식과 인터페이스의 메서드가 1:1로 매칭되어야함
ExampleFunction exampleFunction = (num1, num2) -> num1 + num2
System.out.println(exampleFunction.sum(10,15))
@FunctionalInterface // 컴파일러가 인터페이스가 바르게 정의되었는 지 확인할 수 있도록
interface ExampleFunction {
public abstract int sum(int num1, int num2); }

- 클래스 :: 메서드 // 정적메서드 참조
- 참조변수 :: 메서드 // 인스턴스 메서드
- IntBinaryOperator operato = Math :: max; //메서드 참조
- 클래스 :: new // 생성자 참조
 Function<String, Member> function1 = Member::new;
    Member member1 = function1.apply("kimcoding");



# 스트림: 컨베이어벨트 처럼 다양한 데이터소스를 통합된 방식으로 핸들링 하기 위함
- 컬렉션들은 모두 .stream 호출 가능
- 사용 예제  Intstream stream = Arrays.stream(arr).forEach(n->n);
- 스트림 인터페이스 안에 다양한 메서드들이 이미 만들어져 있음

* IntStream 인터페이스 // 숫자와 관련된 경우 권장
- sum 과 average 사용가능

* 중간연산
- filter() : 추출 // ex 길이가 5이상인 요소
- map() : 변화 // 객체가 가지고있는 get이나 set등을 호출할 때 사용
- sorted() : 정렬
- .peek() 주로 디버깅할때 사용 // .peek(n-> System.out.println(n))
 
* 최종연산
- .forEach() : 내부요소를 하나씩 꺼낼 때 사용
- .count() : 요소의 개수
- sum() :  요소들의 합
- collect : 최종형태 만들어줌 // .collect(Collectors.toList()); <- 최종형태 리스트

 

스트림 아직은 긴가민가  많이 써봐야 알것같다...


'Study > Java' 카테고리의 다른 글

Java - 문자열 3자리마다 콤마찍기 (금액 표기하기)  (0) 2023.03.24
JSON Object 생성 시 한글 (???) 깨지는 현상 해결  (0) 2023.03.22
컬렉션  (0) 2022.11.10
제네릭 / 예외처리  (0) 2022.11.10
다형성 / 추상화  (0) 2022.11.08

# 컬렉션프레임워크 : 자주사용하는 자료구조를 다 구현해놓음



* List : 데이터의 순서가 유지, 중복저장 가능 // Collection인터페이스
- ArrayList, Vector, Stack, LinkedList

* Set : 데이터 순서유지x, 중복저장x // Collection 인터페이스
- HashSet, TreeSet

* Map : 키와 값의 쌍으로 데이터를 저장 / 순서유지x, Key 중복저장x Value 중복저장 가능 
- HashMap, HashTable, TreeMap, properties

* Collection 인터페이스 : List/Set의 공통점을 정의한 인터페이스
- boolean / add(), addAll() // 컬렉션 추가 
- boolean / contains(), containsAll() // 주어진 객체 및 컬렉션 저장여부 리턴
- Iterator / iterator() //컬렉션의 iterator를 리턴
- boolean / equals(Object o) //컬렉션이 동일한지 여부를 확인
- boolean //  isEmpty() 컬렉션이 비어있는지 여부를 확인
- int / size()  //  저장되어 있는 전체 객체 수를 리턴
- void / clear()  // 컬렉션에 저장된 모든 객체를 삭제
- boolean / remove(Object o) / removeAll(Collection c) // 주어진 객체 및 컬렉션을 삭제하고 성공 여부를 리턴
- boolean / retainAll(Collection c) //  주어진 컬렉션을 제외한 모든 객체를 컬렉션에서 삭제하고, 컬렉션에 변화가 있는지의 여부를 리턴
- Object[] / toArray() //  컬렉션에 저장된 객체를 객체배열(Object [])로 반환
- Object[] / toArray(Object[] a) //  주어진 배열에 컬렉션의 객체를 저장해서 반환


* List<E> : 객체를 저장하면 자동으로 인덱스 부여, 검색/추가/삭제 등 기능제공
- add(int index, Object element)// 주어진 인덱스에 객체를 추가
- addAll(int index, Collection c)// 주어진 인덱스에 컬렉션을 추가
- set(int index, Object element)// 주어진 위치에 객체를 저장
- get(int index)// 주어진 인덱스에 저장된 객체를 반환
- indexOf(Object o) / lastIndexOf(Object o)// 순방향 / 역방향으로 탐색하여 주어진 객체의 위치를 반환
- listIterator() / listIterator(int index)// List의 객체를 탐색할 수 있는ListIterator 반환 / 주어진 index부터 탐색할 수 있는 ListIterator 반환
- subList(int fromIndex, int toIndex)// fromIndex부터 toIndex에 있는 객체를 반환
- remove(int index) // 주어진 인덱스에 저장된 객체를 삭제하고 삭제된 객체를 반환
- remove(Object o)// 주어진 객체를 삭제
- sort(Comparator c)// 주어진 비교자(comparator)로 List를 정렬


* ArrayList<String> arrayList = new ArrayList<>();  : 객체만 저장할 수 있음 / 스스로 크기를 늘려줌 // 배열타입
- arrayList.add("Hello"); // 문자열 추가
- arrayList.get(0); // 첫번째 추가된값 리턴
- for(String el : arrayList) sout("el = " +el); // 배열 순회
- ArrayList.clear() // 담겨있는 모든 객체 삭제

* LinkedList : 데이터를 효율적으로 추가/삭제/변경하기위해 사용
- 배열과 달리 불연속적으로 존재, 데이터끼리 연결되어있음
- 배열처럼 데이터를 이동하기 위해 복사할 필요 없어 처리속도가 훨씬 빠름

* ArrayList / LinkedList 차이
- 데이터의 잦은 변경이 예상된다면 LinkedList 사용
- 데이터의 개수가 변하지 않는다면 ArrayList사용 // 데이터 검색이 비교적 빠름
 

* Iterator : 컬렉션에 저장된 요소들을 순차적으로 읽어오는 역할

- hasNext()// 읽어올 객체가 남아 있으면 true를 리턴하고, 없으면 false를 리턴
- next()// 컬렉션에서 하나의 객체를 읽어옵니다. 이 때, next()를 호출하기 전에 hasNext()를 통해 읽어올 다음 요소가 있는지 먼저 확인
- remove()// next()를 통해 읽어온 객체를 삭제합니다. next()를 호출한 다음에 remove()를 호출


-  사용법

ArrayList<String> list = ...;  
Iterator<String> iterator = list.iterator(); // 해당 컬렉션과 같은 타입이어야함(String)
while(iterator.hasNext()) {     // 읽어올 다음 객체가 있다면 
String str = iterator.next(); }// next() 를 통해 다음 객체를 읽어옵니다. 

- Iterator 사용없이 for-each문으로 대체 가능
ArrayList<String> list = ...;
for(String str : list) {




*Set<E> : 중복을 허용하지 않고 저장순서를 유지하지 않는 컬렉션

- boolean / add(Object o)// 주어진 객체를 추가하고, 성공하면 true를, 중복 객체면 false를 반환합니다.
- boolean / contains(Object o)// 주어진 객체가 Set에 존재하는지 확인합니다.
- boolean / isEmpty()// Set이 비어있는지 확인합니다.
- Iterator / Iterator()// 저장된 객체를 하나씩 읽어오는 반복자를 리턴합니다.
- int / size()// 저장되어 있는 전체 객체의 수를 리턴합니다.
- void / clear()// Set에 저장되어져 있는 모든 객체를 삭제합니다.
- boolean / remove(Object o)// 주어진 객체를 삭제합니다.

* HashSet
- iterator을 이용해 요소 출력가능

*TreeSet : 이진탐색 트리형태로 저장 
- 하나의 부모 노드가 최대 두 개의 자식 노드와 연결되는 이진 트리(Binary Tree)의 일종으로, 정렬과 검색에 특화된 자료 구조
- 최상위 노드를 루트라고 함
- 모든 왼쪽 자식의 값이 루트나 부모보다 작고 오든 오른쪽 자식의 값이 루트나 부모보다 큰값을 가짐


* Map<K, V>
- Entry객체는 키와 값을 각각 Key 객체와 Value객체로 저장

- object / put(Object key, Object value) // 주어진 키로 값을 저장합니다. 해당 키가 새로운 키일 경우 null을 리턴하지만, 동일한 키가 있을 경우에는 기존의 값을 대체하고 대체되기 이전의 값을 리턴
- boolean / containsKey(Object key)// 주어진 키가 있으면 true, 없으면 false를 리턴
- boolean / containsValue(Object value)// 주어진 값이 있으면 true, 없으면 false를 리턴
- Set / entrySet()// 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴.
- Object / get(Object key)// 주어진 키에 해당하는 값을 리턴
- boolean / isEmpty()// 컬렉션이 비어 있는지 확인.
- Set / keySet()// 모든 키를 Set 객체에 담아서 리턴
- int /  size()// 저장된 Entry 객체의 총 갯수를 리턴
- Collection / values()// 저장된 모든 값을 Collection에 담아서 리턴
- void / clear()// 모든 Map.Entry(키와 값)을 삭제
- Object / remove(Object key)// 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴

*HashMap  : 많은 양의 데이터를 검색하는데 뛰어난 성능


- boolean / equals(Object o) // 동일한 Entry 객체인지 비교
- Object / getKey()  //  Entry 객체의 Key 객체를 반환
- Object / getValue() // Entry 객체의 Value 객체를 반환
- int / hashCode() // Entry 객체의 해시코드를 반환
- Object / setValue(Object value) // Entry 객체의 Value 객체를 인자로 전달한 value 객체로 교체

 

- 사용법
hashMap.put(key, value);  // 묶여서 엔트리 객체로 저장 / 반환값 Set


- key를 통해 value찾기

Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet(); // iter을 사용하기위해 entrySet 만들기
Iterator<Map.Entry<String, Integer>> iter = entrySet.iterator(); // 만들어진entrySet으로 iter할당
while(iter.hasNext()){ 
      Map.Entry<String, Integer> entry = iter.next();  //이터레이터가 다음걸로 넘어가며 맵 엔트리에 키,값 저장
      if(entry.getKey()== key)result = entry.getValue();} // 저장된 엔트리의 key와 찾는 key가 일치하면 값 담아주기

 



'Study > Java' 카테고리의 다른 글

JSON Object 생성 시 한글 (???) 깨지는 현상 해결  (0) 2023.03.22
애너테이션 / 스트림  (0) 2022.11.15
제네릭 / 예외처리  (0) 2022.11.10
다형성 / 추상화  (0) 2022.11.08
상속 / 캡슐화  (0) 2022.11.07

# 열거형 


* public static final int ~
* enum Season {SPRING, SUMMER, FALL, WINTER} // 순서대로 0,1,2,3
* name()//정의한 열거문자 리턴(배열에서사용) 
- ordinal()//순번출력
- compareTo
- valueOf(String name)//문자열의 열거 객체 리턴
- values()//모든 열거 배열로 리턴

 


# 제네릭

* <T>타입 매개변수 <-- 타입을 지정해주면 그때 결정됌
- public T item; <---이런식으로 쓸 수 있음
- Basket<String> stringBasket = new basket<>(item:"Apple");
- Basket<Integer> integerBasket = new Basket<>(item:369);

* Basket<T extends Flower> // 인스턴스화 할때 Flower 클래스 하위클래스만 지정하도록 or 인터페이스 구현한 클래스만 받도록 제한
- class Basket<T extends Flower & Plant> // 상속받으며 특정인터페이스를 구현한타입으로 지정제한

* 특정 메서드만 제네릭으로 선언도 가능
- public <T> void add(T element)
- 클래스 제네릭 <T>와 메서드제네릭<T>는 다르게 구분 // 동일명이더라도 다르게 구분

*와일드카드 
- <? extends 클래스명>(하위)혹은 <? super 클래스명>(상위)로 사용

- <T extends 클래스명>과 뭐가 다른지 모르겠음...

 

 


# 예외처리

* 모든 예외의 최고 상위클래스 Exception
- 일반 예외클래스 : 모든 Exception클래스들 // 런타임시 발생하는 RuntimeException클래스들 제외
- 실행 예외클래스 : 런타임시 발생하는 RuntimeException클래스들 // 형변환, 배열범위지정, 널포인터오류 등

* 사용법
try{
여기코드실행하고
}
catch (해당에러){
만약 해당에러가 발생하면 여기있는 코드를 실행
println(해당에러)로 확인 가능
}
finally{
에러가 발생 하던 안하던 여기있는 코드 무조건 실행
}

* 에러정보 얻는 방법 3가지
- e.getMessage();  // println과 함께사용
- e.toString() ;  //println과 함께사용
- e.printStackTrace();

* 예외전가 (throw)  : exception이 발생함에 대응할것을 강제함<-- 즉 메서드 내부가 아닌 호출하는 곳에서 try catch를 사용하게함
- void ExampleMethod() throws Exception{} // thow 형식
- 고의적으로 예외를 발생시켜 프로그램 비정상 종료를 방지할때도 사용

'Study > Java' 카테고리의 다른 글

애너테이션 / 스트림  (0) 2022.11.15
컬렉션  (0) 2022.11.10
다형성 / 추상화  (0) 2022.11.08
상속 / 캡슐화  (0) 2022.11.07
필드 / 메서드  (0) 2022.11.03

# 다형성 

* 참조변수의 타입변환 : 사용할 수 있는 멤버의 개수를 조절하는 것
1. 서로 상속관계에 있는 상위 클래스 - 하위 클래스 사이에만 타입 변환이 가능
2. 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형변환 연산자(괄호)를 생략할 수 있다.
3. 반대로 상위 클래스에서 하위 클래스 타입으로 변환(다운캐스팅)은 형변환 연산자(괄호)를 반드시 명시

* 참조_변수 instanceof 타입 
- 리턴값이 true가 나오면 타입변환 가능 false면 불가능
- ex)  Animal cat = new Cat();
        System.out.println(cat instanceof Object); //true

 

 


# 추상화 : 공통점을 뽑아서 외부로 추출 // abstract / interface

*  abstract 
- 추상클래스 : 클래스의 공통된기능을 모아서 상속을 해줄 필요가 있지만 스스로 인스턴스화를 못함
- 추상 메서드 : 추상클래스는 추상 메서드를 가질 수 있음 // 기능구현은 상속받은 이후 오버라이딩 해서 재정의!! <-- 클래스마다 다른 기능구현 가능
- 추상 메서드를 하나 이상 포함해야함

* interface : (implements)
- 인터페이스는 강제로 @override 해줘야함 
- 공통적으로 구현해야할 핵심기능을 정의할때 사용하는듯?
- 추상메서드와 상수만을 멤버로 가질 수 있다.
- 상수를 정의할 때 public static final을 생략할 수 있음 // 자동으로 내부 모든필드 public static final로 정의


* abstract 와 interface차이
-  abstract는 필요한 것만 추상메서드로 만들고 interface는 안에있는 모든 내용을 재정의하여 구현해야함
- 추상클래스 다중상속 불가능 / 인터페이스는 다중적 구현 가능

'Study > Java' 카테고리의 다른 글

애너테이션 / 스트림  (0) 2022.11.15
컬렉션  (0) 2022.11.10
제네릭 / 예외처리  (0) 2022.11.10
상속 / 캡슐화  (0) 2022.11.07
필드 / 메서드  (0) 2022.11.03

# 상속 // extends 키워드

* 부모의 것을 모두 사용할 수 있음 // ex) 클래스 시민, 클래스 서울 extends 시민, 클래스 대전 extends 시민

* 상속보다는 참조를 해서 포함관계를 사용하는 경우가 더 많다. 이것을 판별하는 방법은?
- ~은~이다(IS-A) : 상속관계/  ~은~을 가지고있다(HAS-A) : 포함관계 ex) 근로자는 주소이다 x / 근로자는 주소를 가지고 있다.o

* 메서드 오버라이딩 (재정의)
- 조건 3가지 : 
1. 메서드의 선언부가 상위클래스의 그것과 완전히 일치해야함
2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.

- 상위클래스 타입으로 선언하면 배열로 선언하여 관리할 수 있는 편리성이 있음
// 배열로 한번에 관리하기
Vehicle[] vehicles = new Vehicle[] { new Bike(), new Car(), new MotorBike()};
for (Vehicle vehicle : vehicles) {
vehicle.run();
}
// 출력값
Bike is running
Car is running
MotorBike is running

* Super 키워드
- 상위 클래스의 객체 // super.변수 / this.변수로 구분
- Super()는 상위클래스의 생성자를 호출 
- spuer()는 생성자 안에서만 사용가능하고 반드시 첫줄에 와야함 // 모든 생성자의 첫줄에는 반드시 this() 혹은 super()가 선언되어야함

* 모든객체의 최고 조상 Object클래스 // 컴파일시 아무런 상속을 받지 않는 클래스에 extends Object를 추가함
- 대표적 메서드 : toString(), equals(), hashCode(), wait(), notify()

 

 

# 캡슐화 : 정보은닉에 중점

* import문 : 다른 패키지의 클래스를 사용하기 위해 사용
-  사용법 :  import 패키지명.클래스명; 또는 import 패키지명.*; / package practicepack.test2; <-- import문 없이 사용

* 접근제어자의 접근 제한 범위
- private : 동일클래스에서만 접근 가능
- default : 동일 패키지 내에서만 접근 가능
- protected : 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능
- public : 접근 제한 없음

* getter 와 setter
- private으로 변수 생성하고 public getter/setter 메서드를 통해 데이터 변경 읽어오기

'Study > Java' 카테고리의 다른 글

애너테이션 / 스트림  (0) 2022.11.15
컬렉션  (0) 2022.11.10
제네릭 / 예외처리  (0) 2022.11.10
다형성 / 추상화  (0) 2022.11.08
필드 / 메서드  (0) 2022.11.03

# 클래스 요소 // 상속, 다형성, 추상화, 캡슐화

* 멤버
- 필드 : 클래스 내의 변수 // 속성
- 메서드 : 클래스 내의 함수 // 기능
- 이너 클래스 : 클래스 내부의 또다른 클래스

* 멤버x
- 생성자 : 클래스의 객체를 생성하는 역할

# 객체
* 객체는 속성 / 기능으로 이뤄져 있다. 속성과 기능은 필드/메서드로 정의

* new 키워드로 객체를 생성 // ex Car  bmw= new Car
- new 키워드 사용으로 힙메모리에 저장 // 힙메모리는 동적메모리 / 순차적으로 저장x


* 포인터 연산자 '.' 을 통해 객체의 멤버에 접근이 가능
- 필드, 메서드 호출 가능 // 참조변수명.필드명 / 참조변수명.메서드명()

 
# 필드

* 클래스 변수(static) / 인스턴스 변수 / 지역변수(메서드 안에서만 유효) 세가지로 구분
* 멤버변수 : 클래스변수 / 인스턴스 변수   // 클래스 안에 선언
* 지역변수 : 지역변수    // 메서드 내부 블럭에 선언


* 인스턴스 변수 (힙메모리 저장) <-- 직접 초기화 않해도 강제 초기화
- 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수
- new 생성자()를 통해 인스턴스가 생성될 때 만들어짐 
- 동일한 클래스로부터 생성되지만 객체의 고유한 개별성을 가짐

* 클래스 변수 (ststic 전용 저장공간으로 공유 / 프로그램 실행과 동시에 먼저 메모리 할당)
- 인스턴스를 따로 생성하지 않고도 언제든 클래스명.클래스변수명을 통해 사용이 가능
- 한 클래스로부터 생성되는 모든 인스턴스들이 특정 값을 공유해야 하는 경우 static 키워드 사용

*지역 변수 (스택메모리 저장) <-- 변수 생성시 초기화 해야함
- 메서드가 종료되면 소멸
- 한동안 사용되지 않을 경우 가비지컬렉터가 삭제

* Static 키워드(정적 멤버)
- 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드
- 객체 생성없이 클래스명 . 멤버명 으로 바로 사용가능 // <-- 형태로 사용 권장( 정적멤버 구분)

# 메서드

* 클래스 메서드 -> 클래스 변수 접근가능
* 클래스 메서드 -> 인스턴스변수 접근 불가(x) // static은 실행과 동시에 먼저 생성되는데 인스턴스 변수는 그 이후 생성되기 때문에 오류발생


* 오버로딩 : 같은 메서드 이름 / 매개변수의 개수, 타입이 다름

'Study > Java' 카테고리의 다른 글

애너테이션 / 스트림  (0) 2022.11.15
컬렉션  (0) 2022.11.10
제네릭 / 예외처리  (0) 2022.11.10
다형성 / 추상화  (0) 2022.11.08
상속 / 캡슐화  (0) 2022.11.07

#Git 기초
● Fork : 다른레파지토리 -> 내 레파지토리
● Clone : 내 레파지토리 -> 내컴퓨터
● Commit : 저장
● Push : 리모트 레파지토리에 업로드 // Pull request로 반영여부 요청

● add, commit, push : 온라인 원격 저장소에 업로드하는 과정
● fork, clone : 협업자의 작업물을 나의 로컬에 다운로드 받는 과정
● pull request : 상대 협업자에게 나의 작업 완성물을 취합해달라고 요청하는 과정
● merge : 상대방의 작업물과 나의 작업물을 취합하는 과정입니다.

 

# 사용순서
● ssh키 등록방법 : ssh-keygen 입력 -> at ~/.ssh/id_rsa.pub 입력하여 공개키복사 -> github Setting에 ssh keys등록 

● 명령어
- git add 파일_이름 // git에 해당파일 track(커밋가능)상태로 변경  // git add . 모든파일 커밋
- git rm --cached hello_git.txt // hello_git.txt track삭제
- git status // 상태확인

- git commit -m(요약) "First commit"(커밋 시 입력한 커밋메세지) // 커밋
- git commit -am "커밋메세지" // 한번 커밋된적 있는거 add와 commit 동시에 하기
- git log // 커밋 내역확인

- git restore // 변경 내용 되돌리기

● 리모트 레파지토리 연결 : 레파지토리 new로 생성 -> git remote --v로 연결상태 확인 -> git remote add origin(별칭) '원격_저장소_URL'
// 연결해제는 git remote remove '원격저장소 별칭'
- git push origin(별칭) main // 깃헙 레파지토리로 업로드

- git clone '복사한 URL' // 레파지토리 복사  /  clone한 폴더는 자동으로 해당 레파지토리에 연결

-git reset HEAD^ // 커밋 되돌리기 // git reset HEAD@{'돌아갈번호'}

-git pull '별칭' '브랜치이름' // 처음연결할 경우 --allow-unrelated-histories 붙여야함  <-- 해당내용을 몰라 한참 검색했다

 

● Branch관련
주의사항 : branch관련한것을 하기전에 항상 clone된 파일에서 git pull을 한 뒤에 진행
- git switch -c '브랜치명' / git checkout -c '브랜치명' // 브랜치 생성 및 생성된 브랜치로 변경
- git push origin '브랜치명' // 위에서 생성된 브랜치는 로컬에서만 생성된 것이기 때문에 push를 해야 깃허브에 반영됨

+ Recent posts