728x90
반응형
상속 (Inheritance)
기존 클래스에 기능 추가 및 재정의하여 새로운 클래스를 정의
- 부모 클래스 : 상속 대상이 되는 클래스
- 자식 클래스 : 기존 클래스를 상속하는 클래스
부모 클래스의 필드와 메소드가 상속됨
다중 상속은 불가능
private, default 멤버는 자식 클래스에서 접근 불가
super, super()
super : 부모 클래스와 자식 클래스의 멤버 이름이 같은 때 구분하는 키워드
super() : 부모 클래스의 생성자 호출
오버라이딩 (Overring)
부모 클래스의 메소드를 자식 클래스에서 재정의
오버라이딩 조건
- 메소드의 선언부는 부모 클래스의 메소드와 동일해야 함
- 반환 타입에 한해, 부모 클래스의 반환 타입으로 변환할 수 있는 타입으로 변경 가능
- 부모 클래스의 메소드보다 접근제어자를 더 좁은 범위로 변경 불가
- 부모 클래스의 메소드보다 더 큰 범위의 예외 선언 불가
다형성 (Polymorphism)
한 객체가 여러 가지 타입을 가질 수 있는 것
부모클래스 타입의 참조 변수로 자식클래스 인스턴스
instanceof
실제 참조하고 있는 인스턴스의 타입 확인
class User {
String name;
Integer age;
String email;
String type;
public User() {}
public User(String name, Integer age, String email, String type) {
this.name = name;
this.age = age;
this.email = email;
this.type = type;
}
/**
* 유저 정보 출력 메소드
*/
public void printUserInfo() {
System.out.println("유저정보");
System.out.println("name = " + name);
System.out.println("age = " + age);
System.out.println("email = " + email);
System.out.println("type = " + type);
}
}
class Guest extends User {
String grade;
public Guest() {}
public Guest(String name, Integer age, String email, String type, String grade) {
super(name, age, email, type); // 부모의 생성자 호출
this.grade = grade;
}
/**
* 게스트 유저 정보 출력 메소드 (오버라이딩)
*/
@Override
public void printUserInfo() {
super.printUserInfo(); // 부모의 유저 출력 메소드 호출
System.out.println("grade = " + grade);
}
}
class Host extends User {
String houseName;
Integer roomCnt;
public Host() {}
public Host(String name, Integer age, String email, String type, String houseName, Integer roomCnt) {
super(name, age, email, type); // 부모의 생성자 호출
this.houseName = houseName;
this.roomCnt = roomCnt;
}
/**
* 호스트 유저 정보 출력 메소드 (오버라이딩)
*/
@Override
public void printUserInfo() {
super.printUserInfo(); // 부모의 유저 출력 메소드 호출
System.out.println("houseName = " + houseName);
System.out.println("roomCnt = " + roomCnt);
}
}
public class Main2 {
public static void main(String[] args) {
// 다형성
User user1 = new Guest(
"유재석",
20,
"You@gmail.com",
"Guest",
"일반"
);
User user2 = new Host(
"강호동",
30,
"Kang@gmail.com",
"Host",
"강하우스",
3
);
user1.printUserInfo();
// 결과 :
// 유저정보
// name = 유재석
// age = 20
// email = You@gmail.com
// type = Guest
// grade = 일반
user2.printUserInfo();
// 유저정보
// name = 강호동
// age = 30
// email = Kang@gmail.com
// type = Host
// houseName = 강하우스
// roomCnt = 3
System.out.println(user1 instanceof User); // true
System.out.println(user1 instanceof Guest); // true
System.out.println(user2 instanceof User); // true
System.out.println(user2 instanceof Host); // true
System.out.println(user1 instanceof Host); // false
System.out.println(user2 instanceof Guest); // false
// 같은 부모를 상속받은 자식끼리라도 instanceof로 같은 타입인지 확인하면 false
}
}
728x90
반응형
'📌Back-End > Java' 카테고리의 다른 글
Java 입출력 (0) | 2024.04.23 |
---|---|
Java 추상 클래스, 인터페이스, 내부 클래스 (0) | 2024.04.22 |
Java 다차원 배열, 클래스와 객체 (1) | 2024.04.19 |
Java 조건문과 반복문 (1) | 2024.04.18 |
Java 연산자 (0) | 2024.04.17 |