1. 학습일지
- 오늘은 그동안 무지성으로 복붙하기만 했던, 정규식(regex)을 학습했다.
 
public String solution(String new_id) {
        
        new_id = new_id.toLowerCase();
        
        new_id = new_id.replaceAll("[^a-z0-9\\-_.]*", "");
        
        new_id = new_id.replaceAll("\\.{2,}", ".");
        
        new_id = new_id.replaceAll("^[.]|[.]$", "");
        
        if (new_id.equals("")){
            new_id =  "a";
        }
        
        if (new_id.length() >= 16){
            new_id = new_id.substring(0,15);
            new_id = new_id.replaceAll("[.]$", "");
        }else if(new_id.length() <= 2){
            
            while (new_id.length() != 3){
                new_id = new_id.concat(Character.toString(new_id.charAt(new_id.length()-1)));
            }
        }
        return new_id;
    }
2) Java 개념 학습 (Do it Java!)
물리적 / 논리적 동일성
- Object를 비교할 때 
==는 물리적 주소를 기준으로 동일한 지 판단한다. 
- 논리적 동일성을 판단하기 위해선 
.equals()를 오버라이딩하여 기준을 정의해줘야 한다. 
- 알고리즘을 풀며 String을 
==로 판단했을 때 오작동했던 이유를 드디어 알았다.  
- String 클래스에는 이미 
.equals()가 재정의 되어있다. 
- 만약 일반 클래서에서 
.equals()를 오버라이딩하여 재정의 했다면 HashCode() 또한 일치시켜주자! 
String이 불변성이었던 이유
- String class는 private final char[] value; 로 값을 저장한다.
 
- 즉 문자열이 final Charater 배열로 저장되기 때문에 변경 시 새로운 메모리에 값을 할당하는 것이다!
 
Wrapper 클래스
- 기본 자료형을 위한 클래스로, 매개변수 혹은 반환 값이 객체형인 경우 이를 사용한다.
 
- 그 중 Integer class를 살펴보면
 
- 생성자는 두 가지 방식이다. Integer(int value){} / Integer(String s){}
 
- 내부에 private final int value; 변수를 지닌다.
 
- Integer.intValue(): Integer 클래스 내부의 int 자료형 값을 가져오기 위해 사용한다.
 
- Integer.valueOf(): 정수나 문자열을 바로 Integer클래스로 리턴받을 수 있다.
 
- 오토박싱은 기본형을 객체형으로, 언박싱은 객체형을 기본형으로 바꾸는 것
 
제네릭 클래스
- 여러 참조 자료형이 쓰일 수 있는 곳에 특정한 자료형을 지정하지 않고, 클래스나 메서드를 정의한 후 사용하는 시점에 어떤 자료형을 사용할 것인지 지정하는 방식
 
- 클래스에서 사용하는 방법
 
public class GenericPrinter <T extends Material>{
    private T material;
    public void setMaterial(T material){
        this.material = material;
    }
    public T getMaterial(){
        return material;
    }
    public String toString(){
        return material.toString();
    }
    public void printing(){
        
        material.doPrinting();
    }
}
    
    public static <T, V> double makeRectangle(Point<T,V> p1, Point<T,V> p2){
        double left = ((Number)p1.getX()).doubleValue();
        double right = ((Number)p2.getX()).doubleValue();
        double top = ((Number)p2.getY()).doubleValue();
        double bottom = ((Number)p1.getY()).doubleValue();
        double width = right - left;
        double height = top - bottom;
        return width * height;
    }
    public static void main(String[ ] args){
        Point<Integer, Double> p1 = new Point<>(0, 0.0);
        Point<Integer, Double> p2 = new Point<>(10, 10.0);
        
        double rect = GenericMethod.makeRectangle(p1, p2);
        double rect2 = GenericMethod.<Integer, Double>makeRectangle(p1, p2);
        System.out.println(rect);
        System.out.println(rect2);
    }
컬렉션 프레임 워크

- 컬렉션 프레임워크는 크게 Collection interface와 Map interface로 구분된다.
 
- 알고리즘 풀면서 자주 사용했던 자료구조들이다.
 
- 아직 깊게 읽지 않아서 내일 내용 추가 예정!
 
- 이진 탐색은 배열에서 특정 값을 찾을 때, 가운데 인덱스를 기준으로 범위를 좁혀가며 값을 찾는 방식이다.
 
- 순차 탐색의 시간복잡도가 O(N)인 것에 비해, 이진 탐색의 시간복잡도는 O(logN)의 복잡도를 지닌다. (효율적이다!)
 
- 계속해서 범위를 반토막 내기에 정확히는 O(log2N)의 시간복잡도를 지닌다.
 
- 그러나 이진탐색을 쓸 때 전제조건이 있다. 탐색 배열이 일정한 규칙으로 정렬되어 있어야 한다는 점이다.
 
- 내일은 그래서 다양한 정렬 방법론을 학습할 것 같다😅
 
2. 코멘트
- 오늘은 오랜만에 자바 개념서적(Do it 자바)을 읽었다. 이 책을 처음 읽은 건 약 1년전인데, 처음 읽었을 때와는 받아들이는 정보의 양이 달랐다.
 
- 코딩하며 항상 느끼는 것이지만, 언어의 철학과 특징 그리고 문법!을 제대로 이해하지 못하면 절대 좋은 코드를 작성할 수 없다는 것을 다시 한번 깨달았다.
 
- 그동안 개념 공부를 미뤄왔던 것을 후회하지만, 그렇다고 재직중에 이만큼 투자하여 학습할 수도 없던 노릇이니, 퇴사까지 한 마당에 한번 원없이 공부해보자! 항해를 발판으로 쑥쑥 커보자~!!😎