[Java] 상속 , 오버라이딩

임혜정 ·2021년 6월 5일
0

Java

목록 보기
13/16

상속


자식class의 중복되는 코드를 부모 class에 담아주므로 코드의 중복이 발생하는것을 줄일 수 있다.

하위 class 의 동작방식을 모를때가 많기 때문에 , 부모 class로 Dog, Cat을 구동시키는 객체를 만든다.

부모 class 쪽으로 객체를 생성하는것이 훨씬 유익하다.


상속(inheritance) 개념


superclass: 부모 클래스 = 공통부분을 정의해 놓은 곳이다.
subclass: 자식 클래스 = 화살표로 상속을 받는다.

  • subclass는 superclass를 확장한것이다.

  • superclass의 속성과 method는 subclass에 상속된다.

  • subclass에는 고유한 속성과, method만 추가하면 된다. -> class 내용이 커진다

  • 재정의 가능하다 (수정가능하다 = 오버라이딩)

  • private으로 이루어진 것은 상속이 안된다.

즉, 상속을 받아서 사용할건 하고, extends 하여 수정도 가능하다.


상속 vs include 의 차이점 ?

  • include는 단순한 사용이다.
  • 상속은 단순한 사용이 아닌 extends 하여 구체화시키며 재정의가 가능하다.




extends의 의미


class A extends B {}

  • B : 일반화, 더 넓은 의미 = super class

  • A : B에 덧붙여 정의된다 = 더 구체적 = 더 좁은 의미

    • ex)
      • class Student extends Person{}
      • class Dog extends Animal{}



superclass의 생성자를 상속받는가?


정확하게 말하자면 superclass의 생성자는 상속 되지 않는다.

상속을 하려면, 준비를 해 놓고 상속을 해야한다.

즉, 상속을 하기위해서는 상속되는 객체가 존재 해야한다.
객체가 존재하기 위해서는 생성자가 불려야하는것을 꼭 기억하자.


1번: A의 객체를 생성할때, B가 먼저 만들어져야하므로 언급이 없을경우 자동생성한다.

class A extends B {
	// super(); // 부모생성자 명시적 호출
    
	//1번
	new A();
        
}

Q. class A { } 처럼 subclass 가 아니더라도 super(); 해주는가?

  • 딩동댕동
    • A는 subclass 라는 의미인데 extends를 안썼다?
    • 모든 class의 superclass 가 존재한다 : Object



다시 subclass, superclass를 왜 배우고 왜 상속 받는지에대해 생각해보기 !!
상속을 함으로써, 클래스를 구체적이고 적절하게 만들어 나간다.



Animal class

public class Animal {

  public void eat() {
    System.out.println("??");
  }

  public Animal() {
    super();
  }
}

Dog class

public class Dog extends Animal {

  // 재정의
  @Override
  public void eat() {
    System.out.println("개 eat ");
  }

  public Dog() {
    super(); // new Animal();
  }
}

Cat class

public class Cat extends Animal {

  @Override
  public void eat() {
    System.out.println("고양이 eat");
  }

  public void night() {
    System.out.println("고양이 night");
  }
}

상속 관계에서 객체 생성 방법


부모 클래스를 이용하여 간접적으로 생성하는 방법이 있다.

Animal d = new Dog();

d의 타입이 Animal 이기 때문에 Dog 객체를 생성했지만 Dog의 eat() 를 호출할 수 없다.

이때 이것을 가능하게 하는것이 Override 이다.


Override


재정의를 한다는것은 메모리에서의 부모와 자식간의 연결을 해주는 것이다.

부모는 항상 자신의 하위 class가 자기의 동작을 재정의 했는지 찾아본다.

따라서 양쪽에 같은 mehtod 가 정의되어있으면 subclass의 mehtod가 우선시 된다. (더 구체적이기 때문)


🙅🏻‍♀️ 주의사항 🙅🏻‍♀️

  • superclass에서 private으로 정의된 methods 는 override 할 수 없다.

  • static 그룹과 instance그룹은 별도로 취급된다.

    • subclass의 instance methods 는 superclass의 instance methods 만 오버라이딩 한다.
    • subclass의 static methods 는 superclass의 static methods 만 오버라이딩 한다.




Overriding vs Overloading


Overloading

같은 이름을 가진 메소드가 있더라도 인자의 개수, 타입이 다르면 같은 이름을 사용하여 method를 정의할 수 있다.

  • 같은 class 내에서 적용된다.

  • c에는 없다.

  • 인자가 다르면 구분이된다.

  • method 이름이 똑같다.

  • overloading 관계는 compile time 에 결정이 된다.(어떤것이 call 되는지!)

두함수의 인자는 서로 다르다
즉 두 함수의 이름은 같지만 서로다른 함수인것이다.
오버라이딩이 일어나는 관계가 아니다

class B {
		public void p (double i) {
			System.out.println(i*2);
		}
}
	
class A extends B {
		
	@Override
	public void p (double i) {
		System.out.println(i);
	}
}

 
public class Main {
	public static void main(String[] args) {
		A a = new A();
		a.p(10); //10.0
		a.p(10.0); //10.0
		
    }
}

Overriding

  • 상속관계에서 적용된다.
  • 상속과정에서 재정의를 하는것이다.

상속 받았기 때문에 B의 p가 아닌 A의 p가 불린다

class B {
		public void p (double i) {
			System.out.println(i*2);
		}
}
	
class A extends B {
	public void p (int i) {
		System.out.println(i);
	}
}

 
public class Main {
	public static void main(String[] args) {
		A a = new A();
		a.p(10); //10
		a.p(10.0); //20.0
		
    }
}




Object Class


모든 class는 extends Object 가 생략 되어있다고 볼 수 있다.

  • 모든 class를 하나의 root로 일반화 시킨다는 개념이다.

< 메소드 >
  • toString()
  • equals()
profile
포기하지 않고 끝까지 🐥

0개의 댓글

관련 채용 정보