[JAVA]상속과 오버라이딩, 오버로딩

신동혁·2022년 8월 12일
0

JAVA

목록 보기
4/16

상속

1. 목적

  • 코드의 재사용성이 주 목적
  • 개발시간 단축, 유지보수 및 추가개발 용이

2. 내용 및 방법

  • 부모 코드가 보유하고 있는 '멤버변수, 메서드'를 자식 코드에게 제공
    ※ '생성자, static{},private요소,패키지가다를경우default요소'은 자식에게 상속하지 않는다!!!
  • 상속받은 메서드의 내용을 수정하는 것을 '메서드 재정의' 혹은 '오버라이딩'이라고 표현한다. 이때 메서드의 이름이나 반환타입은 변경 불가능하고 부모와 동일하게 가져가야 한다.
  • java.lang.Object : 모든 class의 root로 모든 클래스들은 이 클래스의 메서드들을 상속받는다. 따로 작성안해도 알아서 상속된다.

<상속받는 형식(명시적 상속)>
==> class 자식클래스명 extends 부모클래스 { }
: 즉, 자식클래스를 선언할 때 extends 를 이용해 상속받을 부모클래스를 알려주는 것이다. 또한 위에서 Object는 따로 작성안해도 알아서 상속된다고 했는데, 일반적인 형태로 'class 클래스명 { }'로 클래스를 구현하면 'class 클래스명 extends Object { }'와 같은 형태라는 뜻이다.

3. super

기본적으로 생성자의 첫 라인에 자동 반영되고, 개발자가 명시적으로 개발해도 된다. super은 상위 부모의 파라미터가 일치하는 생성자를 호출한다.
ex)

package step01.basic;

class Parent2 extends Object {
	Parent2() { //1번 부모 생성자
		super();
		System.out.println("Parent2()");
	}

	Parent2(String n, int a) { //2번 부모 생성자
		name = n;
		age = a;
		System.out.println("Parent2(String n, int a)");
	}
}

public class Child2 extends Parent2 {
	public Child2() {
		super(); //파라미터가 없는 1번 부모 생성자를 호출
	}

	public Child2(String job) {
		super(); //파라미터가 없는 1번 부모 생성자를 호출
	}

	public Child2(String n, int a, String job) {
		super(n, a); //파리미터가 2개인 2번 부모 생성자를 호출
	}


}

4. 메서드 재정의(Overriding)

  • super.부모메서드명 : 부모 메서드를 그대로 가져올 수 있다. 이때 반환타입과 메서드명은 변경하지 못한다.
  • @Override 애노테이션(데코레이션)을 사용해 재정의 할 것을 알려줄 수 있다. @Override 다음에 재정의를 하지 않으면 컴파일 오류가 생긴다.

형식 :
부모메서드반환타입 부모메서드명 ( ) {
super.부모메서드명();
~ 재 정 의 파 트 ~
}

5. 다중정의(Overloading)

  • 하나 이상의 생성자, 메서드를 구현하는 것

6. 실행순서

  • 컴파일 순서 : 부모클래스부터 컴파일
  • 실행 순서 : 자식클래스부터 실행

7. 다형성

  • 상속 전제인 구조에서만 성립
  • 다양한 형태를 보유할 수 있는 구조 : 상위타입의 변수는 모든 자손타입 객체 참조
  • 상위타입 변수 = 자손타입객체;
    ex)
    Object 부모 / Stirng 자식
    Object o = "안녕" =>가능
    Object o = new Child3(); => 가능
    하지만 이런식으로 객체를 만들경우 자손만의 멤버는 호출이 불가해진다.
    ex)
    Child c = new Child(); ---> 부모멤버변수, 자식멤버변수 호출 가능
    Parent c = new Child(); ---> 부모멤버변수 호출 가능, 자식멤버변수 호출 불가능!
    이때 사용하는 것이 참조타입 형변환이다.
  • 형변환(참조타입간)
    - 기본자료형에서 형변환은 size기준으로 변환해주지만, 객체자료형에서 형변환은 상위타입, 하위타입 기준으로 변환한다.
    - ex)
    Parent c = new Child(); --->묵시적형변환(upcasting)
    Child4 d = (Child4)c; 이렇게 명시적형변환(downcasting)
    - 위 예제 'Child4 d = (Child4)c;' 에서 새로운 Child4개체를 만든 것이 아닌 이미 있는 객체 Parent c의 Child4부분을 가리키는 변수 d만 추가해준 것이다.

7.1 다형성의 필요성

부모클래스와 자식클래스가 있을 때 부모메서드의 파라미터로 부모메서드를 받을 경우, 자식클래스를 넣어도 되므로 재사용성이 커진다. 이런 이유로 다형성이 필요하다.

profile
개발취준생

0개의 댓글