-
2022-08-02 : JAVATIL ( Today I Learned ) 2022. 8. 2. 11:05
1. 제네릭( Generic )
: 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법
- 제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것
장점
1. 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다
2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다
3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
사용방법
타입 설명 <T> Type <E> Element <K> Key <V> Value <N> Number - 암묵적인 규칙
1. 클래스 및 인터페이스 선언
public class ClassName <T> { ... } public Interface InterfaceName <T> { ... }
public class ClassName <T, K> { ... } public Interface InterfaceName <T, K> { ... } // HashMap의 경우 아래와 같이 선언되어있을 것이다. public class HashMap <K, V> { ... }
2. 제네릭 클래스
// 제네릭 클래스 class ClassName<K, V> { private K first; // K 타입(제네릭) private V second; // V 타입(제네릭) void set(K first, V second) { this.first = first; this.second = second; } K getFirst() { return first; } V getSecond() { return second; } }
- 외부 클래스에서 제네릭 클래스를 생성할 때 <> 괄호 안에 타입을 파라미터로 보내 제네릭 타입을 지정해주는 것
이것이 바로 제네릭 프로그래밍이다.
3. 제네릭 메소드
public <T> T genericMethod(T o) { // 제네릭 메소드 ... } [접근 제어자] <제네릭타입> [반환타입] [메소드명]([제네릭타입] [파라미터]) { // 텍스트 }
- 클래스와는 다르게 반환타입 이전에 <> 제네릭 타입을 선언한다
- 제네릭이 사용되는 메소드를 정적메소드로 두고 싶은 경우 제네릭 클래스와 별도로 독립저인 제네릭이 사용되어야 한다.
4. 제한된 Generic(제네릭)과 와일드 카드
- ? 는 와일드 카드라고 해서 쉽게 말해 '알 수 없는 타입'이라는 의미
<K extends T> // T와 T의 자손 타입만 가능 (K는 들어오는 타입으로 지정 됨) <K super T> // T와 T의 부모(조상) 타입만 가능 (K는 들어오는 타입으로 지정 됨) <? extends T> // T와 T의 자손 타입만 가능 <? super T> // T와 T의 부모(조상) 타입만 가능 <?> // 모든 타입 가능. <? extends Object>랑 같은 의미
- extends T : 상한 경계
- ? super T : 하한 경계
- <?> : 와일드 카드 ( Wild card )
참고 자료 : https://st-lab.tistory.com/153
2. instanceof, Class.isAssignableFrom
instanceof
: 해당 Object가 특정 Class, Interface를 상속하거나 구현 했는지를 boolean type으로 return 해주는 method 이다.
public class Gillog extends Gil { ... } Gillog obj = new Gillog(); // true if (obj instanceof Gil) { ... }
Class.isAssignableFrom
: 특정 Class가 특정 Class, Interface를 상속하거나 구현 했는지를 boolean type으로 return 해주는 method 이다.
// true if (Gillog.class.isAssignableFrom(Gil.class)) { ... }
참고 자료 : https://velog.io/@gillog/Java-instanceof-Class.isAssignableFrom
3. newInstance()
- Class 객체를 이용하면 new 연산자를 사용하지 않아도 동적으로 객체를 생성할 수 있다
- 이 방법은 코드 작성 시에 클래스 이름을 결정할 수 없고 런타임 시에 클래스 이름이 결정되는 경우 유용하게 사용
- newInstance() 메서드는 기본 생성자를 호출해서 객체를 생성하기 때문에 반드시 클래스에 기본 생성자가 존재해야 한다.
- 만약 매개 변수가 있는 생성자를 호출하고 싶다면 리플레션을 사용하여 Constructor을 사용하여 객체를 얻어 newInstance() 메서드를 호출하면 된다.
참고 자료 : https://kdg-is.tistory.com/23
4. 이터레이터(Iterator)
- iterator는 ArrayList, HashSet과 같은 컬렉션을 반복하는 데 사용할 수 있는 객체이다.
- Iterator는 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 것
- 컬렉션 프레임워크 : 데이터를 저장하는 클래스들을 표준화한 설계
- 컬렉션 프레임워크는 아래 그림과 같이 데이터를 저장하는 구조에 따라 3가지 인터페이스로 구성
- Set, List, Map은 어떤 데이터들의 집합체
- Set과 List는 데이터의 그룹 ( Collection )이다.
- Iterator는 이런 집합체로부터 정보를 얻어 낸다.
- Iterator을 쓰게 되면 어떤 컬렉션이라도 동일한 방식으로 접근 가능하여 그 안에 있는 항목들에 접근할 수 있는 방법을 제공
Iterator 메소드
ㆍhasNext() : 읽어올 요소가 남아있는지 확인하는 메소드, 요소가 있으면 true, 없으면 false
ㆍnext() : 다음 데이터를 반환
ㆍremove() : next()로 읽어온 요소를 삭제
Iterator 의 장점
1. 컬렉션에서 요소를 제어하는 기능
2. next() 및 previous() 를 써서 앞뒤로 이동하는 기능
3. hasNext() 를 써서 더 많은 요소가 있는지 확인하는 기능
* 자료구조 중 Set의 경우 인덱스가 없기 때문에 일반 for문을 사용할 수 없지만, for-each문은 사용할 수 있다.
그러나 for-each문으로 자료구조를 돌다가 값을 수정, 삭제해야 해서 수정, 삭제를 수행하는 코드를 넣으면 ConcurrentModificationException이 발생한다.
* 인덱스가 없는 자료구조의 경우 그 안의 데이터를 돌기 위해서 for-each문과 iterator 중 하나의 방법으로 가져올 수 있단 건 알겠다.
참고 자료 :
1. https://thefif19wlsvy.tistory.com/41
2. https://onlyfor-me-blog.tistory.com/319
5. OkHttp
- HTTP는 최신 애플리케이션 네크워크 방식이다. 우리는 현재 주로 HTTP를 통해 데이터와 미디어를 교환한다.
HTTP를 효율적으로 사용하면 리소스를 더 빠르게 로드하고 대역폭을 절약할 수 있다
- OkHttp는 기본적으로 효율적인 HTTP 클라이언트이다
ㆍHTTP/2 지원을 통해 동일한 호스트에 대한 모든 요청이 소켓을 공유할 수 있다
ㆍ연결 풀링은 요청 대기 시간을 줄여준다. ( HTTP/2를 사용할 수 없는 경우 )
ㆍ투명 GZIP은 다운로드 크기를 줄인다
ㆍ응답 캐싱은 반복 요청에 대해 네크워크를 완전히 피한다
장점
1. 인터셉터 처리하는 것이 편하다
ㆍApplication Interceptors : Application과 OkHttp 사이에 Request, Response 정보를 intercept하여 추가적으로 처리
( 예: Request시 추가적인 비즈니스 로직을 공통적으로 수행해야 되는 경우 로그 등 )
ㆍNetwork Interceptors : Network와 OkHttp 사이에 Request, Response 정보를 intercept하여 추가적으로 처리
( 예: Network의 Response 정보를 보고 retry 할지 여부 등.. )
2. 기본설정값 : OkHttp는 강력한 기본값들이 잘 설정되어 있다. 또한 사용자가 내용을 수정할 수도 있다
3. Retofit은 OkHttp위에서 동작한다.
* 즉, OkHttp로 REST API를 호출한다.
참고 자료 :
1. https://velog.io/@yyong3519/OkHttp
6. URL과 URLConnection
- 자바 java.net.URL 클래스를 통해 URL 주소를 인식할 수 있으며, 프로토콜, 도메인, 포트, 경로 등을 지정할 수 있다.
- URL 객체의 getInputStream메서드를 호출해서 URL을 읽어 올 수 있다. 하지만 웹 리소스에 대한 추가정보 혹은 데이터를 써야 한다면 URLConnection 클래스를 사용
1. URL 객체 가져오기
URLConnection conn = url.openConnection();
- HTTP URL일 때 실제 반환받는 객체는 HttpURLConnection의 인스턴스다
2. 필요하면 요청 프로퍼티 설정
conn.setRequestProperty("Accept-Charset","UTF-8,ISO-8859-1");
3. 서버로 데이터 보내기
conn.setDoOutput(true); try(OutputStream out = conn.getOutputStream()) { out에 쓴다? }
4. 응답헤더를 읽으려고 하고 getOutputStream을 호출하지 않았다면
conn.connect(); Map<String,List<String>> headers = conn.getHeaderFields();
- 키가 같은 헤더 필드가 여러개 있을 수 있으므로 키별로 값의 리스트를 얻는다.
5. 응답 읽기
try(InputStream in = conn.getInputStream()){ in에서 읽는다? }
참고자료 :
1. https://mainpower4309.tistory.com/23
2. https://jeong-pro.tistory.com/21
'TIL ( Today I Learned )' 카테고리의 다른 글
2022-08-03 : Spring (0) 2022.08.03 2022-08-02 : Spring (0) 2022.08.02 2022-08-01 : webpack & React (0) 2022.08.01 2022-07-29 : JAVA & Spring (0) 2022.07.29 2022-07-28 : Spring (0) 2022.07.28