컴퓨터는 잘못이 없다..

[JAVA]상속 본문

공부/JAVA

[JAVA]상속

도토리까꿍v 2024. 4. 10. 14:37
Contents 접기

#핵심 요약

  1. 상속
    • 기존 클래스에 기능 추가 및 재정의하여 새로운 클래스를 정의
    • 부모클래스(=상위클래스) / 자식클래스(=하위클래스)
    • 부모클래스의 필드와 메소드가 상속된다. (생성자, 초기화 블록은 상속되지 않는다.)
  2. 상속 형태
    • 부모 <- 자식 <- 자식 (가능)
    • 부모 <- 자식
              <- 자식 
      (가능, 여러 개의 자식 클래스가 한 개의 부모 클래스를 상속하는 형태)
    • 부모 <- 자식 -> 부모
      (불가능, 자식클래스가 여러 개의 부모 클래스를 상속받는 형태 즉, 다중 상속 불가
  3. super, super()
    • super : 부모 클래스와 자식 클래스의 멤버 이름이 같을 때 구분하는 키워드
    • super() : 부모 클래스의 생성자 호출
  4. 오버라이딩
    1. 부모 클래스의 메소드를 자식 클래스에서 재정의
    2. 오버라이딩 조건
      1. 메소드의 선언부는 부모, 자식 클래스 동일해야함
      2. 반환타입 변경 가능
      3. 부모클래스의 메소드보다 접근제어자를 더 좁은 범위로 변경 불가
      4. 부모 클래스의 메소드보다 더 큰 범위의 예외 선언 불가

#소스 코드

 

1. 상속, super, 오버라이딩 사용 예제

// Java 프로그래밍 - 상속

class Person {
    String name;
    int age;
    public int a1;
    private int a2;

    Person() {}
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void printInfo() {
        System.out.println("Person.printInfo");
        System.out.println("name: " + name);
        System.out.println("age: " + age);
    }
}

// Student 클래스 - Person 상속, 접근제어자 확인
class Student extends Person {
    Student() {
        a1 = 1;
//        a2 = 2; //private 이라 접근 불가능
    }
}


// Student 클래스 - Person 상속, super 사용, 오버라이딩
class Student2 extends Person {
    String name;
    int stdId;

    //  super, super()
    Student2(String name, int age, int stdId) {
        this.name = name; //자식클래스의 name
//        super.name = name; //부모클래스의 age에 접근하고 싶을 땐 super를 사용
        this.age = age; //상속받은 age를 의미
//        super(name, age); //부모클래스의 생성자를 호출하는 것임
        this.stdId = stdId; //자식클래스의 name
    }

    //  오버라이딩 - 메소드의 이름은 부모클래스에 있는 메소드와 동일하게 작성한다.
    public void printInfo() {
        System.out.println("Student2.printInfo");
        System.out.println("name: " + name);
        System.out.println("age: " + age);
        System.out.println("stdId: " + stdId);
    }
}


public class Main {

    public static void main(String[] args) {

//      Test code
//      1. 상속
        System.out.println("=============");
        Student s1 = new Student();
        s1.name = "a";
        s1.age = 25;
        s1.printInfo();

        
//      2. super, super(), 오버라이딩
        System.out.println("=============");
        Student2 s2 = new Student2("b",32, 1);
        s2.printInfo();

    }
}

 

2. 예제 - 1

// Practice1
// 아래의 클래스 및 상속 관계에서 Test code를 수정하지 않고
// Cat 클래스 내에서 super 또는 super()를 이용하여
// "고양이 입니다." 가 출력될 수 있도록 변경해보세요.

class Animal {
    String desc;
    Animal() {
        this.desc = "동물 클래스 입니다.";
    }

    Animal(String desc) {
        this.desc = desc;
    }

    public void printInfo() {
        System.out.println(this.desc);
    }
}

class Cat extends Animal {
    String desc;
    Cat() {
        this.desc = "고양이 입니다.";
//        super.desc = "고양이 입니다."; //방법1. super를 이용하여 직접 부모 클래스의 변수 초기화
//        super("고양이 입니다."); //방법2. supter() 생성자를 호출하여 직접 부모 클래스의 변수 초기화
    }
}

public class Practice1 {
    public static void main(String[] args) {
        // Test code
        Cat cat = new Cat();
        cat.printInfo();

    }
}

 

3. 예제 - 2

// Practice2
// 아래 클래스와 상속 관계에서
// Test code를 수정하지 않고, 아래와 같이 출력될 수 있도록 오버라이딩 해보세요.
// 빵빵!
// 위이잉!
// 빵빵!
// 삐뽀삐보!

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

class FireTruck extends Car {
    public void horn() {
        super.horn(); //부모클래스의 메소드를 호출
        System.out.println("위이잉!");
    }
}

class Ambulance extends Car {
    public void horn() {
        super.horn(); //부모클래스의 메소드를 호출
        System.out.println("삐뽀삐뽀!");
    }
}

public class Practice2 {
    public static void main(String[] args) {
        // Test code
        FireTruck truck = new FireTruck();
        truck.horn();

        Ambulance amb = new Ambulance();
        amb.horn();
    }
}

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

[JAVA]다형성  (0) 2024.04.13
[JAVA]클래스와 객체  (1) 2024.04.10
[JAVA]다차원배열  (0) 2024.04.07
Comments