상속
📌 상속의 사전적 정의는 부모가 자식에게 물려주는 행위
- 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다.
- 상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와 변경이 쉬워질 수도 있다.
- 상속을 사용하면 코드의 중복이 제거되고 재사용성이 크게 증가
클래스 간의 상속은 extends 키워드를 사용하여 정의
public class 자식클래스 extends 부모클래스 {
}
부모가 자식보다 큰 사람이니까 부모 클래스도 마찬가지로 자식 클래스 보다 큰 범위겠지?
➡️ 자식 클래스에 새로운 필드와 메서드가 추가되어도 부모 클래스는 어떠한 영향도 받지 않는다. 따라서 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.
단일 상속과 다중 상속
다중 상속
🚫 자바는 다중 상속을 허용하지 않는다!!
1. 자식에 부모가 여러 명일 수는 없다.
2. 다중 상속을 허용하면 클래스 간 관계가 거미줄처럼 엮여서 복잡.
3. 자식 클래스에서 상속받는 서로 다른 부모 클래스들이 같은 이름의 멤버를 가지고 있다면 구분 불가
final 클래스와 final 메서드
✅ final 키워드를 클래스에 지정해 선언하면 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스
✅ final 키워드를 메서드에 지정해 선언하면 최종적인 메서드가 됨으로 더 이상 오버라이딩할 수 없는 메서드
Object
✅ Object 클래스는 Java 내 모든 클래스들의 최상위 부모 클래스 → 모든 클래스는 Object 메서드를 사용할 수 있음
🧑💻 Object 클래스의 메서드를 몇 가지 소개
- Object **clone()** : 해당 객체의 복제본을 생성하여 반환함.
- boolean **equals(Object object)** : 해당 객체와 전달받은 객체가 같은지 여부를 반환함.
- Class **getClass()** : 해당 객체의 클래스 타입을 반환함.
- int **hashCode()** : 자바에서 객체를 식별하는 정수값인 해시 코드를 반환함.
- String **toString()** : 해당 객체의 정보를 문자열로 반환함. & Object 클래스에서는 클래스이름 @해쉬코드값 리턴함
오버라이딩
✅ 부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것
조건
1. 선언부가 부모 클래스의 메서드와 일치
2. 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없음
3. 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없음
@Override
public double brakePedal() {
speed = 100;
System.out.println("스포츠카에 브레이크란 없다");
return speed;
}
@Override
public void horn() {
booster();
}
super 와 super()
✅ super는 부모 클래스의 멤버를 참조할 수 있는 키워드
✓ 객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용
✓ 자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우 구분
public void setCarInfo(String model, String color, double price) {
super.model = model; // model은 부모 필드에 set
super.color = color; // color는 부모 필드에 set
this.price = price; // price는 자식 필드에 set
}
super( )
✅ super(…)는 부모 클래스의 생성자를 호출할 수 있는 키워드
✓ 객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스의 생성자를 호출
✓ 자식 클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져서 하나의 인스턴스가 생성
➡️ 이때 부모 클래스의 멤버들의 초기화 작업이 먼저 수행
부모 클래스 생성자
// 부모 클래스 Car 생성자
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
자식 클래스 생성자
// 자식 클래스 SportsCar 생성자
public SportsCar(String model, String color, double price, String engine) {
// this.engine = engine; // 오류 발생
super(model, color, price);
this.engine = engine;
}
다형성( polymorphism )
✅ 부모 타입 변수 = 자식 타입 객체; 는 자동으로 부모 타입으로 변환
✓ 자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일하게 취급
✓ 부모 타입 변수로 자식 객체의 멤버에 접근 시 부모 클래스에 선언된 상속받은 멤버만 접근
Mammal : 부모 클래스
class Mammal {
// 포유류는 새끼를 낳고 모유수유를 한다.
public void feeding() {
System.out.println("모유수유를 합니다.");
}
}
Whale : 자식 클래스
class Whale extends Mammal {
// 고래는 포유류 이면서 바다에 살며 수영이 가능하다.
public void swimming() {
System.out.println("수영하다.");
}
@Override
public void feeding() {
System.out.println("고래는 모유수유를 합니다.");
}
}
강제 타입 변환
반대로 부모 타입 객체는 자식 타입 변수로 자동으로 타입 변환되지 않음.
// 자식타입객체가 자동 타입변환된 부모타입의 변수
Mammal mammal = new Whale();
mammal.feeding();
// 자식객체 고래의 수영 기능을 사용하고 싶다면
// 다시 자식타입으로 강제 타입변환을 하면된다.
Whale whale = (Whale) mammal;
whale.swimming();
※ 주의
자식 타입 객체가 부모 타입 변환된 후 다시 자식 타입으로 변환될 때만 강제 타입 변환이 가능
instanceof
✅ 다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 것이 필요한데 이때 사용할 수 있는 명령어가 instance of 이다
✅ {대상 객체} instance of {클래스 이름}와 같은 형태로 사용하면 응답값은 boolean
// 다형성
class Parent { }
class Child extends Parent { }
class Brother extends Parent { }
public class Main {
public static void main(String[] args) {
Parent pc = new Child(); // 다형성 허용 (자식 -> 부모)
Parent p = new Parent();
System.out.println(p instanceof Object); // true 출력
System.out.println(p instanceof Parent); // true 출력
System.out.println(p instanceof Child); // false 출력
Parent c = new Child();
System.out.println(c instanceof Object); // true 출력
System.out.println(c instanceof Parent); // true 출력
System.out.println(c instanceof Child); // true 출력
}
}
'내배캠_Java 6기 > Java 문법 종합반' 카테고리의 다른 글
20240812_TIL_캠프 5주차 1일_접근제어자와 package & import (0) | 2024.08.12 |
---|---|
20240809_TIL_캠프 4주차 5일_생성자와 this (0) | 2024.08.12 |
20240808_TIL_캠프 4주차 5일_인스턴스 멤버와 클래스 멤버 (0) | 2024.08.09 |
20240809_TIL_캠프 4주차 5일_필드와 메서드 (0) | 2024.08.09 |
20240809_TIL_캠프 4주차 5일_자바의 객체지향 프로그래밍과 클래스 설계 (1) | 2024.08.09 |