Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

블로그 이름 뭐하지

[JAVA] 상속 본문

JAVA

[JAVA] 상속

가는말이고우면오는말은come 2024. 9. 23. 17:39

부모클래스의 멤버(필드, 메서드)를 자식 클래스에게 물려주는 것이다.

코드의 중복 제거, 재사용성의 증가로 생산성과 유지보수성이 유리해진다.

클래스의 다중상속은 허용되지 않는다.(관계가 복잡해지는 문제가 생김)

 

상속은 extends 키워드를 사용한다.

확장의 개념으로, 부모클래스가 자식클래스를 품는 것이 아니라,

자식 클래스에 부모 클래스를 더해 확장되는 것이다.

 

1) 부모 클래스에 새로운 필드와 메서드가 추가되면

자식클래스는 이를 상속받아 사용한다.

2) 자식 클래스에 새로운 필드와 메서드가 추가되어도

부모 클래스에는 영향이 없다.

3) 자식 클래스의 멤버 개수 >= 부모 클래스의 멤버 개수

 

 

 

 

final 클래스와 final 메서드

public final class Car{}

public class SportCar extends Car{} //오류 발생 >> 상속 불가

-------------------

public class Car{
	public final void horn() {
    	System.out.println("빵빵");
    }
}

public class SportCar extends Car{
	public void horn(){ //오류 발생 >> 오버라이딩 불가
    	super.horn();
    }
}

클래스에 final 키워드를 지정하면 상속할 수 없는 클래스가 된다.

메서드에 final 키워드를 지정하면 오버라이딩 할 수 없는 메서드가 된다.

 

Object

JAVA내 모든 클래스들의 최상위 부모 클래스.

모든 클래스는 Object의 메서드를 사용할 수 있다.

부모 클래스가 없는 자식 클래스는 자동으로 Object 클래스를 상속받는다.

 

Object 클래스의 주요 메서드

메서드 반환타입 설명
.clone() Object 해당 객체의 복제본을 생성하여 반환
.equals(Object ob) boolean 해당 객체와 전달받은 객체가 같은지 여부 반환
.getClass() Class 해당 객체의 클래스 타입을 반환
.hashCode() int 해시코드(자바에서 객체를 식별하는 정수값)반환
.toString() String 해당 객체의 정보를 문자열로 반환
Object 클래스에서는 클래스이름 @해시코드값 반환

 

오버라이딩

부모클래스로부터 상속받은 메서드의 내용을 재정의 하는 것

 

오버라이딩 조건

1) 선언부가 부모 클래스의 메서드와 일치

(=이름, 매개변수, 반환타입이 같아야 함)

2) 접근 제어자를 부모 클래스보다 더 좁은 범위로 변경 불가

(ex. 부모클래스 메서드는 public인데 자식클래스 메서드는 protected >> 불가)

3) 예외를 부모 클래스 메서드보다 많이 선언 불가

(ex. 부모 클래스: void parent() throws IOException, SQLException{...}

자식 클래스 : void child() throws Exception{...} >> 불가

>> 개수의 문제가 아니라 Exception은 모든 예외에서 부모예외이다.)

4) 인스턴스 메서드를 클래스 메서드 또는 그 반대로 변경 불가

//부모 클래스 Car
public Car{
    public double brakePedal() {
        speed = 0;
        return speed;
    }
}

//자식 클래스 SportCar
public SportCar extends Car{
    @Override
    public double brakePedal() {
        speed = 100;
        System.out.println("스포츠카에 브레이크란 없다");
        return speed;
    }
}

 

 

super와 super()

super

부모클래스의 멤버를 참조할 수 있는 키워드.

객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용된다.

자식 클래스에서 선언한 멤버와 부모 클래스에서 상속받은 멤버의 이름이 같을 경우 구분을 위해 사용한다.

// 부모 클래스 Car
public Car{
    String model;
    String color;
    double price;
}

