목차

  • 상속이란?
  • 상속의 기능
  • 상속의 특징
  • 오버라이딩(Overriding)이란?
  • super과 super()

상속이란?

상속을 이해하기 위해서 하나의 예를 들어보겠습니다. 우리가 일상생활에서 부모가 자식한테 상속을 할 경우 자식은 부모의 재산을 사용할 수 있고 자기 자신의 재산도 사용할 수 있습니다. 즉 자바에서는 부모 클래스와 자식 클래스가 존재하는데 자식 클래스가 부모 클래스에 상속을 받을 경우 부모 클래스에 기능을 사용할 수 있고 자식 클래스에 있는 기능도 사용할 수 있습니다.

상속의 특징

  1. 공통 또는 중복되는 기능을 통일해 준다.
    -> 코드 중복 제거, 효율성 극대화
  2. 다형성을 부여한다.
  3. 부모 클래스는 여러 개의 자식 클래스에게 상속이 가능하다.
  4. 자바에서의 상속은 단일 상속만 가능하다. (부모가 두 명일 수 없습니다.)

상속을 할 때 주의할 점: 기능 중심이 아닌 속성 중심으로 정의해야 합니다.
(예를 들어 사람도 먹을 수 있고 개구리도 먹을 수 있는 기능이 있습니다. 기능이 같다고 해서 사람과 개구리를 상속관계로 정의하면 개구리에 부모가 사람 사람에 부모가 개구리가 될 수 있을까요? 이런 문제 때문에 상속은 기능 중심이 아닌 속성 중심으로 묶어야 합니다. 즉 개구리는 양서류 사람은 인간이라는 속성으로 묶어야 합니다.)

상속의 기능

상속의 기능을 사용할 때는 extends 예약어를 사용합니다.

예시)

class Parent { // 부모 클래스

	int age;

	void parentMethod() {

	}
}

class Child extends Parent { // 부모 클래스에서 상속받은 자식 클래스

	String name;

	void childMethod() {

	}
}

상속을 하는 방법은 class 자식 클래스명 extends 부모 클래스명 입니다.

예제)

class Parent { // 부모 클래스

	int parentVal = 10;

	void parentMethod() {
		System.out.println("parent Method");
	}

}

class Child extends Parent { // 부모 클래스에서 상속받고 자식 클래스 정의

	int childVal = 20;

	void childMethod() {
		System.out.println("child Method");
	}
}

public class ExtendsTest {

	public static void main(String[] args) {

		Child ch = new Child(); // 자식 클래스 인스턴스 생성

		System.out.println("ch.parentVal =" + ch.parentVal); // 부모 클래스 멤버 변수

		System.out.println("ch.childVal =" + ch.childVal); // 자식 클래스 멤버 변수

		ch.parentMethod(); // 부모 클래스 메서드 실행
		ch.childMethod(); // 부모 클래스 메서드 실행
	}

}

위에 코드를 보시면 부모 클래스에서 상속받은 자식 클래스는 부모 클래스에 기능도 사용 가능하고 자식 클래스에 기능도 사용 가능합니다.

오버라이딩(overriding)란?

오버라이딩(overriding)이란 부모 클래스에서 상속받은 자식 클래스가 부모 클래스에 기능을 그대로 사용하는 게 아니라 자식 클래스에서 자신에 맞게 기능을 재정의 하고 사용하는 것을 의미합니다. 예를 들면 시간이 지날수록 세상은 점점 발전하게 됩니다. 부모에 세대 보다 당연히 자식의 세대는 더욱 발전하게 되기 때문에 부모의 기능을 그대로 사용하는 게 아니라 자식은 부모의 기능에서 더욱 발전된 기능을 사용하게 되는 거지요. 이럴 때 오버라이딩(overriding)을 사용하는 것입니다.

예제) 자식 클래스에서 메서드를 재정의한 경우

class OverridingParent {

	int x = 10;

	void parentMethod() {
		System.out.println("parent");
	}
}

class OverridingChild {

	// 부모 클래스에 변수를 자식 클래스에서 재정의
	int x = 99;

	// 부모 클래스의 메서드를 자식 클래스에서 재정의
	void parentMethod() {
		System.out.println("parent -> child");
	}
}

public class Overriding {

	public static void main(String[] args) {

		OverridingChild oc = new OverridingChild();
		System.out.println("oc.x -> " + oc.x);
		oc.parentMethod();
	}

}

출력 결과:
oc.x -> 99
parent -> child

super과 super()

  • super : this는 자기 자신 객체를 가리키는 레퍼런스 변수인 반면 super는 무모 객체를 가리키는 레퍼런스 변수입니다.

  • super() : this()는 자기 자신 클래스의 다른 생성자를 호출하는 역할을 하는 예약어라면 super()는 부모 클래스의 생성자를 호출하는 역할을 합니다.

(즉 this와 this()는 자기 자신을 가리키고 super은 부모를 가리키는 역할을 하지만 동작은 동일합니다.)

예제) super 사용

//부모 클래스
class StudentParent {

	String name = "홍길동";
	int age = 25;

}

//보모 클래스에서 자식 클래스를 상속받는다.
class StudentChild extends StudentParent {

	String gender;

	StudentChild() {

	}

	StudentChild(String gender) { // 생성자를 이용해 멤버 변수를 초기화해준다.

		this.gender = "man";

	}

	public void childInfo() {
		// super를 사용해 부모 클래스의 name과 age를 가리키고 this를 사용해 자기 자신 멤버 변수인 gender를 가리키고 출력한다.
		System.out.println("이름: " + super.name + " 나이: " + super.age + " 성별: " + this.gender);
	}

}

public class SuperTest {

	public static void main(String[] args) {

		StudentChild sc = new StudentChild("man"); // 자식 클래스 객체 생성

		sc.childInfo();

	}

}

출력 결과:
이름: 홍길동 나이: 25 성별: man

예제) super() 사용

//부모 클래스
class StudentParent {

	String name;
	int age;

	StudentParent() {

	}

	StudentParent(String name, int age) { // 생성자를 통해 멤버 변수 초기화
		this.name = name;
		this.age = age;
	}

}

//부모 클래스에서 자식 클래스를 상속받는다.
class StudentChild extends StudentParent {

	String name;
	String age;
	String gender;

	StudentChild() {
		this("홍길동", 30, "man");
	}

	StudentChild(String name, int age, String gender) { // 생성자를 이용해 멤버 변수를 초기화

		// super()를 사용해 부모 클래스의 생성자를 호출하고 멤버 변수를 초기화
		super(name, age);
		this.gender = gender;

	}

	public void childInfo() {
		// super를 사용해 부모 클래스의 name과 age를 가리키고 this를 사용해 자기 자신 멤버 변수인 gender를 가리키고 출력한다.
		System.out.println("이름: " + super.name + " 나이: " + super.age + " 성별: " + this.gender);
	}

}

public class SuperTest {

	public static void main(String[] args) {

		StudentChild sc = new StudentChild(); // 자식 클래스 객체 생성

		sc.childInfo();

	}

}

super과 super()은 this와 this() 사용법과 동일하기 때문에 어렵지 않게 이해할 수 있을 겁니다.
이상으로 자바 상속, 오버라이딩, super,super()에 대해서 알아봤습니다. 잘못된 부분이나 부족한 부분 있으면 피드백 감사하겠습니다.!!!

profile
더 좋은 개발자가 되기위한 과정

0개의 댓글