이번 주는 자바의 클래스부터 객체지향의 핵심 개념까지 배운 한 주였다.
+Queue, Stack, Deque까지
이번주는 헷갈렸던 문법이 많이 해결된 느낌이었다.
특히, 클래스(static) 변수와 객체 변수의 사용범위
(객체변수는 객체메서드에서만 접근 가능 , main메서드는 접근 불가[static이기에] -> 사용하려면 객체 만들어서 사용 가능)
그리고, 구현체가 없는 추상클래스 또는 인터페이스는 익명객체 생성시 람다식표현방법(메서드가 1개밖에 없을 경우 가능)
초반에는 솔직히 많이 헷갈렸다.
static이 붙으면(메소드에) 왜 객체 메서드를 못 부르는지
→ static 메서드는 객체를 전제로 하지 않기 때문에
객체가 있어야만 의미가 있는 인스턴스 메서드를
그냥 호출 불가 (객체 생성하여 호출 가능)
메서드에 값 또는 객체를 넘길때 어떻게 다른지?
생성자를 쓰는 이유가 setter랑 뭐가 다른지
인터페이스에서 직접 메서드를 구현해서 사용하는 경우도 있다.(자바8이후로 가능)
ex) myList.sort(Comparator.naturalOrder());
재귀 함수는 어디서 호출되고 언제 돌아오는지 감이 안 왔음
→ 정말 어려웠다. 조합, 순열 함수를 호출하여 어느시점에 끝나는지를 종이와 펜을 통해 직접 써보면서 이해했다. 이걸 눈으로 바로 이해한다고? 하는 생각도 들긴했다.
람다식은 “편한 문법”이라는데, 그래 알겠는데, 왜 가능한지?
(이게 왜 편한 문법인지도 몰랐다.)
람다식과 더불어 정렬기준을 만들때 Comparator 익명객체 생성방법
Collections.sort(myList2, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
if(o1.length()==o2.length()){
return o1.compareTo(o2);
}
return o1.length() - o2.length();
}
});
위 코드에서 Comparator는 compare메소드만을 가지고 있는데 어떻게 compareTo를 사용할 수 있는지?
▶ 예를 들어 Integer 형식을 정렬한다면
sort()의 매개변수 타입은 Comparator 하나뿐!
Integer implements Comparable
↓
Comparator.naturalOrder() -> 자바 8 이후부터는 인터페이스도 ‘구현 코드’를 가짐
↓
(o1, o2) -> o1.compareTo(o2) [Comparable의 compareTo를 그대로 사용]
↓
list.sort(Comparator.naturalOrder())
한문장으로 정리하자면, list.sort는 비교 방법을 Comparator에게 위임하고, Comparator 안에서는 필요하면 Comparable의 compareTo를 직접 호출해서 재사용한 것이다.
자바공부하면서 흥미?!를 느껴본 순간이었다.
자바를 배우는 주차에 들어가면서 복습을 시작했는데, 복습의 중요성을 깨닫다 보니 리눅스와 데이터베이스를 배울때 복습을 안한 후회가 들었다.. (꼭 복습해서 정리하고자 한다.)
예전에는 코드가 돌아가기만 하면 넘어갔다면,
지금은 이 객체가 왜 필요한지,
이 메서드는 누구 갖고 있는게 자연스러운지
왜 이 시점에 생성돼야 하는지 고민을 하나씩 늘리고 있다.
문법 하나를 배워도 “어디에 쓰이는지”를 먼저 생각하고
코드가 왜 이렇게 구성됐는지를 말로 설명할 수 있을 때까지
한 번 더 정리해보려고 한다.
또한, 이해가 애매한 개념은 그냥 넘기지 않고
null, 참조, 다형성처럼 기본이 되는 개념들은 복습을 통해서라도 확실히 정리하고자 한다.
그리고 이 과정을 가능하게 해주신 건
개념을 단순히 알려주는 게 아니라,
계속 질문하게 만들고 생각하게 해주신 강사님의 설명 방식 덕분이라고 느낀다. 항상 감사드린다.