String[]을 각 String의 n번째 문자 기준으로 정렬하고, n번째문자가 같은경우 사전순으로 정렬해야한다.
정렬이 일어나는 과정에는 반드시 두 요소를 비교할 수 있는 기준이 있어야한다. 따라서 내가 정의한 클래스의 인스턴스들 간의 크기를 비교해줄 수 있게하려면 Comparable 인터페이스를 implement하여, 그 안의 compareTo 메서드를 Override 해주어야한다.
비교하고싶은 객체가 o 라고하자.
o1.compareTo(o2)는 o1이 작을때(왼쪽에있을때) 음수를, o1이 클 때 (오른쪽에있을때) 양수를 리턴해야한다.
String에는 이것이 구현되어있다.
하지만 String을 다른 기준으로 비교하고싶다고 해서 String.compareTo()를 Override할 순 없다. final이기때문에
따라서 이럴 경우 Arrays.sort()나 Collections.sort()에 내가 만든 Comparator를 전달하여 정렬할 수 있다.
cmp를 살펴보면, 먼저 문제에 정의된대로 n번째 인덱스의 character를 비교하고 있다. character는 기본형 변수로 빼기 연산이 가능하고, o1ch가 o2ch보다 앞에와야하면 음수가, 뒤에와야하면 양수가 return된다.
o1ch와 o2ch가 같을 경우, 사전 기준으로 비교해야하기 때문에 String의 compareTo를 사용하여 int를 반환하게 하였다.
이 문제에 정의된 방법 상으로 s1이 s2보다 좌측에 와야하면 음수, 우측에 와야하면 양수를 리턴하는 comparator를 전달하여 정렬하였다.
===> 만약 throws로 처리가 되어있는 메소드를 쓸 때, try-catch문을 사용 안해주면 컴파일 오류가 난다.
<Exception 클래스 구조>
수많은 에러에 대한 것을 추상화하고, 객체로 만들어 주는 것은 어려운 일이다.
위에 나온 에러 대응 프로세스는 언어 설계 차원에서의 대응 프로세스이기도 하기 때문에, 이 문제들을 추상화 해서 객체로 만들어주는 것은 자바 언어에서 지원해준다. 따라서, 현실에서 마주하는 개념이나 이슈들을 객체지향 프로그래밍으로 어떻게 구현하는지에 대한 좋은 예시로서 공부할 수 있다.
==Java의 Throwable Class==
-시작은 모든 객체의 원형인 Object 클래스.
- Throwable Class는 "문제 상황"을 뜻하는 클래스 --> 자식으로 Error와 Exception 클래스가 있다.
- Error와 Exception 클래스는 각각 IOerror 클래스, RuntimeException 클래스와 같이 구분되어 처리된다.
이 대신 Sports를 상속받은 Sportsclimbing을 넣어주면 이것이 부모클래스로 자동 형변환이 일어나면서 Hobby를 생성할 수 있는 것이 다형성이다. 이 때, 자식클래스에서 override한 내용을 가지고 가서 형변환이 일어나기 때문에 결국 들어가는 자식 인스턴스의 속성에 따라 부모클래스의 내용이 바뀌므로, Hobby의 내용이 다양해질 수 있다.
=> 다형성 기능으로 인해서 클래스 객체의 원래 클래스명을 체크할 필요가 있을 수 있다. 이때 사용하는 것이
instance of
대상객체 instance of 클래스이름 ===> boolean을 return해줌. (자기부터 부모클래스들은 다 true를 return)