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 변수값 할당