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