제네릭스, 컬렉션 프레임워크, 이진탐색 (항해일지 10일차)

김형준·2022년 5월 18일
0

TIL&WIL

목록 보기
10/45

1. 학습일지


1) ✔클릭! 알고리즘 자바 풀이 ~40번

  • 오늘은 그동안 무지성으로 복붙하기만 했던, 정규식(regex)을 학습했다.
public String solution(String new_id) {
        // 1단계
        new_id = new_id.toLowerCase();
        // 2단계: 대괄호 뒤의 ^ 는 not을 의미한다. 따라서 이거 빼고 다! 라는 뜻
        new_id = new_id.replaceAll("[^a-z0-9\\-_.]*", "");
        // 3단계: {}는 횟수 또는 범위를 나타낸다. 여기에선 .이 2번이상 쓰인 것을 가리킨다.
        new_id = new_id.replaceAll("\\.{2,}", ".");
        // 4단계: ^는 문자의 시작 $는 문자의 끝 |는 or 연산 따라서 시작이. 이거나 끝이. 인것
        new_id = new_id.replaceAll("^[.]|[.]$", "");

        // 5단계: 빈문자열이라면 "a"를 넣어준다.
        if (new_id.equals("")){
            new_id =  "a";
        }

        // 6단계: 16자 이상이라면 15자 까지 substring하고 만약 끝이 .이라면 제거하기.
        if (new_id.length() >= 16){
            new_id = new_id.substring(0,15);
            new_id = new_id.replaceAll("[.]$", "");
        }else if(new_id.length() <= 2){
            // 7단계: 길이가 2자 이하라면 마지막 문자를 길이가 3이 될 때 까지 반복하여 붙여준다.
            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클래스로 리턴받을 수 있다.
  • 오토박싱은 기본형을 객체형으로, 언박싱은 객체형을 기본형으로 바꾸는 것

제네릭 클래스

  • 여러 참조 자료형이 쓰일 수 있는 곳에 특정한 자료형을 지정하지 않고, 클래스나 메서드를 정의한 후 사용하는 시점에 어떤 자료형을 사용할 것인지 지정하는 방식
  • 클래스에서 사용하는 방법
// 다이아몬드 연산자에 T를 extends로 제한하기. T에는 Material의 자식 클래스만 올 수 있다.
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을 상속받기 때문에 Material의 메서드를 사용 가능한 것.
        material.doPrinting();
    }

}
  • 메서드에서 사용하는 방법
// 제네릭 메서드
    // 형식: public_<자료형 매개변수>_반환형_메서드명_(자료형 매개변수){}
    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);

        // 제네릭 메서드를 호출할 때 p1, p2가 <Integer, Double>형으로 선언되어 유추 가능하기 때문에 자료형 유추 가능!
        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년전인데, 처음 읽었을 때와는 받아들이는 정보의 양이 달랐다.
  • 코딩하며 항상 느끼는 것이지만, 언어의 철학과 특징 그리고 문법!을 제대로 이해하지 못하면 절대 좋은 코드를 작성할 수 없다는 것을 다시 한번 깨달았다.
  • 그동안 개념 공부를 미뤄왔던 것을 후회하지만, 그렇다고 재직중에 이만큼 투자하여 학습할 수도 없던 노릇이니, 퇴사까지 한 마당에 한번 원없이 공부해보자! 항해를 발판으로 쑥쑥 커보자~!!😎
profile
BackEnd Developer

0개의 댓글