Hello, Dino
상속 (Inheritance) & 다형성 (Polymorphism) 본문
다양한 회사의 Computer Class
'S'사
public class SamsongComputer {
protected String manufacturer;
protected String processor;
protected double ramSize;
protected double diskSize;
protected double processSpeed;
...
}
'A'사
public class ApartmentComputer {
protected String manufacturer;
protected String processor;
protected double ramSize;
protected double diskSize;
protected double processSpeed;
...
}
'L'사
public class LcComputer {
protected String manufacturer;
protected String processor;
protected double ramSize;
protected double diskSize;
protected double processSpeed;
...
}
다양한 회사의 Computer Class는 작성했지만 많은 중복 코드가 발생했다. 😱
그렇다면 어떻게 해야 코드 중복을 줄일 수 있을까?🤔
상속을 통해 Class를 재사용하면 코드 중복을 줄일 수 있다.
Class 상속
public class [subClass] extends [superClass]{
}
상속을 받게되면 superClass(부모클래스)의 member를 모두 사용할 수 있다.
단, private member/ final class(or method)는 상속받을 수 없다.
💙 'private' 접근 제한자를 사용하게 되면 subClass(자식클래스)가 상속 받을 수 없기 때문에
'protected' 접근 제한자를 사용하는 것도 방법이다.
Computer 클래스를 상속 받아 Notebook 클래스를 만들어보자💻
Computer.java
package chapter3.inheritance;
public class Computer {
protected String manufacturer;
protected String processor;
protected double ramSize;
protected double diskSize;
protected double processSpeed;
public Computer (String manufacturer, String processor, double ramSize, double diskSize, double processSpeed) {
this.manufacturer = manufacturer;
this.processor = processor;
this.ramSize = ramSize;
this.diskSize = diskSize;
this.processSpeed = processSpeed;
}
public String getManufacturer() {
return manufacturer;
}
public String getProcessor() {
return processor;
}
public double getRamSize() {
return ramSize;
}
public double getDiskSize() {
return diskSize;
}
public double getProcessSpeed() {
return processSpeed;
}
public String computerSpecToString() {
return "manufacturer: " + manufacturer + "\n"
+ "processor: " + processor + "\n"
+ "ramSize: " + ramSize + "\n"
+ "diskSize: " + diskSize + "\n"
+ "processSpeed: " + processSpeed + "\n";
}
public void printComputerSpec() {
System.out.println(computerSpecToString());
}
public void powerOn() {
System.out.println("컴퓨터가 실행되었습니다.");
}
}
Notebook.java
package chapter3.inheritance;
public class Notebook extends Computer{
public double screenSize;
public double weight;
public Notebook(String manufacturer, String processor, double ramSize, double diskSize, double processSpeed, double screenSize, double weight) {
super("Dell", "i5", ramSize, diskSize, 3.2);
this.screenSize = screenSize;
this.weight = weight;
}
public static void main(String[] args) {
Notebook test = new Notebook("Dell", "i5", 4, 1000, 3.2, 15.6, 1.2);
test.printComputerSpec();
}
}
Computer의 기본 속성은 Computer Class로 만들고 이를 상속받아 사용하고, 개별적인 속성은 자식 클래스에서 선언하여 사용하면 된다.
🔶 Implicit super constructor Computer() is undefined. Must explicitly invoke another constructor
모든 자식 클래스는 부모 클래스의 생성자를 먼저 호출한다.
부모 클래스에 매개변수를 받는 생성자가 있을 때, 부모 클래스의 생성자를 호출하지 않으면
'Implicit super constructor Computer() is undefined. Must explicitly invoke another constructor' error가 발생한다.
super(..)를 통해 부모 클래스의 생성자를 명시적으로 호출하면 이를 해결할 수 있다.
💙super >> 부모 클래스 접근 키워드
부모 클래스의 method가 자식 클래스와는 맞지 않는다면? 🤔
Computer클래스(부모 클래스)의 computerSpecToString()' method에는 Notebook클래스(자식 클래스)에 추가된 'screenSize', 'weight' member가 포함되어 있지않다.
'computerSpecToString()' method는 필요하지만 현재 Notebook 클래스에는 맞지않는다.
이럴 때는 부모 클래스의 method를 자식 클래스에서 재정의(Override)하면 된다.
Computer클래스(부모 클래스)의 'computerSpecToString()' method
public class Computer {
...
public String computerSpecToString() {
return "manufacturer: " + manufacturer + "\n"
+ "processor: " + processor + "\n"
+ "ramSize: " + ramSize + "\n"
+ "diskSize: " + diskSize + "\n"
+ "processSpeed: " + processSpeed + "\n";
}
...
}
Notebook클래스(자식 클래스)의 'computerSpecToString()' override method
public class Notebook extends Computer{
...
@Override
public String computerSpecToString() {
// super.computerSpecToString()을 호출하여 기존 computerSpec String data get
String spec = super.computerSpecToString()
// Notebook class에만 있는 member 추가
+ "screenSize: " + screenSize + "\n"
+ "weight: " + weight + "\n";
return spec;
}
...
}
🔶 Override 조건
-
부모의 메소드와 동일한 리턴 타입, 메소드 이름, 매개 변수 리스트를 가져야한다.
-
접근 제한을 더 강하게 오버라이딩할 수 없다. ex) 부모 public -> 자식 private 불가능
-
새로운 예외(Exception)을 throws할 수 없다
다형성(Polymorphism)
하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것.
부모 클래스 타입은 자식 클래스 타입의 객체를 참조할 수 있다
부모 클래스가 자식 클래스 타입의 객체를 참조하는 경우에는 자식 클래스의 member에는 접근할 수 없으며,
부모 클래스의 필드, 메소드만 접근이 가능하다.
만약 Override된 method가 존재할 때 부모 클래스 method와 자식 클래스 method 중 어떤게 호출될까?🤔
'computerSpecToString()' method와 같이 override된 method가 존재하는 경우에는 override된 method가 호출된다.
(dynamic binding)
왜 부모 클래스 타입은 자식 클래스 타입 객체를 참조할까?🤔
하나의 객체가 여러개의 자료형 타입을 가질 수 있기 때문에
레퍼런스 선언을 계속 할 필요가 없어 자원을 아낄 수 있다.
'JAVA' 카테고리의 다른 글
인터페이스(Interface)를 활용한 예제 (Scheduler Program) (1) | 2020.03.18 |
---|---|
추상화(abstract) 클래스를 활용한 예제 (Scheduler Program) (0) | 2020.03.18 |
다형성(Polymorphism)을 활용한 예제 (Scheduler Program) (1) | 2020.03.17 |
String.format() 자리수 맞추기 (1) | 2020.03.11 |
JDK 설치 / 환경 변수 설정 / Eclipse 설치 (0) | 2019.03.12 |