//자식 클래스 SportCar
public SportCar extends Car{
    String model;
    String color;
    double price;
    
    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()

부모클래스의 생성자를 호출할 수 있는 키워드

객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스듸 생성자를 호출하기 위해 사용된다.

자식 클래스의 객체가 생성될 때 부모 클래스 멤버들의 초기화 작업이 먼저 수행된다.

따라서 자식 클래스의 생성자에서는 부모 클래스의 생성자가 호출된다.

부모 클래스의 생성자는 가장 첫 줄에서 호출된다.

부모클래스의 생성자가 오버로딩되지 않아도 컴파일러가 자동으로 추가한다.

// 부모 클래스 Car
public Car{

    public Car(String model, String color, double price){
        this(model, color, price);
    }
    
}

//자식 클래스 SportCar
public SportCar extends Car{
    
    public SportCar(String model, String color, double price, String engine){
    	super(model, color, price)
        this.engine = engine;
    }
}

 

다형성

참조변수의 타입 변환

1) 자동타입변환

부모 타입 변수 = 자식 타입 객체는 자동으로 부모타입으로 변환한다.

자식 객체는 부모 객체의 멤버를 상속 받기 때문.

다만 이 경우, 부모클래스에서 선언된, 상속받은 멤버만 가능.

//부모클래스 : 포유류
class Mammal {
    public void feeding() {
        System.out.println("모유수유를 합니다.");
    }
}

//자식클래스 : 고래
class Whale extends Mammal {
    public void swimming() {
        System.out.println("수영하다.");
    }

    @Override
    public void feeding() {
        System.out.println("고래는 모유수유를 합니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        // 부모 타입의 변수 = 자식 타입의 객체 가능
        Mammal mammal = new Whale();

        // 부모 클래스에 swimming()이 선언되어있지 않아서 사용 불가능
        // mammal.swimming(); // 오류 발생

        // 부모타입의 객체는 자식타입의 변수로 변환 불가
        // Whale whale = new Mammal(); // 오류 발생
		
        // 부모 클래스에서 선언된 메서드는 사용가능
        mammal.feeding();
    }
}

 

2) 강제타입변환

자식 타입 변수 = (자식타입) 부모 타입 객체는 자동으로 변환 되지 않으므로,

타입변환연산자()를 이용해 강제로 자식 타입으로 변환할 수 있다.

 

무조건 강제 타입변환이 가능한 것은 아니고,

자식 타입 객체가 부모타입으로 자동 변환 된 후 다시 자식 타입으로 변환할 때만 가능하다.

부모 타입변수로는 자식 객체의 고유 멤버를 사용할 수 없으므로 강제 타입변환을 사용한다.

// 자식타입객체가 자동 타입변환된 부모타입의 변수
Mammal mammal = new Whale();
mammal.feeding();

// 자식객체 고래의 메서드를 사용하고 싶으면,
// 다시 자식타입으로 강제 타입변환을 하면된다.
Whale whale = (Whale) mammal;
whale.swimming();

----------------------------------------

// 자동 타입변환된 부모 타입변수가 아닌 부모 객체를
// 자식타입의 변수로 강제 변환은 불가하다
Mammal newMammal = new Mammal();
Whale newWhale = (Whale) newMammal; // ClassCastException 발생

 

 

다형성

1)  객체 생성에서의 다형성

부모 타입 변수 = 자식 타입 객체를 선언하여

다양한 종류의 객체를 생성 할 수 있다.

public Car(Tire tire) {
    this.tire = tire;
}

Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));

 

2) 매개변수에서의 다형성

//Car 생성자에서 매개변수의 타입이 부모 타이어이므로
//자식 타이어 객체들을 매개값으로 전달할 수 있다.

Tire getHankookTire() {
    return new HankookTire("HANKOOK");
}

Tire getKiaTire() {
    return new KiaTire("KIA");
}

Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();

 

3) 반환타입에서의 다형성

// 반환 타입이 부모 타이어이기 때문에
// 자식 타이어 객체들을 반환값으로 지정할 수 있다.

Tire getHankookTire() {
    return new HankookTire("HANKOOK");
}

Tire getKiaTire() {
    return new KiaTire("KIA");
}

Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();

 

 

instanceOf

해당 클래스 객체의 원래 클래스 명을 확인하는 명령어

{대상 객체} instanceOf {클래스 이름} 과 같은 형태로 사용하며 응답값은 boolean.

class Parent { }
class Child 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' 카테고리의 다른 글

[JAVA] 예외 처리  (0) 2024.09.24
[JAVA] 추상 클래스와 인터페이스  (0) 2024.09.23
[JAVA] 클래스  (0) 2024.09.23
[JAVA] 객체 지향 프로그래밍의 이해  (1) 2024.09.20
[JAVA] 컬렉션  (0) 2024.09.20