///
Search
🐊

현지혜

날짜
2022/07/18
태그
잔디
속성
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)