상속
- 기존의 클래스로 새로운 클래스를 작성하는 것. (코드의 재사용)
- 두 클래스를 부모와 자식으로 관계를 맺어주는 것.
class Parent{}
class Child extends Parent{
}
- 자손은 조상의 모든 멤버를 상속받느다. (생성자, 초기화 블럭 제외)
- 자손의 멤버 개수는 조상보다 적을 수 없다.( 같거나 많다.)
- 부모 클래스보다 커지면서 확장되기에 extends를 슨다!!
package chap07;
public class Point {
int x;
int y;
}
class Point3D {
int x;
int y;
int z;
}
class Points3D extends Point{
int z;
}
위처럼 상속을 통해 진행하면, 보다 간결하게 만들어낼 수가 있다!!
포함이란?
- 클래스의 멤버로 참조변수를 선언하는 것
- 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.
class Circle {
int x;
int y;
int r;
}
class Circle { // 포함관계
Point c = new Point();
int r;
}
class Car {
Engine e = new Eigine();
Door[] d = new Door[4];
}
상속 관계 : '~은 ~이다.(is -a)'
포함 관계 : '~은 ~을 가지고 있다. (has-a)' ex) 원은 점이다 보다는 원은 점을 가지고있다가 맞음!
상속은 꼭 필요한 경우에만 넣는다.!! 대부분은 포함이다(90%)
단일 상속
- 자바는 단일 상속 만을 제공한다. (다중 상속의 경우 충돌의 문제점을 갖고 있기 때문)
- 인터페이스를 이용하면 다중 상속이 가능하다!!
- 하나만 상속 관계로 하고, 나머지는 포함 관계로 해도 된다.!!
class TV {
boolean power;
int channel;
void power() { power = !=power;}
void channelUp() { ++channel;}
void channelDown() { --channel;}
}
class DVD {
boolean power;
void power() {power !=power;}
void play() { }
void stop() {}
void now() {}
void ff() {}
}
class TvDVD extends TV {
DVD dvd = new DVD();
void play() {dvd.play;}
void stop() {dvd.stop;}
void rew() {dvd.rew;}
void ff() {dvd.ff;}
}
TV를 상속하고, DVD 객체 만들어서 호출해서 포함해버릴 수 있다.
Object 클래스 - 모든 클래스의 조상
- 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
- 모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받는다.
toString(), equal(Object obj), hashCode(), ...
오버라이딩
- 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
class Point {
int x;
int y;
String getLocation() {
return "x : " + x + ", y : " + y;
}
class Point3D extends Point {
int z;
String getLocation() { //오버라이딩( 내용(구현부)만 변경 가능함.)
return "x :" + x + ", y :" + y + ",z : " + z;
}
}
}
- 의미상 같은일 을 하기 위해서 메서드를 통일 시켜준다!! - > 그래서 오버라이딩이 필요함.
조건
1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
오버로딩 : 기존에 없느 새로운 메서드를 정의하는 것(new)
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod () {} //오버라이딩
void parentMethod (int i) {} //오버로딩
void childMethod () {} //메서드 정의
void childMethod (int i) {} //오버로딩
void childMethod () {} //중복정의
}
참조 변수 Super
- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에서만 존재
- 조상 멤버를 자신의 멤버와 구별할 때 사용
class Ex7_2 {
public static void main(String args[]) {
Child d = new Child();
c.method();
}
}
class Parent { int x = 10;}
class Child extends Parent {
int x =20;
void method() {
System.out.printnln("x=" + x);
System.out.printnln("this.x=" + this.x);
System.out.printnln("super.x=" + super.x);
}
}
//x=20
//this.x=20
//super.x=10
-> super 또한 this 처럼 lv, iv를 구분하기 위한 것이다!!
super() - 조상의 생성자
- 조상의 생성자를 호출할 때 사용
- 조상의 멤버는 조상의 생성자를 호출해서 초기화
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Point3D(int x, int y, int z) {
super(x,y); //조상 클래스의 생성자 Point(int x, int y)를 호출
this.z = z; // 자신의 멤버를 초기화
}
- 생성자의 첫 줄에 반드시 생성자를 호출해야 한다--
-그렇지 않으면 컴파일러가 생성자의 첫 줄에 super()를 삽입한다.
class Point {
int x;
int y;
Point() {
this(0,0);
}
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Point extends Object {
int x;
int y;
Point() {
this(0,0);
}
Point(int x, int y) {
super(); //Object();
this.x = x;
this.y = y;
}
}
중요한 예제!! -> 모든 생성자는 첫줄에 다른 생성자를 꼭 호출해야 한다!!
class Point {
int x;
int y;
Point (int x, int y) {
this.x=x;
this.y=y;
}
Stirng getLocation() {
return "x :" + x + ", y :" + y;
}
}
class Point3D extends Point {
int z;
Point3D (int x, int y, int z) {
//super();
this.x=x; //super(x,y);로 하는 게 맞다
this.y=y;
this.z=z;
}
Stirng getLocation() {
return "x :" + x + ", y :" + y;
}
}
class PointerTest {
public static void main(String args[]){
Point 3D p3 = new Point3D(1,2,3);
}
}
// symbol : constructor Point()
// location : class Point
// Point3D(int x, int y, int z) {
'Develope_Web&App > 01_Java & JavaFX' 카테고리의 다른 글
[Java의 정석] 객체지향 2-3 (0) | 2021.02.04 |
---|---|
[Java의 정석] 객체지향 2-2 (0) | 2021.02.04 |
[Java의 정석] 객체지향 1-1 (0) | 2021.02.03 |
[Java의 정석] 객체 지향 1 (0) | 2021.02.03 |
[java] string 변환시키기 (0) | 2021.01.27 |