TIL LIST
1. JAVA
자료구조 & 알고리즘
1-a. Generic
제너릭의 본질은 미완성 클래스이다.
제너릭은 다양한 타입의 객체에 대하여 재사용하는 프로그래밍 기법으로 타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 한다.
•
구조가 동일하다는 전제가 필요
→ 타입만 다르고 코드의 내용이 대부분 일치한다면 코드의 재사용성
•
형 변환 시에 발생할 수 있는 문제들을 사전에 없애기 위해서 만든 것
→ 컴파일 과정에서 타입 체크를 할 수 있다
•
선언 시 클래스 또는 인터페이스 이름 뒤에 <> 부호가 붙고<> 안에 위치하는 타입 파라미터에는 구체적인 타입을 지정해줘야 한다.
제네릭 타입을 선언할 때 클래스 선언 시 <> 안에 어떤 단어가 들어가도 되지만 가독성을 위해 자바에서 정한 규칙은 아래와 같습니다.
•
E : 요소(Element, 자바 컬렉션(Collection)에서 주로 사용됨
•
K : 키
•
N : 숫자
•
T : 타입
•
V: 값
•
S, U, V : 두 번째, 세 번째, 내 번째에 선언된 타입
Class, interface에서 제네릭 타입 파라미터 사용법
ArrayList<String> list = new ArrayList<String>();
Java
복사
Multi-type Parameter
-Generic type을 2개 이상 create 가능
-HashMap도 <K, V>로 Generic type을 사용
HashMap<String,Object> map = new HashMap<String,Object>();
Java
복사
Generic Method
-매개변수 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드
-Generic 클래스가 아니여도 메소드만 Generic 메소드일 수 있음
public <T> Product<T> boxing(T t){...}
Java
복사
// 문제 : 제너릭을 사용해서 중복을 제거해주세요.
class Main {
public static void main(String[] args) {
저장소<Inteer> a저장소1 = new 저장소<Inteer>();
a저장소1.setData(30);
int a = a저장소1.getData();
System.out.println(a);
저장소<Double> a저장소2 = new 저장소<Double>();
a저장소2.setData(5.5);
double b = a저장소2.getData();
System.out.println(b);
저장소<사과> a저장소3 = new 저장소<사과>();
a저장소3.setData(new 사과());
사과 c = a저장소3.getData();
System.out.println(c);
}
}
class Int저장소 {
Object data;
int getData() {
return (int)data;
}
void setData(Object inputedData) {
this.data = inputedData;
}
}
class Double저장소 {
Object data;
double getData() {
return (double)data;
}
void setData(Object inputedData) {
this.data = inputedData;
}
}
class 사과 {
}
class 저장소<T> {
Object data;
T getData() {
return (T)data;
}
void setData(T inputedData) {
this.data = inputedData;
}
}
Java
복사
Generic이 왜 필요할까?
Object 타입을 사용하면 되지 않을까라고 생각이 들 수 있지만 Object를 사용할 경우 데이터를 넣을 땐 편할지 몰라도 데이터를 뺄 겨우엔 명시적으로 형변환을 해줘야 하기때문에 불편하다! 그것을 해결하는 기술이 바로 Generic이다.
1-b. HashMap
HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다. pair(Key와 Value)로 구성된 Entry객체를 저장하는 자료구조이다. 중복 키를 삽입하려고 하면 element of the corresponding key로 대체된다. 키 인덱스를 사용하여 업데이트, 삭제 등과 같은 작업을 수행하기 쉽다. HashMap 클래스는 java.util 패키지에 위치한다.
•
Java의 HashMap은 like the legacy Hashtable class, 하지만 동기화되지 않는다.
•
null 요소도 저장할 수 있지만 null 키가 하나만 있어야 한다.
•
HashMap<K,V> 로 표시되며 K는 키를, V는 값을 나타낸다.
•
AbstractMap 클래스를 상속하고 Map 인터페이스를 구현합니다.
Map<String, Integer> map = new HashMap<>();
//데이터를 넣을 경우
map.put("영수나이", 1);
//가져올 경우
int data = map.get("영수나이");
//데이터 순회 시
for ( String key : map.keySet() ) {
System.out.println(key + " : " + arr.get(key));
}
Java
복사
ArrayList vs HashMap
해쉬 맵 구현 (TDD)
Testcodes 적용
# 해쉬 맵 구현(TDD)
- 자바 프로젝트 생성, junit 5 라이브러리 불러오기
- src/main/java/com.ll.exam.HashMap.java 파일 생성
- src/test/java/com.ll.exam.AppTest.java 파일 생성
- https://to2.kr/dSe <- 테스트 케이스
- 여기 나와있는 테스트 케이스를 위에서 부터 1개씩 가져와서 클리어 해주세요.
- 순서가 굉장히 중요합니다.
- 다 하신분은 깃허브에 푸시 후 디스코드에 결과 공유 하겠습니다.
- ArrayList는 직접 구현하지 마시고 java.util.ArrayList를 이용해주세요.
- 내부적으로 저장할 때 키를 해싱하지 않아도 됩니다.(이 부분은 신경쓰지 마세요)
- Set 대신 List를 사용하세요.
Java
복사
1-c. 인터페이스
인터페이스는 자바에서 클래스들이 구현해야하는 동작을 지정하는 용도로 사용되는 추상 자료형이다. interface를 이용하여, 개발 코드를 직접 수정하지 않고도, 사용하고 있는 객체만 변경하여 상속을 통한 이점을 누릴 수 있다. 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값을 다양화할 수 있는 장점이 있다.
인터페이스는 그냥 클래스랑 같다
class 클래스이름 implements 인터페이스이름 {
abstract void 말하다(); //abstract는 생략 가능, 객체화 불가능
}
Java
복사
•
추상성 0% ⇒ 사람 is not asbstract
인터페이스는 추상성이 100%, 구상 클래스는 추상이 0%이다.
•
구상성 100%은 구상메소드 밖에 들어가지 못한다.
•
abstract 붙이면 추상성 조절이 가능하다
•
구상 클래스가 많은 것이 좋다!
추상클래스를 만들고 안 쪽은 추상을 최소한으로 줄이는 것 좋다
abstract class 땡땡치킨 {
void 주문하다() {
String 내용 = 고객의_주문을_듣는다();
String 주소 = 고객의_주소를_듣는다();
전화를_끊는다();
주방에_주문을_토스한다(내용);
}
abstract String 고객의_주문을_듣는다();
abstract String 고객의_주소를_듣는다();
abstract void 전화를_끊는다();
abstract void 주방에_주문을_토스한다();
}
class 판교점_땡땡치킨 extends 땡땡치킨 { }
class 오목교점_땡땡치킨 extends 땡땡치킨 { }
Java
복사
자바에서 다중 상속을 막은 이유
뭘 실행해야 할지 알 수 없기에 충돌이 발생하기 때문이다. 이러한 다중 상속의 폐해는 오버라이딩으로 막을 수 있다. (but, 필수는 X)