본문 바로가기
Develope_Web&App/01_Java & JavaFX

[Java의 정석] 객체지향 2- 1상속

by 스타트업_디벨로퍼 2021. 2. 3.

상속

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

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

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) {

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형