본문 바로가기
Spring/Java

[JAVA - OOP 심화1] 상속

by jungha_k 2022. 9. 8.

객체지향 : 캡상추다 (캡슐화 / 상속 / 추상화 / 다형성)

 


 

✨상속

기존의 클래스를 재활용하여 새로운 클래스를 작성

상위클래스의 모든 멤버를 하위 클래스와 공유

(하위클래스의 멤버 개수 = 상위 클래스보다 같거나, 많다)

 

상속받았다 = 확장받았다 (extend)

 

 

✨상속 사용하는 이유? (장점) :

  1. 코드의 중복 제거 위함 (코드 재활용으로 인한)
  2. 다형적 표현이 가능
class Person {
    String name;
    int age;

    void learn(){
        System.out.println("공부를 합니다.");
    };
    void walk(){
        System.out.println("걷습니다.");
    };
    void eat(){
        System.out.println("밥을 먹습니다.");
    };
}

class Programmer extends Person { // Person 클래스로부터 상속. extends 키워드 사용 
    String companyName;

    void coding(){
        System.out.println("코딩을 합니다.");
    };
}

public class HelloJava {
    public static void main(String[] args){

        //Person 객체 생성
        Person p = new Person();
        p.name = "김코딩";
        p.age = 24;
        p.learn();
        p.eat();
        p.walk();
        System.out.println(p.name);

        //Programmer 객체 생성
        Programmer pg = new Programmer();
        pg.name = "박해커";
        pg.age = 26;
        pg.learn(); // Persons 클래스에서 상속받아 사용 가능
        pg.coding(); // Programmer의 개별 기능
        System.out.println(pg.name);

    }
}

 

 

✨상속 vs 포함 관계 (둘다 코드 재활용 방식)

 

포함 : 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언

객체지향에서는 포함 관계를 더 사용한다!

 

 

~은 ~이다 (IS A) : 상속

!=

~ 은 ~을 가지고 있다 (Has a) : 포함

public class Employee {
    int id;
    String name;
    Address address;

    public Employee(int id, String name, Address address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

//중략
lass Address {
    String city, country;

    public Address(String city, String country) {
        this.city = city;
        this.country = country;
    }
}

-> Address 클래스로 변수들 묶어준 다음, Employee 클래스 안에 참조변수 선언함

 

 

✨메서드 오버라이딩 = 덮어쓰기

: 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의

 

 

✨조건 :

1. 메서드의 선언부(메서드 이름, 매개변수, 반환타입)이 상위클래스의 그것과 완전히 일치해야한다.

2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.

3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.

class Vehicle {
    void run() {
        System.out.println("Vehicle is running");
    }
}

public class Bike extends Vehicle { // Vehicle 클래스 상속
    void run() {
        System.out.println("Bike is running"); // 메서드 오버라이딩
    }

    public static void main(String[] args) {
        Bike bike = new Bike();
        bike.run();
    }
}

// 출력값
"Bike is running"

 

✨Super vs super()

 

this, this() 와 유사하다 (자신 객체, 자신의 생성자 호출)

 

super, super()는

상위 클래스의 객체, 상위클래스의 생성자 호출

: 상위 클래스의 존재를 상정함, 상속관계 전제

  1. 생성자 안에서만 사용 가능
  2. 모든 생성자의 첫줄에 와야 함

 

 

✨Object Class

자바 클래스의 상속계층도에 가장 위에 위치

: Object 클래스의 멤버들을 자동으로 상속받아 사용 가능

(= 아래의 메서드들 따로 정의 안하고 사용 가능하다)


댓글