추상클래스 vs 인터페이스
공통점
- 추상클래스와 인터페이스 모두 객체 생성이 불가능
- 추상 메서드 구현을 강제화
차이점
- 추상클래스는 다중 상속 불가, 인터페이스는 가능(다중 상속, 다중 구현)
- 추상클래스는 구현부를 가진 메서드 선언 가능
- 인터페이스는 추상메서드만 가능(자바8 이상부터는 default, static 메서드 추가)
- 추상클래스는 모든 접근제어자 가능
- 인터페이스는 public만 가능
- 인터페이스는 설계를 목적, 완전 추상
- 추상클래스는 상속할 객체들의 공통점을 찾아 추상화, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능을 구현할 때 사용(is-a 관계)
- 인터페이스는 다른 부모 클래스를 갖더라도 같은 기능을 가질 때 사용, 상속과 별개로 구현 객체의 같은 동작을 보장(사용설명서)
- 추상클래스는 상속받아서 기능을 이용하고 확장시키는 데 있음
- 인터페이스는 틀만 제공, 구현의 강제화
- 추상클래스는 부모 클래스의 기능을 이용, 확장하기 위해 사용, 단일 상속
- 인터페이스는 해당 인터페이스를 구현한 객체들에게 동일한 동작을 약속하기 위해 사용, 다중 상속
에러, 예외
- 어떤 원인에 의해 오동작 or 비정상적 종료
- 에러: 심각한 문제. 비정상적 종료를 막을 수 없음(디버깅 필요)
- 예외: 코드로 수습 가능한 비교적 약한 것들
- 예외 처리: 예외 발생 시 프로그램의 종료를 막고 실행 유지
- Checked exception: 예외 처리 코드가 없으면 컴파일 안됨
- Unchecked exception(RuntimeException의 하위): 예외 처리 코드 없어도 컴파일 됨
- try-catch로 예외 처리
- getMessage(): 발생된 예외에 대한 구체적 메시지 반환
- getCause(): 원인이 되는 Throwable 객체 or null 반환
- printStackTrace(): 예외가 발생된 메서드가 호출되기까지의 메서드 호출 스택 출력
- 다중 예외 처리 시 순서 유의(상속 관계)
- finally는 예외 발생 유무와 상관없이 진행
- finally에서 자원 반납을 하려면 코드가 많음 → try-with-resource를 통해 해결(자바7 이상)
throws
- 예외 처리 위임
- 예외가 없어지는 것이 아니라, 해당 메서드를 호출한 곳으로 처리를 넘김
- checked exception은 명시적으로 throws 해야 넘어가지만, unchecked exception은 throws가 없어도 자동으로 throws
사용자 정의 예외
- Exception 상속: checked exception
- RuntimeException 상속: unchecked exception
자료구조
- 컴퓨터 과학에서 효율적인 접근 및 수정을 가능케 하는 자료의 조직, 관리, 저장
- 데이터 값의 모임, 데이터 간의 관계, 데이터에 적용할 수 있는 함수나 명령
배열
- 가장 기본적인 자료구조
- 동일한 데이터 타입만 관리 가능
- Object를 이용하면 모든 객체 참조가 가능하나 동적 바인딩으로 가져올 때 실제 객체의 타입 확인 필요
- 제네릭: 컴파일 타임에 저장하려는 타입 제한 → 형변환의 번거로움 제거
- Iterable → Collection → List, Set // Map
List
- 순서가 있는 데이터 집합
- 중복 허용
- 내부적으로 데이터 추가 시 새로운 배열을 복사해서 반환함
- ArrayList도 배열의 장단점을 그대로 가져감
- 장점
- 단점
- 크기를 변경할 수 없어 추가 데이터를 위해 새로운 배열을 만들고 복사해야 함
- 비 순차적 데이터의 추가, 삭제에 많은 시간이 걸림
- LinkedList: 각 요소를 Node로 정의하고 Node는 다음 요소의 참조값과 데이터로 구성
- ArrayList 삭제 시 인덱스 감소에 주의 → 역방향으로 진행하여 해결
Set
- 순서 없이 주머니에 구슬을 넣는 형태
- 중복 허용하지 않음 → 어떤 데이터인지 알 수 없음(순서가 없으므로)
Map
- Key와 Value를 하나의 Entry로 묶어서 데이터 관리
- Key: Object 형태로 데이터 중복을 허락하지 않음
- Value: Object 형태로 데이터 중복이 허락됨
정렬
- Collection 들만 정렬 가능
- List 계열, SortedSet의 자식 객체, SortedMap의 자식 객체(Map 기준)
- Collections의 sort()를 이용하여 정렬
- Comparable, Comparator를 이용하여 정렬
- 클래스와 관계된 정렬(Comparable 구현) vs 외부에서 정의(사용자 정의, Comparator)