단일다중상속
fianl 클래스
* 클래스에 final 키워드를 지정하여 선언하면 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스가 된다
Object 클래스
- object는 최상위 부모 클래스다
-
오버라이팅
- 부모클래스로부터 상속받은 메서드의 내용을 재정의 하는 것
예를 들어, object에게 상속받는 String 클래스 : 둘 다 equals를 구현하고 있지만 조금씩 다르다
super와 super()
super
- 부모 클래스의 멤버를 참조할 수 있는 키워드
부모를 지칭하는 키워드다 ( 나를 지칭할 수 있는 건 this와 같은)
public void setCarInfo(String model, String color, double price) {
super.model = model; // model은 부모 필드에 set
super.color = color; // color는 부모 필드에 set
this.price = price; // price는 자식 필드에 set
}
예시
다형성
자동 형변완이 완료 된것만 돌아갈 수 있는 것
*instanceof
* 추상클래스
클래스는 설계또 추상클래스는 미완성된 설계도
즉 부모는 완성시키지 않은 메소드를 갖고 있다 자식이 extends 해서 이제서야 완성시킴
텅 비어있는 메소드 자식들이 받아서 완성시켜서 쓰는
▼ 추상화
public abstract class 추상클래스명 {
}
- 추상 클래스는 자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있다.
● 추상메서드
아직 구현되지 않는 미완성된 메서드
추상메서드 선언
public abstract class 추상클래스명 {
abstract 리턴타입 메서드이름(매개변수, ...);
}
추상클래스 상속
추상메서드는 extends 키워드를 사용하여 클래스에서 상속
public class 클래스명 extends 추상클래스명 {
@Override
public 리턴타입 메서드이름(매개변수, ...) {
// 실행문
}
}
**상속받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야 합니다. (인터페이스에 없는 특징)
인터페이스
● 두 객체를 연결해주는 다리역할
인터페이스 선언
public interface 인터페이스명 {
}
접근 제어자 지정
인터페이스 구성
- 모든 메서드는 public abstract이어야 합니다.
- 생략 가능합니다. (static 메서드와 default 메서드 예외)
- 생략되는 제어자는 컴파일러가 자동으로 추가해줍니다.
public interface 인터페이스명 {
public static final char A = 'A';
static char B = 'B';
final char C = 'C';
char D = 'D';
void turnOn(); // public abstract void turnOn();
}
인터페이스 구현
public class 클래스명 implements 인터페이스명 {
// 추상 메서드 오버라이딩
@Override
public 리턴타입 메서드이름(매개변수, ...) {
// 실행문
}
}
● 인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩
● 만약 인터페이스의 추상 메서드를 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경
인터페이스 상속
● 인터페이스 간의 상속은 implements 가 아니라 extends 키워드를 사용합니다.
● 인터페이스는 클래스와는 다르게 다중 상속이 가능합니다.!
public class Main implements C {
@Override
public void a() {
System.out.println("A");
}
@Override
public void b() {
System.out.println("B");
}
}
interface A {
void a();
}
interface B {
void b();
}
interface C extends A, B { }
디폴트 메서드
📌 디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드
- 메서드 앞에 default 키워드를 붙이며 블럭{ }이 존재해야 합니다.
- default 메서드 역시 접근 제어자가 public이며 생략이 가능합니다.
- 추상 메서드가 아니기 때문에 인터페이스의 구현체들에서 필수로 재정의 할 필요는 없습니다.
public class Main implements A {
@Override
public void a() {
System.out.println("A");
}
public static void main(String[] args) {
Main main = new Main();
main.a();
// 디폴트 메서드 재정의 없이 바로 사용가능합니다.
main.aa();
}
}
interface A {
void a();
default void aa() {
System.out.println("AA");
}
}
*static 메서드
인터페이스에서 static 메서드 선언이 가능합니다.
- static의 특성 그대로 인터페이스의 static 메서드 또한 객체 없이 호출이 가능합니다. ( 예 classd이름.method())
- 구현하는 부분이 있어야 한다 디폴트와 같이
// static 메서드 aaa() 호출
A.aaa();
package week03.hasExample.interSample;
public class Main {
public static void main(String[] args) {
// A 인터페이스에 구현체 B 대입
A a1 = new B();
a1.a();
// a1.b(); // 불가능 //a1은 인터페이스 A 타입(자동 형변환)이기 때문에, a() 메서드만 가지고 있음!!
System.out.println("\nB 강제 타입변환");
B b = (B) a1;
b.a();
b.b(); // 강제 타입변환으로 사용 가능
System.out.println();
// A 인터페이스에 구편체 B를 상속받은 C 대입
A a2 = new C();
a2.a();
//a2.b(); // 불가능
//a2.c(); // 불가능
System.out.println("\nC 강제 타입변환");
C c = (C) a2;
c.a();
c.b(); // 강제 타입변환으로 사용 가능
c.c(); // 강제 타입변환으로 사용 가능
}
}
interface A {
void a();
}
class B implements A {
@Override
public void a() {
System.out.println("B.a()");
}
public void b() {
System.out.println("B.b()");
}
}
class C extends B {
public void c() {
System.out.println("C.c()");
}
}
인터페이스의 다형성
'자바 Java > Java 프로그래밍' 카테고리의 다른 글
Java 객체지향 & 클래스 & 생성자 (0) | 2024.07.09 |
---|