java

2022.09.06 java 상속, 포함, 메서드 오버라이딩, super

Han_5ung 2022. 9. 8. 17:35

🐧상속(inheritance)

      👉 기존의 클래스를 재활용하여 새로운 클래스를 정의

 

특징

  • 상위 클래스와 하위 클래스로 나뉨
  • 하위 클래스는 상위 클래스의 모든 멤버를 상속받게 됨
  • 하위 클래스의 멤버 개수는 항상 상위 클래스의 멤버 개수보다 같거나 많음 (자신의 것 + 물려받은 것)
  • extends 키워드 사용
  • 단일 상속만 지원
  • a는 b이다(IS - A) 관계

장점

  • 기존의 클래스를 재활용할 수 있음
  • 중복되는 멤버를 상위에 미리 작성하면 하위에서 작성하지 않아도 됨 (중복 제거)
  • 계층적 관계 구성
Class Child extend Parents{
	...
}
  • 상위 클래스 :  Parents    하위 클래스 : Child
  • Parents의 멤버를 child가 물려 받음

ex)

public class Example {
    public static void main(String[] args) {
        Child child = new Child();	
        child.name = "baby peng";
        child.age = 3;
        System.out.println("이름 : " + child.name + " 나이 : " + child.age);
    }
}

class Parents {	//상위 클래스
    String name;
    int age;
}
class Child extends Parents{	//하위 클래스

}
//출력값
이름 : baby peng 나이 : 3

포함 관계

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

  • 상속과 저장공간의 차이는 없으며, 구조적인 차이만 있음
  • a는 b를 가지고 있다 (HAS - A)관계

⛄ex)

public class Example {
    public static void main(String[] args) {
        Circle circle = new Circle();	
        System.out.println(circle.a);	
        System.out.println(circle.line.b);
    }
}

class Circle{
    Line line = new Line();	//Line 클래스 생성자 생성 & Circle에 Line포함
    String a = "Circle";
}

class Line{
    String b = "line";
}
//출력값
Circle
line

메서드 오버라이딩

      👉 상위 클래스에서 미리 정의된 메서드를 하위 클래스에서 같은 시그니쳐를 갖는 메서드로 재정의

 

      👉 즉 메소드 바디 부분만 바뀜

  • 메서드의 선언부는 기존 메서드와 일치해야 함
  • 메서드 동작부만 변경
  • 기존 메서드보다 접근 제어자를 좁은 범위로 변경할 수 없음

⛄ex)

public class Example {
    public static void main(String[] args) {
        Walk walk = new Walk();
        walk.run();
    }
}

class Running{
    void run(){	//상위 클래스 메서드
        System.out.println("달린다.");
    }
}

class Walk extends Running{
    @Override
    void run() {	//오버라이딩된 메서드
        System.out.println("달리는 척하다 걷는다.");
    }
}
//출력값
달리는 척하다 걷는다.

super & super()

super

      👉 상위 클래스의 멤버를 하위 클래스에서 참조하는 데 사용

public class Example {
    public static void main(String[] args) {
        LowNum lowNum = new LowNum();

        lowNum.print();
    }
}

class HighNum{
    int num = 100;
}

class LowNum extends HighNum{
    int num = 1;

    void print(){
        System.out.println(num);	//LowNum의 num
        System.out.println(this.num);	//LowNum의 num
        System.out.println(super.num);	//HighNum의 num
    }
}
//출력값
1
1
100
  • super.변수이름
  • 상위 클래스의 변수를 가져옴

super()

      👉 상위 클래스의 생성자를 호출

  • 생성자 안에서만 사용 가능
  • 반드시 첫 줄에 사용
public class Example {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

class Parents{
    Parents(){
        System.out.println("Parents 클래스");
    }
}

class Child extends Parents{
    Child(){
        super();	//Parents 생성자 호출
        System.out.println("Child 클래스");
    }
}
//출력값
Parents 클래스
Child 클래스
  • super(); 명령어로 Parents생성자 호출

⛄ex)

import java.util.Scanner;

public class Example {
    public static void main(String[] args) {
        Info info = new Info();
        Scanner sc = new Scanner(System.in);

        info.model = sc.nextLine();	//모델명 입력
        info.color = sc.nextLine();	//색상 입력

        info.print();
    }
}

class Phone {
    String model;
    String color;

    Phone() {}

    Phone(String model, String color) {
        this.model = model;
        this.color = color;
    }
}

class Info extends Phone {
    Info(){}
    Info(String model, String color) {
        super(model, color);	//Phone 생성자 호출
    }

    void print() {
        System.out.println("모델명 : " + model + " 색상 : " + color);
    }
}
//입력값
galaxy
green
//출력값
모델명 : galaxy 색상 : green
  • 모델명, 색상 입력 후 super();를 사용
  • Phone 생성자로 model, color값 전달
  • this로 String 변수값 할당