[Java] 상속, 다형성

이주형·2023년 5월 9일
0

Java

목록 보기
2/10

📌 상속

다른 클래스의 멤버 변수나 멤버 메서드를 자기 것처럼 물려받아 사용하는 개념이다.

자식 클래스의 객체를 생성하면 부모 클래스의 객체도 같이 생성되며, 부모 클래스의 요소(멤버 변수, 멤버 메서드)를 자기 것처럼 사용할 수 있다.

// 부모 클래스
class SuperClass {
	int memberC = 300;
	int memberD = 400;

	public void superMethod() {
		System.out.println("SuperClass의 superMethod 호출");
	}
}

// SuperClass를 상속받는다.
class SubClass extends SuperClass {
	int memberA = 100;
	int memberB = 200;

	public void subMethod() {
		System.out.printf("memberA : %d\n", memberA);
		System.out.printf("memberB : %d\n", memberB);
		System.out.printf("memberC : %d\n", memberC);
		System.out.printf("memberD : %d\n", memberD);

		subMethod2();
		superMethod();
	}

	public void subMethod2() {
		System.out.println("SubClass의 subMethod2 호출");
	}
}

📌 상속에서 생성자

// 상속에서의 생성자
// 클래스의 객체를 생성하면 생성자가 자동으로 호출된다.
// 이 때, 생성자에서 부모 클래스의 생성자를 자동으로 호출해주며
// 자동으로 호출되는 생성자는 매개변수가 없는 생성자이다.
class SuperClass2 {
	public SuperClass2() {
		System.out.println("SuperClass2의 기본 생성자");
	}
	
	public SuperClass2(int a1) {
		System.out.printf("SuperClass2의 매개변수 하나 있는 생성자 : %d\n", a1);
	}
}

class SubClass2 extends SuperClass2 {
	public SubClass2() {
		System.out.println("SubClass2의 기본 생성자");
	}
	
	// 만약 매개변수가 있는 생성자를 선택해 객체를 생성한다고 하더라도
    // 부모의 생성자 호출을 명시하지 않으면 부모의 생성자 중 매개변수가 없는
    // 기본 생성자가 호출된다.
    // 만약 부모의 생성자를 선택하고 싶다면 super를 사용한다.
    public SubClass2(int a1) {
        // 부모의 생성자를 명시적으로 지정한다.
        // 이게 없으면 부모 생성자중 기본 생성자가 호출된다.
        super(a1);
        System.out.printf("SubClass2의 매개변수 하나 있는 생성자 : %d\n", a1);
    }
}

📌 상속을 사용하는 이유

  1. 중복을 최소화하기 위해서
  2. 부모를 통해 자식에 접근하기 위해

1번 내용은 쉽게 알 수 있는 내용이고 2번 내용은 중요하니 밑에서 설명하겠다.

📌 다형성

객체 지향에서 다형성의 의미는 생성된 객체의 형태가 다양하다는 의미로 사용한다.

📌 Overriding

부모 클래스가 가지고 있는 메서드를 자식 클래스에서 다시 구현한 것을 가르킨다.

// SubClass를 가지고 객체를 만들어 SubClass형 변수에 담았기 때문에
// 객체 전체(부모 포함)에 접근할 수 있다.
SubClass sub1 = new SubClass();

// SubClass를 가지고 만든 객체의 ID를 부모클래스 타입의 변수에
// 담았기 때문에 접근할 수 있는 영역은 부모의 영역으로 제한된다.
SuperClass super1 = sub1;

super1.superMethod1();
// SuperClass 타입의 변수이기 때문에 부모의 메서드가 호출되어야 한다.
// 하지만 Overriding을 해서 자식클래스에 재 구현한 메서드가 호출된다. 

class SuperClass {
	public void superMethod1() {
		System.out.println("SuperClass의 superMethod1입니다.");
	}
}

class SubClass extends SuperClass {
	// 부모 클래스의 메서드를 overriding 한다.
	public void superMethod1() {
		System.out.println("SubClass의 superMethod1 입니다");
	}
}

위에 상속을 하는 이유 2번을 설명하면 부모 클래스형 참조 변수를 통해 객체에 접근하면 부모 클래스의 영역에 접근을 하지만 호출하려는 메서드가 Overriding 된 경우에는 자식 클래스에 재 정의한 메서드가 호출이 된다.

예를 들어보면 버튼을 클릭하는 공통의 메서드를 실행하는데 이 버튼 클릭으로 구매를 하는지, 장바구니에 담는지 등에 따른 구분을 하는데 쓸 수 있다.

0개의 댓글