추상클래스
: 상속을 통한 다형성 (부모클래스를 상속받아 여러 형태의 "자식클래스의 객체 생성 & 활용 & 메서드 오버라이딩 & type casting)의 구현에 강제성을 부여하기 위한 클래스
상속의 문제점 ➡ 강제성의 부재
상속을 통해 다형성(부모클래스를 상속받아 여러 형태의 자식 클래스를 생성하고 활용함)을 구현하고자 하여도, 하위 클래스에서 메소드 오버라이딩을 구현하지 않으면 다형성을 완벽히 구현할 수 없다.
이 때, 오버라이딩을 구형하지 않는 것이 문법상 문제가 없다는 점을 "강제성의 부재"라고 한다
클래스 생성구문 앞에 abstract 키워드를 붙여서 생성
접근지정자 abstract 리턴값의타입 메소드명(매개변수);
추상클래스 == 추상메서드를 포함한 클래스
: 추상 메서드를 하나 이상 포함하면, 추상클래스라고 부른다.
추상메서드
: 메소드 원형만 존재하고 실재 내용은 없는 메서드
: 메소드 정의만 있고, 메소드의 body(몸체)구현은 없다.
추상클래스는 일반 클래스와 동일하게 일반 멤버변수 일반메서드, 생성자 등을 포함할 수 있다.
단, 추상 메소드를 포함할 수 있는 특징이 추가된 클래스
추상클래스는 상속을 통한 다형성 구현을 위해 생성한다.
추상클래스를 상속받은 자식클래스는 반드시 물려받은 추상메서드를 오버라이드 해야 에러가 발생하지 않는다
➡ 오버라이딩에 강제성 부여
추상클래스는 상속전용으로 만들어졌기때문에 단독으로 객체 생성이 불가능하다.
객체는 만들지 못하지만 참조변수는 생성이 가능하다.
부모 참조변수에 자식 인스턴스를 담을 수도 있다.
추상 메서드 구현의 강제성이 단점이 될 수 있다.
추상 메서드의 개수가 많으면 상속에 부담을 주게 된다.
자식 클래스에서 사용하지 않을 추상메서드라도, 객체 생성을 위해 반드시 구현(overriding)해야 하는 문제점이 있다.
해결법
(자주 사용할 예정인 추상메서드라면)
모든 추상메서드가 구현(오버라이딩)된 Adapter클래스를 생성
그 Adapter 클래스를 상속받아 사용
필요없는 메서드를 강제로 구현(오버라이드)하지 않고 필요한 것만 구현하여 사용할 수 있다.
어댑터 클래스를 상속받은 클래스도 추상클래스의 자식(손자)클래스가 된다.
할아버지 손자 간 다형성을 구현하여 물려주고 오버라이딩된 메서드를 할아버지 레퍼런스가 사용할 수 있다.
인터페이스도 클래스이다. 다만, 제약이 있는 클래스
인터페이스는 멤버필드로 public static final
멤버만 가질 수 있다.
일반 멤버 면수와 일반 멤버메서드를 가질 수 없다.
인터페이스는 멤버메소드로 public abstract 메소드만 가질 수 있다.
추상클래스보다 더 상속을 위해서 만들어진 클래스
다중 상속이 가능
자바 언어에서 제공하는 상속 기능은 단일 상속만을 지원한다.
하나의 클래스는 하나의 부모클래스를 가질 수 있다.
(여러 개의 클래스를 상속할 수 없음)
인터페이스 내에 생성 가능한 멤버들
: 값이 초기화된 static final 변수, 추상 메서드
인터페이스는 멤버필드로 public static final
멤버만 가질 수 있다.
인터페이스는 멤버메소드로 public abstract
메서드만 가질 수 있다.
인터페이스를 implement 한다는 것은 부모 인터페이스에 있는 추상메서드를 자식 클래스에서 내용을 채우고, 더이상 추상메서드가 아닌 완벽한 메서드로 완성한다는 뜻이기도 하다.
그러나 인터페이스들끼리의 상속은 상속 받는 곳도 인터페이스이기 때문에
(아직 implement하기 전이기 때문에)
구현의 implement 의미 보다는 상속 extends의 의미로 물려주는 관계가 가능하다.
인터페이스끼리의 extends는 추상메서드의 override 의무가 면제된다.
또한 인터페이스들끼리는 다중 상속(extends)이 가능하다.
모든 컬렉션 클래스들은 기본적으로 Object 타입을 저장 & 리턴 할 수 있다.
Object 타입을 매개변수로 사용하는 모든 컬렉션클래스들은 타입에 상관없이 저장할 수 있다.
하지만, 저장된 데이터를 반환받는 과정에서 런타임에러가 발생될 수 있다.
즉, Object ➡️ 자식클래스의 타입 : 강제형변환
보통의 컬렉션 프레임웍은 여러타입이 혼용되어 저장은 가능하지만 실제로 혼용되어 저장되는 경우는 거의 없다.
다만, 컬렉션 클래스의 입력, 변환에 관련한 모든 메서드들은 Object 타입을 기반으로 하기 때문에 컬렉션에서 데이터를 인출(.get()) 시에 강제형변환을 해야 하는 불편함이 존재한다.
이러한 문제점을 해결하기 위해서 JDK 1.5 이후에는 제네릭 문법을 지원
데이터의 중복을 허용하지 않고 저장하는 클래스
검색을 위해서 사용되는 클래스
(저장할 때 hash 연산의 결과로 저장하니, 검색할 때도 hash 연산 결과로 검색하여 빠른 검색이 가능)
hash 연산
: 클래스 내에서 유일한 값을 얻어 낼 수 있는 고유 알고리즘연산
중복된 값을 제거하면서 데이터를 저장하기 위해 사용
해쉬세트에는 정렬 메서드가 없음. 따라서 링크드 리스트의 부모클래스인 List 클래스에 전해주고 리스트로 변환해서, Collection의 스태틱 메서드로 정렬한다.
데이터베이스 내부의 키 값을 검색하기 위해서 만들어진 알고리즘을 기반으로 작성된 클래스
검색을 위해서 사용되는 클래스
Key, Value를 저장할 수 있는 클래스
Key 는 중복을 허용하지 않는다.
Value 는 중복을 허용
Hashtable, HashMap 클래스는 put메소드를 사용하여 데이터를 추가,
get메소드에 Key 값을 전달하여 Value를 리턴 받는다
반복문을 이용해서 Hashtable, HashMap에 Value들을 출력하려면,
별도의 객체가 필요하다.
Enumeration 객체
: Enumeration은 열거형 자료형식(인터페이스)이다.
.keySet() -> key값들만 모아서 리스트로 생성
Value값이 중복되어도 Key값이 다르면 데이터 추가
동일한 Key값으로 다른 Value가 입력되는 경우 기존의 Value값이 수정된다.