[특징]
- 상속*
- 은닉(캡슐)
- 다형성
- 추상
상속을 위한 문법
| 키워드 | 설명 | 예시 |
| extends | 클래스 상속을 위해 사용 | class 자식 extends 부모 { } |
| implements | 인터페이스 구현을 위해 사용 | class 클래스 implements 인터페이스 { } |
| super | 부모 클래스의 멤버에 접근 | super.부모메서드() |
| super() | 부모 클래스의 생성자 호출 | super(매개변수) |
| this | 현재 객체의 멤버에 접근 | this.멤버변수 = 값; |
| this() | 같은 클래스의 다른생성자 호출 | this(매개변수); |
| final 클래스 | 상속 불가능 클래스 | final class 최종 클래스{ } |
| final 메서드 | 오버라이딩 불가능 메서드 | fianl void 최종메서드( ) { } |
| Oberriding | 부모의 클래스의 메서드를 재정의 | @Overrid void 메서드( ) { } |
은닉을 위한 문법
| 키워드 | 설명 | 예시 | |
| 접근제어자 | protected | 같은 패키지와 자식 클래스에서 접근 가능 | protected int 보호변수; |
| private | 같은 클래스 내에서만 접근 가능 | private int 비공개변수; | |
| public | 어디서든 접근 가능 | public void 공개메서드( ) { } | |
| default(package - private) | 같은 패키지 내에서만 접근 가능 | int 기본변수; | |
| 접근 메서드 |
getter | private 멤버 변수의 값을 반환하는 메서드 | public int getValeu(){ return value; } |
| setter | private 멤버 변수의 값을 설정하는 메서드 | public void setValue(int value){ this.value =value; } |
|
| encapsulation | 데이터와 그 데이터를 다루는 메서드를 하나로 묶음 | ||
다형성 : 부모 클래스의 참조변수를 통해서 자식 클래스의 메서드 호출
- 상속
- 오버라이딩
- 참조 자료형의 형 변환
- 상속관계
- 업캐스팅(큰 자료형)
- 다운캐스팅(작은 자료형 : 강제형변환)
참조 자료형의 형변환
1. 업캐스팅(Upcasting)
하위 클래스의 객체를 상위 클래스 타입으로 변환하는 것이다. 이는 자바에서 암시적으로 이루어지며 별도의 명시적 형변환이 필요하지 않음.
- 업캐스팅 자동으로 발생
- 하위 클래스의 객체는 여전히 해당 클래스의 메서드를 사용할 수 있지만, 상위 클래스의 참조로만 접근 가능
2.다운캐스팅(DownCasting)
상위 클래스의 객체를 하위 클래스 타입으로 변환하는 것. 명시적으로 형변환을 해주어야 하며, 올바르게 캐스팅 되지 않으면 ClassCastException이 발생할 수 있음.
- 다운캐스팅은 명시적으로 형변환을 해주어야 함.
- ClassCastException이 발생할 수 있음
- 다운캐스팅 후 하위 클래스의 메서드난 속성에 접근할 수 있음.
추상 클래스란?
추상 클래스는 구현되지 않은 추상 메서드를 포함할 수 있는 클래스.
일반 클래스와 유사하지만, 추상 메서드가 포함된 클래스는 객체를 직접 생성할 수 없음. 대신, 추상클래스를 상속받은 자식 클래스에서 추상 메서드를 구현하여 객체를 생성할 수 있음.
<추상 클래스의 특징>
- 추상 메서드를 하나 이상 가질 수 있음.
- 객체를 직접 생성할 수 없음.
- 상속을 통해서만 사용됨.
- 추상 클래스는 다른 일반 메서드나 필드도 포함할 수 있음.
인터페이스란?
인터페이스는 메서드의 선언만을 포함하고, 구현은 포함하지 않는 특수한 클래스와 비슷한 구조.
즉, 인터페이스는 메서드의 구체적인 동작을 정의하지 않고, 어떤 클래스가 이 인터페이스를 구현할 때 무조건 해당 메서드들을 구현해야 한다는 규칙을 정해줌.
- 강제적인 구현 : 인터페이스를 구현하는 클래스는 반드시 인터페이스의 메서드를 모두 구현해야 함.
- 다중 상속을 지원 : 클래스에서 다중 상속을 허용하지 않지만, 인터페이스는 여러개를 동시에 구현 가능.
- 코드의 유연성 증가 : 클랫스 간 일관성 유지
<구현>
interface 키워드를 사용하며 선언, 메서드는 구체적인 구현 없이 선언만 함.
interface 이름 {
//추상 메서드(구현 없는 메서드 선언)
반환형 메서드 이름();
}
<인터페이스와 추상 클래스의 차이점>
| 특징 | 인터페이스 | 추상클래스 |
| 메서드 구현 여부 | 모든 메서드는 기본적으로 구현 ❌ | 일부 메서드는 구현 ⭕️ |
| 다중상속 여부 | 여러 인터페이스 동시에 ⭕️ | 단일 클래스만 상속 ⭕️ |
| 필드 | 상수만 선언 가능 | 인스턴스 필드와 상수 선언 가능 |
| 목적 | 클래스 간 공통된 행위 규약 정의 | 클래스 간의 공통된 동작과 상태 정의 |
instanceof
instanceof 연산자는 자바에서 객체가 특정 클래스나 인터페이스의 인스턴스인지 여부를 확인하는데 사용.
즉, 객체의 실제타입을 확인할 수 있는 도구. 주로 형변환 전에 객체가 원하는 타입인지 확인하는 데 사용되어, ClassCastException과 같은 오류를 방지하는 데 유용함.
객체 instanceof 클래스이름
인터페이스 메서드 종류
| 종류 | 호출 방식 | 구현 | 오버라이딩 | 특징 | |
| 추상 메서드 | 인터페이스 구현한 클래스의 객체 | 구현 클래스에서 반드시 구현 | ⭕️ | public, 구현클래스에서 필수적으로 구현 | |
| 디폴트 메서드 | 구현 클래스의 객체 | 인터페이스에서 기본 구현 제공 | ⭕️ | default 키워드 사용, 인터페이스 내에서 기본 구현 제공. 필요에 따라 오버라이딩 가능 |
|
| 정적 메서드 | 인터페이스 이름을 통해 호출 | 인터페이스에서 구현 | ❌ | 인터페이스 자체에서 호출가능, 클래스가 아닌 인터페이스에 속함 | |
| 프라이빗 메서드 | 인터페이스 내에서만 호출 | 인터페이스에서 구현 | ❌ | 인터페이스 내에서 로직을 재사용하기 위해 사용. 외부에서 접근 불가 | |
| 프라이빗 정적 메서드 | 인터페이스 내 정적 메서드에서 호출 | 인터페이스에서 구현 | ❌ | 정적 메서드 간에 공통된 로직을 처리 할 때 사용, 외부에서는 접근 불가. | |
패키지
<목적 & 필요성>
- 클래스 이름 충돌 방지
- 코드의 구조적 관리 : 논리적이고 계층적인 구조로 조직, 대규모 프로젝트에서도 코드를 쉽게 관리하고 탐색할 수 있음.
- 접근 제어 : 같은 패키지 안에 잇는 클래스끼리는 package- private 접근 권한을 가지므로, 패키지를 기준으로 접근을 제한할 수 있음.
package 패키지이름;
public class 이름{
}
import문
패키지에 있는 클래스를 사용하려면 import문을 사용하여 임포트 해야함.
단일클래스 또는 패키지 내의 모든 클래스를 임포트 할 수 있음.
//단일 클래스 임포트
import com.example.project.MainProject;
//패키지 내 모든 클래스 임포트
import com.example.project.*;'Backend > Java' 카테고리의 다른 글
| [java] System/Data/Calendar/Random/Array 클래스 (0) | 2024.10.22 |
|---|---|
| [java]java.lang 패키지 (0) | 2024.10.21 |
| [java]객체 문법, 기본 자료형, 상속성, 은닉성 (1) | 2024.10.17 |
| 김영한 실전 자바 기본편 - 2.기본형과 참조형 (0) | 2024.05.13 |
| 김영한의 실전 자바 기본 - 1. 클래스와 데이터 (0) | 2024.05.08 |