Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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] 상속(Inheritance) 본문

공부/JAVA

[Java] 상속(Inheritance)

raptorhs 2024. 6. 28. 12:36

상속

자바 언어에서 상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미합니다.

두 클래스를 상위 클래스와 하위클래스로 나누어 상위클래스의 멤버(필드,메서드,내부클래스)를 하위클래스와 공유하는것을 의미합니다. 하위클래스는 상위 클래스가 가진 모든 멤버를 상속받게 됩니다.

 

import java.sql.SQLOutput;

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("코딩을 합니다");
    }
}
class Dancer extends Person{
    String groupName;
    void dancing(){
        System.out.println("춤을 춥니다.");
    }
}
class Singer extends Person{
    String bandName;
    void singing(){
        System.out.println("노래합니다.");
    }
    void playGuitar(){
        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);
    }
}

 

 

자바에서 단일상속만을 허용합니다.다중 상속은 허용되지 않습니다.

 

포함 관계

포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법으로, 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것을 의미합니다.

 

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;
    }

    void showInfo(){
        System.out.println(id+" " + name);
        System.out.println(address.city + " " + address.country);
    }

    public static void main(String[] args) {
        Address address1 = new Address("서울","한국");
        Address address2 = new Address("도쿄","일본");

        Employee e = new Employee(1,"김코딩", address1);
        Employee e2 = new Employee(2,"박헤커", address2);

        e.showInfo();
        e2.showInfo();
    }

}
class Address{
    String city, country;

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

 

Address클래스로 해당 변수들을 묶어준 다음 Employee클래스 안에 참조변수를 선언하는 방법으로 코드의 중복을 없애고 포함관계로 재사용하고 있습니다.

Employee는 Address이다. (X)

Employee는 Address를 가지고 있다.(O)

상속보다는 포함관계가 적합함.

 

메서드 오버라이딩

메서드 오버라이딩(Method Overriding)은 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 의미합니다.

public class Main {
    public static void main(String[] args) {
        Bike bike = new Bike();
        Car car = new Car();
        MotorBike motorBike = new MotorBike();

        bike.run();
        car.run();
        motorBike.run();
    }
}
class Vehicle{
    void run(){
        System.out.println("Vehicle is running");
    }
}
class Bike extends Vehicle{
    void run(){
        System.out.println("Bike is running");
    }
}
class Car extends Vehicle{
    void run(){
        System.out.println("Car is running");
    }
}
class MotorBike extends Vehicle{
    void run(){
        System.out.println("MotorBike is running");
    }
}

 

Vehicle 클래스에 run() 메서드가 정의되어 있으며, Bike, Car, MotorBike 클래스에서 run() 메서드를 재정의함으로써 Vehicle 클래스의 run() 메서드를 오버라이딩하고 있습니다.

Bike, Car, MotorBike의 인스턴스를 통해 run() 메서드를 호출하면 Vehicle의 run()이 아닌, Bike, Car, MotorBike의 run()이 호출됩니다.

상위 클래스의 메서드를 오버라이딩하려면 다음의 세 가지 조건을 반드시 만족시켜야 합니다.

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

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

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

 

super 키워드와 super()

this는 자신의 객체,this()메서드는 자신의 생성자 호출을 의미했었습니다.

super키워드는 상위 클래스의 객체. super()는 상위 클래스의 생성자를 호출하는 것을 의미합니다.

이 둘은 공통적으로 상위 클래스의 존재를 상정하며 상속 관계를 전제로 합니다.

 

public class Example {
    public static void main(String[] args) {
        Subclass suClassInstance = new Subclass();
        suClassInstance.callNum();
    }
}
class Superclass{
    int count = 20; // super.count
}
class Subclass extends Superclass{
    int count = 15; //this.count

    void callNum(){
        System.out.println("count = " + count);
        System.out.println("this.count = " + this.count);
        System.out.println("super.count = " + super.count);
    }
}

 

위에 예제에서 SubClass는 SuperClass로부터 변수 count를 상속받는데, 공교롭게도 자신의 인스턴스 변수 count와 이름이 같아 둘을 구분할 방법이 필요합니다.

이런 경우, 두 개의 같은 이름의 변수를 구분하기 위한 방법이 바로 super 키워드입니다.

super 키워드를 사용하면 부모의 객체의 멤버 값을 참고할 수 있습니다.

 

public class Test {
    public static void main(String[] args) {
        Student s =new Student();
    }
}
class Human{
    Human(){ // 생성자
        System.out.println("휴먼 클래스 생성자");
    }
}
class Student extends Human{
    Student(){
        super();
        System.out.println("학생 클래스 생성자");
    }
}

 

this()는 같은 클래스의 다른 생성자를 호출하는 데 사용되지만, super()는 상위 클래스의 생성자를 호출하는 데 사용됩니다.

super() 메서드 또한 this()와 마찬가지로 생성자 안에서만 사용 가능하고, 반드시 첫 줄에 와야 합니다.

기억해야 하는 가장 중요한 사실은 모든 생성자의 첫 줄에는 반드시 this() 또는 super()가 선언되어야 한다는 것입니다.

super()가 없는 경우에는 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입합니다.

 

클래스의 정점, Object 클래스

Object 클래스는 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스입니다. 따라서 자바의 모든 클래스는 Object 클래스로부터 확장된다는 명제는 항상 참입니다.

Object 클래스는 자바 클래스의 상속계층도에 가장 위에 위치하기 때문에 Object 클래스의 멤버들을 자동으로 상속받아 사용할 수 있습니다.

 

 

Object클래스의 대표적인 메서드

 

 

메서드명                        반환 타입        주요 내용

toString() String 객체 정보를 문자열로 출력
equals(Object obj) boolean 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교
hashCode() int 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단
wait() void 현재 스레드 일시정지
notify() void 일시정지 중인 스레드 재동작

'공부 > JAVA' 카테고리의 다른 글

[Java] 추상화  (0) 2024.06.29
[Java] 캡슐화,패키지,접근제어자,getter와 setter  (0) 2024.06.29
[Java] 내부 클래스  (0) 2024.06.26
[Java] 필드와 메서드  (0) 2024.06.26
[Java]생성자  (0) 2024.06.26