2020. 4. 26. 18:14ㆍ인프런/웹개발 코스 [JAVA 개발언어]
상속
상속이란 객체지향 프로그램의 특성 중에 하나로 밑의 사진을 보면 이해하기 편합니다.
위의 사진처럼 상자 하나하나가 모두 객체(object)이며 자바 용어로 class입니다. 이러한 계층을 표형 하기 위해 만들어진 것이 상송이며 하위 객체는 상위 객체의 특징을 물려받습니다.
예시로 동물의 특징은 "움직이다' 입니다 포유류, 조류, 파충류는 그대로 물려받는다. 즉. move()라는 메서드를 포유류,. 조류, 파충류 객체가 모두 사용할 수 있다는 뜻입니다.
또 다른 예로 변수 또한 객체에 선언되어 있다면 물려받게 됩니다 나이라는 변수가 동물 객체에 선언이 되어있다면 물려받게 됩니다.
이 메서드 OR변수를 구현하는가 그대로 '사용'하는가에 따라서 상속의 현태가 갈리게 됩니다.
- extends
부모에서 선언/정의를 모두 하며 자식은 메서드/변수를 그대로 사용할 수 있습니다. - implements(interface구현)
부모 객체는 선언만 하며 정의(내용)는 자식에서 오버 라이딩(재정의)해서 사용해야 합니다 - abstract
extends와 interface의 혼합으로 extends 하되 몇 개는 추상 메서드로 구현되어 있습니다.
extends (상속)
사실 extends가 상속의 대표적인 형태입니다. 그리고 부모의 메서드를 그대로 사용할 수 있으며 오버 라이딩할 필요 없이 부모에 구현돼있는 것을 직접 사용 가능합니다.
class Vehicle {
protected int speed = 3;
public int getSpeed(){
return speed;
}
public void setSpeed(int speed){
this.speed = speed;
}
}
class Car extends Vehicle{
public void printspd(){
System.out.println(speed);
}
}
public class ExtendsSample {
public static main (String[] args){
Car A = new Car();
System.out.println(A.getSpeed());
A.printspd();
}
}
위의 코드를 보면 Car라는 클래스는 Vehicle을 상속받았습니다 그리고 getSpeed() 메서드로 speed를 print 했습니다.
그런데 vehicle의 getSpeed 메서드에서 speed를 직접 바로 사용했습니다. extends를 했으니 메서드뿐만 아니라 변수까지 사용이 가능해지는 것입니다. 여기서 접근 제어자에 대해 다시 설명하지면
public | protected | default | private |
ALL | 상속 OR 동일패키지 | 상속 && 동일패키지 | 클래스 내부 |
그리고 자바는 다중 상속을 지원하지 않습니다 여기서 다중 상속이란 부모 클래스가 두 개 이상 존재할 수 있다는 것입니다 자바에서는 지원하지 않는다 즉 public class Son extends Father, Mother {...}
자바는 다중 상속을 지원하지 않습니다 대신 implements(인터페이스)가 등장했습니다.
implements (상속)
interface TestInterface{
public static int num = 8;
public void fun1();
public void fun2();
}
class InterfaceExam implements TestInterface{
@Override
public void fun1(){
System.out.println(num);
}
@Override
public void fun2() {
}
}
public class InterfaceSample{
public static void main(String args[]){
InterfaceExam exam = new InterfaceExam();
exam.fun1();
}
}
implements의 가장 큰 특징은 이렇게 부모의 메서드를 반드시 오버 라이딩(재정의) 해야 합니다.
또한 이 implements는 다중 상속을 대신해줍니다.
public class Son implements Father, Mother{...}
이러한 형태로 사용할 수 있습니다.
실습
그럼 부모와 자식 클래스를 가져와 출력하는 것을 만들어 보겠습니다
package JavaTest01;
/*부모 클래스및 상위 클래스*/
public class Vehicle {
protected String model = "HOGGILDONG";
public void sound()
{
System.out.println("경적을 울렸습니다.");
}
}
처음에는 부모 클래스입니다. 이 클래스를 protected를 사용하여 자식 클래스에 가져올 수 있도록 하였고 public을 사용하여 함수로 만들어주었습니다.
package JavaTest01;
/*자식 클레스 및 하위 클래스*/
public class Car extends Vehicle{
public String handle = "";
public void run() {
System.out.println("달립니다");
}
}
두 번째는 자식 클래스입니다.
public class Car extends Vehicle을 사용하여 부모 클래스인 Vehicle를 가져옵니다. 다음으로 함수를 만들어줍니다.
참고로 위의 코드 중에부모 클래스인 vehicle과 자식 클래스인 Car가 상속받은 것을 자바 용어로 IS-A 관계라고 하며 이것을 클래스에 대입하였을 때Car is a vehicle 같이 말할 수 있는 관계를 IS-A 관계라고 합니다.
이렇게 IS-A 관계(상속관계)에 있을 때 자식 객체는 부모 클래스의 자료형인 것처럼 사용할 수 있습니다
package JavaTest01;
public class JavaTest {
public static void main(String[] args) {
Car car = new Car();
System.out.println("상위클레스의 요소"+car.model);
car.sound();
System.out.println("자식클레스의 요소"+car.handle);
}
}
마지막으로 자식 클래스인 Car을 가져와서 출력해줍니다 위의 사진을 보면 부모 클래스에 있는 값을 자식 클래스가 가져와 출력되는 것을 볼 수 있습니다. 단 패키지가 다를 경우에는 출력을 할시 가져올 수 없습니다 만약 다른 패키지의 파일을 출력하고 싶으면 그파 일을 부모 클래스에서 상속을 하여 보여줄 수 있습니다
자바의 최상위 클래스
package JavaTest01;
/*부모 클래스및 상위 클래스*/
public class Vehicle extends Object {
protected String model = "HOGGILDONG";
public void sound()
{
System.out.println("경적을 울렸습니다.");
}
}
자바에서 만드는 모든 클래스는 Object라는 클래스를 상속받게 되어 있습니다 사실 방금 만든 vehicle 클래스는 다음과 기능적으로 완전히 동일합니다 하지만 굳이 위의 코드처럼 Object 클래스를 상속하도록 코딩하지 않아도 자바에서 만들어지는 모든 클래스는 Object 클래스를 자동으로 상속받게끔 되어있습니다.
Object vehicle = new Vehicle();
Object car = new Car();
따라서 자바에서 만드는 모든 객체는 Object 자료형으로 사용할 수 있습니다 즉 위의 코딩처럼 하는 것이 가능합니다.
간단 정리
- extends는 일반 클래스와 abstract 클래스 상속에 사용되고, implement는 interface 상속에 사용됩니다.
- class가 class를 상속받을 땐 extends를 사용하고, interface가 interface를 상속받을 땐 extends를 사용합니다.
- class가 interface를 사용할 땐 implements를 써야 하고
- interface가 class를 사용할 땐 implements를 쓸 수 없습니다.
- extends는 클래스 한 개만 상속받을 수 있습니다
- extends 자신 클래스는 부모 클래스의 기능을 사용합니다.
- implements는 여러 개 사용 가능합니다.
- implements는 설계 목적으로 구현 가능합니다.
- implements 한 클래스는 implements의 내용을 다 사용해야 합니다.
extends는 클래스를 확장하는 거고 implements는 인터페이스를 구현하는 것입니다.
인터페이스와 보통 클래스의 차이는 인터페이스는 정의한 메서드를 구현하지 않아도 됩니다.
인터페이스를 상속받는 클래스에서 인터페이스에 정의된 메소드를 구현하면 됩니다.
참고 수업 링크
https://www.inflearn.com/course/%EC%9B%B9%EA%B0%9C%EB%B0%9C-%EA%B8%B0%EC%B4%88-java#curriculum
'인프런 > 웹개발 코스 [JAVA 개발언어]' 카테고리의 다른 글
추상화 (0) | 2020.04.27 |
---|---|
다형성 (0) | 2020.04.27 |
캡슐화 (0) | 2020.04.26 |
객체지향 프로그래밍 (0) | 2020.04.26 |
함수 (0) | 2020.04.26 |