👀 메서드 오버라이딩 VS 메서드 오버로딩
class Person {
void eat() {}
}
class Student extends Person {
void eat() {} // 오버라이딩
void eat(int i) {} // 오버로딩
void study() {}
void study(int i) {} // 오버로딩
}
메서드 오버라이딩
- 조상으로부터 상속받은 메서드의 내용 변경
- 접근 제어자는 조상 클래스의 메서드보다 같거나 넓어야 함
- 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없음
메서드 오버로딩
- 기존에 없는 새로운 메서드 추가
- 메서드 이름이 동일하고, 매개변수의 개수나 타입이 다른 메서드
👀 메모리 영역
Method Area
- 클래스에 대한 정보(클래스 데이터) 저장
- 클래스 변수도 함께 생성됨
Call Stack (Execution stack)
- 메서드의 작업에 필요한 메모리 공간 제공
- 메서드가 작업을 마치면 할당되었던 메모리 공간이 반환되어 비워짐
Heap
- 인스턴스가 생성되는 공간
- 인스턴스 변수(instance variable)들이 생성되는 공간
👀 접근 제어자(access modifier)
public > protected > (default) > private
- private : 같은 클래스 내에서만 접근 가능
- default : 같은 패키지 내에서만 접근 가능
- protected : 같은 패키지 내, 다른 패키지의 자손클래스에서 접근 가능
- public : 접근 제한 없음
1. 메서드에 static과 abstract 함께 사용 불가
- static 메서드는 몸통이 있는 메서드에서만 사용 가능하기 때문
2. 클래스에 abstract와 final 동시에 사용 불가
- 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이며,
abstract는 상속을 통해 완성되어야 한다는 의미가 모순됨
3. abstract 메서드의 접근 제어자로 private 불가
- abstract 메서드는 자손클래스에서 구현해주어야 하는데,
접근 제어자가 private이면 자손클래스에서 접근 불가하기 때문
4. 메서드에 private과 final을 같이 사용할 필요는 없음
- 접근 제어자가 private인 메서드는 오버라이딩될 수 없음
- 이 둘 중 하나만 사용해도 의미가 충분함
👀 List, Set, Map 차이
List
- 순서가 있는 데이터의 집합
- 데이터 중복 허용
- Collection 인터페이스가 조상
- ArrayList, LinkedList, Stack, Vector 등
Set
- 순서가 없는 데이터의 집합
- 데이터의 중복을 허용하지 않음
- Collection 인터페이스가 조상
- HashSet, TreeSet 등
Map
- 키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합
- 순서 없음
- 키는 중복을 허용하지 않고, 값은 중복 허용
- HashMap, TreeMap, Hashtable, Properties 등
👀 컬렉션(Collection)과 스트림(Stream) 차이
컬렉션
- 데이터 소스를 변경함
- 같은 소스를 여러번 처리 가능
- 작업을 외부 반복으로 처리
스트림
- 데이터 소스를 변경하지 않음
- Iterator처럼 일회용
- 작업을 내부 반복으로 처리
👀 제네릭(Generics)
다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능
장점
- 타입 안정성 제공
- 타입 체크와 형변환 생략 가능으로 인한 코드의 간결화