오버로딩: 같은 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것 (🍀)
리턴 타입은 관계 없으나 매개변수의 개수, 타입, 순서가 달라야 한다.
오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의하여 사용하는 것 (🍀)
메서드 헤드라인 앞에 @Override
어노테이션을 작성하며,
메서드의 이름, 리턴 타입, 매개변수의 개수, 타입, 순서가 모두 같아야 한다.
접근 제한자는 부모 메서드와 같거나 더 넓은 범위로만 변경할 수 있다.
하나의 객체가 여러 가지 형태를 가질 수 있는 성질
Java에서는 상속과 인터페이스를 활용하여 다형성을 구현
🔍 다형성이 필요한 이유
1. 부모 클래스나 인터페이스로 다양한 자식 객체를 처리할 수 있어 코드의 재사용성 증가
2. 새로운 기능, 클래스를 추가해도 기존 코드를 수정하지 않아 확장성 증가
3. 코드 변경 시 하나의 부모 타입만 수정하면 되므로 유지보수성 향상
4. 실행 시 객체의 타입에 따라 동작이 달라질 수 있어 유연한 프로그램 설계 가능
부모 클래스의 필드와 메서드를 자식 클래스에서 물려받아 사용하는 것
🔍 상속의 단점
1. 부모 클래스를 변경하면 자식 클래스에도 영향을 미쳐 의존성이 증가
2. 상속 구조가 깊어질수록 코드의 복잡성이 증가해 문제를 추적하기 어려워질 수 있음
3. 부모 클래스의 필드와 메서드가 자식 클래스에서 노출되어 캡슐화 원칙이 깨질 수 있음
4. "is-a" 관계로 설계되어, 잘못 설계된 상속 구조는 확장 및 수정이 어려움
특징 | 상속 | 조합 |
---|---|---|
관계 | "is-a" 관계 | "has-a" 관계 |
유연성 | 부모 클래스에 강하게 의존하여 변경이 어려움 | 독립적인 구성 요소로 유연하게 확장 가능 |
코드 재사용 | 부모 클래스의 기능을 상속 받아 재사용 | 포함된 객체의 기능을 호출하여 재사용 |
캡슐화 | 부모 클래스의 내부 구현이 자식 클래스에 노출 | 캡슐화가 유지되며 수정 시 영향이 적음 |
구조 복잡성 | 상속 구조가 깊어질수록 복잡성 증가 | 독립적인 관계로 상대적으로 간단 |
instanceof
키워드 (🍀)객체가 특정 클래스의 인스턴스인지 확인하는 키워드
클래스 간의 상속 관계나 인터페이스 구현 여부를 확인할 때 주로 사용
🔍 instanceof
키워드 사용 시 문제점
1. 클래스 타입을 코드에 직접 작성하면 코드가 변경되거나
클래스가 추가될 때마다 수정해야 하므로 코드 유지보수성 저하
2. 타입에 따른 별도의 처리를 요구하기 때문에 다형성의 이점이 감소
interface
(🍀)Java에서 클래스가 구현해야 할 메서드의 규격(명세)를 정의하는 추상적인 구조
구현된 메서드를 가지지 않으며 메서드의 선언만 포함한다.
interface
와 Abstract Class
의 차이특징 | 인터페이스 | 추상 클래스 |
---|---|---|
목적 | 클래스가 구현해야 할 규격을 정의 | 공통된 기능을 구현하면서 일부만 추상적으로 정의 |
상속 관계 | 다중 구현 가능 | 단일 상속만 가능 |
메서드 | 모든 메서드는 기본적으로 추상 메서드 | 추상 메서드, 일반 메서드 모두 포함 가능 |
필드 | public static final 필드만 허용 | 모든 종류의 필드 선언 가능 |
🔍 인터페이스와 추상클래스는 언제 사용할까?
인터페이스는 클래스 간의 공통 규칙을 정의하고 여러 클래스가 이를 구현해야 할 때,
추상 클래스는 부모 클래스에서 공통 동작을 구현하고
자식 클래스에서 세부 동작을 확장해야 할 때 사용한다.
final
키워드변수, 메서드, 클래스의 변경을 방지하는 데 사용되는 키워드
1) 변수: 변수를 상수처럼 선언하여 값을 변경할 수 없도록 선언
2) 메서드: 메서드를 재정의(Override)하지 못하도록 설정
final
메서드는 상속 받은 클래스에서 변경할 수 없음3) 클래스: 클래스를 상속 받지 못하도록 설정