백지부터 시작하는 이세계 코딩 생활
Inheritance & Polymorphism 본문
<상속> - Extension
// 객체지향의 꽃. 동적바인딩을 구현케 한다.
기능을 연계받아 체계화를 시키는것이 궁극적인 목적.(그래서 Java에서 많이 중요함)
// 일종의 Extend(확장개념,멀티)
// 상속받은 element는 Super class와 sub class에서 모두 사용가능하다.
// 각각의 sub는 서로 별개로 작용한다. 오직 Super class 와 sub class 사이에서만 영향이 생긴다. (표시는 화살표 역방향으로함: Super <- sub)
// **주의 : 생성자는 상속되지 않는다.(임의의 호출은 가능)
// 상속을 받아도 접근지정자가 private 속성은 사용할 수 없다.
// 상속의 개념은 실행문을 이어받는 것임.(이벤트,기능 연계)
// 상속을 이용할 시 코드 간편화를 할 수 있음.(구조적으로 copy-paste 보단 체계(타입)를 세울 수 있음 . 안정성 향상도 있고.)
// 동적바인딩(up casting, down casting)
// tip:: 디자인패턴** 실력향상에 1등공신이 될 수 있다
// 패턴 => mvc, 팩토리 , 템플릿, 전략 매서드 등이 있음. <- Spring에 다 포함됨.
// 사용법 : 있는 내용을 상속(Extend)시키고 필요한 부분만 추가해서 코드를 완성한다.
<접근 지정자>
// public < protected < default(기본접근지정자) < private 식으로 필요한 접근레벨이 높아진다.
// 어디서든 < 하위 클래스까지(상속받은것 :가능) < 같은 패키지까지 < 자신의 클래스만. 와 같이 허용범위가 정해짐.
// 상속받았을 때 protected 지정자는 사용가능.
// 외부에서는 setter, getter 를 이용하여 접근할 수 있음.
// 같은 클래스 내에서 인자있는 생성자를 통해서 사용할 수 있음.
<매서드 오버라이딩>
// Extend된(상속받은) 변수들을 재정의 하는 기능을 뜻함.
// 매겨변수와 타입과 개수도 같아야함.
// super 접근 제어보다 더 작아질 수 없다(접근 허용 레벨이 super에서 보다 더 높아질 수 없다.)
// super class의 생성자가 호출 우선순위를 가진다. (super 클래스의 생성자가 연속적으로 자동 호출됨)
// 소멸될 때는 후입선출에 따라 sub class가 우선순위를 가진다. (스택 시스템)
// this()를 사용하기 위해서는 super(); 작업이 필요하다. : default 생성자 호출부분.
// 타입의 크기는 super class > sub class 관계를 가진다. (기본개념)
<인스턴스 : 객체>
// instanceof 연산자 :
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용하는 연산자.
주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치함.
연산의 결과로 boolean값인 true, false 중의 하나를 반환함.
instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻함.
// final 예약어 = 상수(값 변경 불가를 의미)
// 업캐스팅, 다운캐스팅 : super와 sub 각각의 클래스에서 각 기능에 서로 접근가능하게 하기 위해 쓰는 코드.
// class에 final을 붙여주면 extends 하지 않겠다는 의미.
// method에 final을 붙이면 오버라이딩 불가를 의미.
// 각각의 class들의 공통사항을 super class에 모아서 사용할 수 있는 방법도 좋다.
// super class는 sub class의 변수를 참조할 수 없다.
// 왜냐하면 sub class로 받았다는 것은 super class의 기능을 확장받아 추가로 기능을 만들어주었기 때문.
// 관계없는 class들은 서로 업,다운 캐스팅이 불가능하다.
// cf. 하나의 패키지에서 클래스를 선언하면 하드웨어에 클래스 파일은 각각으로 나눠서 만들어진다.
package s0512;
class Point2D {
// 외부에서 쓰려면 public을 붙여주면 된다.
int x, y; // default 생성자가 없으면 sub class에서 호출될 때 에러를 발생시킨다.
// sub class는 extend 시에 super class의 default 생성자를 무조건 호출하기 때문이다.
public Point2D() {
System.out.println("Point2D 생성");
}// end
// 상속 예제
void showPoint() {
System.out.printf("%d, %d", x, y);
}// end
}//
class Point3D extends Point2D {
int z;
// super class 생성자를 먼저 호출함. 그 후 sub class 생성자를 호출함.
// super 객체가 먼저 생성됨을 의미.
public Point3D() {
super();
System.out.println("Point3D 생성");
}
// 매서드 오버라이드 (재정의)
void showPoint() {
super.showPoint(); // super class의 showwPoint
// System.out.printf("%d,%d,%d,\n", x, y, z);
System.out.printf(", %d\n", z); // 이때 결과는 동일함. => 199, 1, 200
}// end
}//
public class Ch14Ex01_extends_연습 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Point3D p3d = new Point3D();
p3d.x = 199;
p3d.y = 1;
p3d.z = 200;
p3d.showPoint();
}// end
}//
package s0512;
class Student{
String name;
int StudNumber;
String major;
}//
//확장 받는 클래스가 앞에 나오고 확장해주는 클래스가 뒤에. (Super <-Sub 표시기 때문?)
class assistStudent extends Student{
int pay;
String affiliation;
void showStudent() {
System.out.printf("%s,%d,%s,%d,%s",name,StudNumber,major,pay,affiliation);
}//end
@Override
public String toString() {
return "assistStudent [pay=" + pay + ", affiliation=" + affiliation + "]";
}//end
}//
public class Ch14Ex02_Extends_예제 {
public static void main(String[] args) {
assistStudent assiStud = new assistStudent();
assiStud.name = "PHU";
assiStud.StudNumber = 199;
assiStud.major = "Physics";
assiStud.pay = 200;
assiStud.affiliation = "gde";
assiStud.showStudent();
}//end
}//
// <작업순서>
// 학생클래스 만들기. (element: 학번 이름 전공)
// 학생클래스를 확장한 근로학생 클래스 만들기.(element: 급여 소속)
// 근로학생 클래스 이용한 객체 선언.
// 값 넣고, 프린트.