클래스는 객체의 속성과 동작(메서드)을 정의하며, 실제 인스턴스를 생성.
객체지향 프로그래밍의 기본 단위
클래스는 멤버 변수와 메서드를 모두 가질 수 있고, 메서드의 구체적인 구현을 포함
클래스는 단일 상속
클래스는 객체의 설계도이자, 기능의 구체적인 구현을 담당
객체를 만들기 위한 설계도
일반 클래스 상속: "모든 기능이 구현되어 있고, 오버라이딩은 선택", 객체 직접 생성 가능
추상 클래스는 상속을 통해 기능을 확장하고, 기본 동작이나 공통 속성을 자식 클래스에 제공하기 위해 사용
추상 클래스는 추상 메서드(구현 없는 메서드)와 일반 메서드(구현된 메서드), 멤버 변수, 생성자 등을 모두 가질 수 있음
클래스이기 때문에 단일 상속
추상 클래스는 공통 동작, 속성, 기본 구현을 자식 클래스에 제공하고 코드 재사용에 유리
추상 클래스 상속: "반드시 구현해야 하는 메서드가 있다(강제성)", 객체 직접 생성 불가.
제네릭(Generic)은 클래스나 메서드를 정의할 때 데이터 타입을 미리 정하지 않고, 사용하는 시점에 외부에서 타입을 지정할 수 있게 해주는 기능
타입 안전성 보장: 컴파일 시점에 타입을 검사해, 잘못된 타입 사용을 미리 막아줌
코드 재사용성: 하나의 클래스나 메서드를 여러 타입에 대해 재사용할 수 있어, 코드 중복이 줄고 유지보수가 쉬워짐
제네릭을 쓰지 않을 때 (Object 기반)
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0); // 다운캐스팅 필요
List<String> list = new ArrayList<>();
list.add("hello");
String s = list.get(0); // 캐스팅 불필요