[Java] Class(상속)
programming/java

[Java] Class(상속)


9. class(상속)


가. 상속(inheritance)


1) 상속의 정의


class 자식클래스 extends 부모클래스 {

// ...

}


기존의 클래스를 확장하여 새로운 클래스를 작성하는 것(코드 재사용)

두 클래스를 부모와 자식으로 관계를 맺어주는 것

자식은 부모의 모든 멤버를 상속받는다(생성자와 private 제외, protected는 가능함)

1개의 클래스만 상속받을 수 있음(다중상속 금지)

부모클래스(기본클래스, Parent)

자식클래스(파생클래스, Child)


(image)


2) 다중상속

자바에서는 다중상속이 금지됨(C++에서는 가능)


' 왜 자바에서는 없어졌느냐? 상속받는 두 부모클래스에 같은 print()라는 메서드가 있다면 어느 부모 클래스의 print() 메서드인지 모호하기 때문이고, 자식클래스가 너무 무거워질 수 있다.


3) is a 관계        ' ==> 상속관계

상속관계가 있는 클래스들은 자식클래스 is a 부모클래스의 관계로 정의될 수 있음

Student is a Person(O)

Person is a Student(X)


4) has a 관계        '==> 포함관계

한 클래스의 멤버변수로 다른 클래스를 선언해서 부품처럼 조립하여 사용하는 것

Car has a Engine

Car has a Radio


(image)


class car {

private Radio radio;

private Engine engine;


public Car() {

this.radio = new Radio();

this.engine = new Engine();

}

}


class Radio { }

class Engine { }


5) Object class

Java의 최상위 클래스

모든 클래스는 자동적으로 Object 클래스를 상속받게 된다.

모든 클래스는 Object 클래스에 정의된 11개의 method를 상속받는다.


나. 오버라이딩(Overriding)

'cf. 오버로딩이란? 같은 클래스에서 메서드의 이름이 중복된 경우!

'근데 오버라이딩은 상속 관계에서 나온 용어입니다.


1) 오버라이딩의 정의

부모클래스로부터 상속받은 method의 내용을 상속받는 클래스에 맞게 적절하게 변경하는 것

override - '~위에 덮어쓰다(overwrite).', '~에 우선하다.'

method의 header는 동일하게 작성하고 내용을 변경시킴


(image)


class Point {

int x;

int y;


// x, y 좌표를 출력하는 메서드

String getLocation() {

return "x: " + x + ", y: " + y;

}

}


class Point3D extends Point {

int z;


String getLocation() {    // 오버라이딩

return "x: " + x + ", y: " + y + ", z: " + z;

}

}


2) 오버로딩과 오버라이딩

'면접 떄 물어본다. 헷갈린다 이거


(image)


다. super와 super()


'cf. this와 this()의 차이점

this. ? 멤버변수!

this() ? 다른 생성자!


1) super

this - 현재 객체의 시작주소를 가리키는 변수

super - 부모클래스의 멤버를 가리킴


class Parent {

String name;

}


class Child extends Parent {

String name;


void detail() {

super.name = "Parent";

name = "Child";

}

}


2) super()

가) 부모클래스의 생성자를 호출할 경우 사용됨

나) 자식클래스의 객체를 생성하면 자식의 멤버와 부모의 멤버가 합쳐진 하나의 객체가 생성됨

부모클래스의 객체 생성

부모클래스의 생성자 호출

자식클래스의 객체 생성

자식클래스의 생성자 호출

다) 부모클래스의 멤버들도 초기화되어야 하기 때문에 자식클래스의 생성자의 첫 문장에서 부모클래스의 생성자를 호출해야 한다(생성자는 상속에서 제외됨).


package exams;


public class Certificates extends StudentResults {

private String certificate;


Certificates() {

super();

certificate = "No Certificate Awarded";

}

}


라. 패키지(package)    '패키지는 그냥 디렉토리다; 클래스들을 모아놓은 것; rt.jar 누르면~


서로 관련된 클래스와 인터페이스 묶음

클래스는 파일, 패키지는 디렉토리

패키지는 서브패키지를 가질 수 있으며 마침표(.)로 구분

java.util.Scanner


(flow chart)


마. import


참조하는 클래스의 위치를 컴파일러에게 알려주는 것

import 패키지이름.클래스이름;

import java.util.Scanner;


java.lang 패키지의 클래스들(String, System 등)은 import하지 않고도 사용할 수 있음

'import java.lang.*; 이 생략되어 있음


import java.lang.Math;    // import the class


public class Example {

public static void main(String[] args) {

int maxNumber = Math.max(5, 10);

System.out.println(maxNumber);

}

}


01;31;27 image code


바. 실습예제


1) Student.java