Post

상속과 추상클래스

상속과 추상클래스

객체지향 프로그램에서 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있다

상속

이미 개발된 클래스를 재사용해서 새로운 클래스를 만들기에 중복된는 코드를 줄일 수 있다

또한 부모 클래스에서 수정하면 모든 자식 클래스도 바뀐다

 

클래스 상속

1
2
3
class 자식클래스 extends 부모클래스 {
  
}

extends를 통해서 상속 받을 부모 클래스를 결정한다

여러개의 부모 클래스를 상속할 수 없다 부모 클래스의 private 접근 제외자 필드 메소드는 제외

자식 객체를 생성할때 부모 객체가 먼저 생성되고 그 다음 자식 객체가 생성된다

 

super

인스턴스 변수와 지역변수의 이름이 같다면 this를 통해 구별했다 이것과 비슷하게 부모클래스 멤버와 자식클래스 멤버가 이름이 같은 경우 super키워드를 통해서 구분 가능하다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Parent {
    int a = 10;
}
 
class Child extends Parent {
    int a = 20;
 
    void display() {
        System.out.println(a); //20
        System.out.println(this.a); //20
        System.out.println(super.a); //10
    }
}
 
public class Inheritance03 {
    public static void main(String[] args) {
        Child ch = new Child();
        ch.display();
    }
}

 

super() 메소드

이 메소드는 부모 클래스의 생성자를 호출할 때 사용된다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Parent {
    int a;
    Parent() { a = 10; }
    Parent(int n) { a = n; }
}
 
class Child extends Parent {
    int b;
    Child() {
        super(40);
        b = 20;
    }
    void display() {
        System.out.println(a); //40
        System.out.println(b); //20
    }
}
 
public class Inheritance04 {
    public static void main(String[] args) {
        Child ch = new Child();
        ch.display();
    }

 

메소드 재정의

오버라이딩으로 자식클래스에서 메소드를 수정하는것을 의미한다

  • 부모 메소드와 동일한 시그니처를 가져야한다
  • 접근 제란 더 강하게 할 수 없음
  • 새로운 예외를 throws할 수 없다
  • 오버라이딩을 할 경우 부모 객체의 메소드가 숨겨진다 자식 객체의 매소드가 호출됨
    • 만약 부모 메소드를 호출하고 싶다면 super.부모메소드()를 통해서 부모 메서드 호출

 

final 클래스와 final 메소드

final 키워드를 통해서 선언되었으면 더 이상 수정 될 수 없음을 의미한다 클래스 및 메소드 선언시 final 키워드를 사용한다면 상속과 관련 되어있다

  • public final class 클래스 {}인 경우 자식 클래스를 만들 수 없다
  • public class 리턴타입 메소드이름(매개변수){} 해당 메소드는 재정의 할 수 없다

 

클래스 타입 변환

부모타입 변수 = 자식타입;일때 자동으로 부모 타입으로 클래스가 타입 변환된다

자동 타입변환으로 프로그램 실행 도중 타입 변환이 일어나는것을 말함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Parent {
  void method1(){}
  void method2(){}
}

class Child extends Parent {
  void method2(){} //재정의 오버라이딩
  void method3(){}
}

class ChildExample {
  public static void main(String[] args){
    Chid child = new Child();
    Parent parent = child; // 클래스 타입 변환
    parent.method1(); //parent의 method1실행
    parent.method2(); //child의 method2실행 오버라이딩 되어서
    //parent.method3(); 실행 불가능
  }
}

 

필드의 다형성

필드 타입을 부모 타입으로 선언할 경우 다양한 자식 객체가 저장되어 필드 사용 결과 달라질 수 있다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Car {
  Tire frontTire = new Tire();
  Tire backTire = new Tire();
  
  void run(){
    frontTire.roll();
    backTire.roll();
  }
}

Car myCar = new Car();
myCar.frontTire = new HankookTire();
myCar.backTire = new KumhoTire();
myCar.run();

여기서 Tire대신 HankookTire과 KumhoTire가 들어간다 이는 Tire의 자식 객체이기 때문에 가능하다

 

매개변수의 다형성

매개변수가 클래스인 경우 해당 클래스의 자식 객체까지도 매개변수가 될 수 있다

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
32
33
34
35
36
37
38
public class Vehicle {
    public void run() {
        System.out.println("차량이 달린다.");
    }
}
public class Driver {
    public void drive(Vehicle vehicle) {
        vehicle.run();
    }
}

public class Bus extends Vehicle{
    @Override
    public void run() {
        System.out.println("버스가 달린다.");
    }
}

public class Taxi extends Vehicle{
    @Override
    public void run() {
        System.out.println("택시가 달린다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Driver driver = new Driver();
        Bus bus = new Bus();
        Taxi taxi = new Taxi();
        
        // 자동 타입 변환(Vehicle vehicle = bus)
        driver.drive(bus); 
        
        // 자동 타입 변환(Vehicle vehicle = taxi)
        driver.drive(taxi);
    }
}

 

강제 타입 변환

1
2
Parent parent = new Child(); // 자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환

 

instanceof

객체가 어느 클래스의 인스턴스 인지 확인한다

1
2
3
if(parent instanceof Chid) { //boolean으로 결과 출력
  Child child = (Child) parent;
}

추상 클래스

추상 클래스는 실제 클래스등의 공통적인 특성을 추출해서 선언한것이다 추상 클래스는 실체 클래스는 부모자식 관계로 상속 관계를 가진다

실체 클래스의 반드시 존재해야할 필드와 메소드의 선언 추상클래스는 설계규격 느낌 틀만 구축

 

추상클래스 선언

abstract 키워드를 사용한다 -> 상속을 통해서 자식 클래스를 만들 수 있게 직접 객체 생성 불가능(자식 이용)

 

추상 메소드

메소드가 abstract로 선언 중괄호 없음 하위 클래스는 반드시 실행 내용을 채워야한다

1
2
3
public abstract class Animal {
  public abstract void sound(); //추상 메소드 자식은 이부분을 재정의 해야함
}
This post is licensed under CC BY 4.0 by the author.