본문 바로가기
들은 강의

[생활코딩 자바2] - 4.JAVA 상속(상속, Overriding, Overloading, this, super)

by hotdog7778 2023. 6. 6.

쉽게 배우는 자바2[생활코딩] - 공부 기록

해당 강의는 https://www.boostcourse.org/cs128 에서 무료로 수강 할 수 있다.


1. 수업소개

들어가기 전에

클래스도 클래스끼리 서로 관련성을 가질 수 있습니다.

이럴 경우 클래스의 상속을 이용하기도 하는데요,

상속은 무엇일까요? 간단한 예제를 통해 살펴봅니다.

학습 목표

클래스의 상속에 대해서 살펴봅니다.

핵심 단어

  • 상속 : 어떠한 클래스가 있을때 그 클래스가 가지고 있는 변수와 메소드를 상속해서 다른 클래스가 갖도록 하는것 그것을 통해서 재사용성을 높이고 유지보수의 편의성을 높이고 가독성을 높이고 코드의 양을 줄이는 목적을 달성할 수 있게 해줌.

강의 내용


2. 기능의 개선과 발전

들어가기 전에

상속은 일반적으로 좀 더 추상적인 부모 클래스와,

그 부모 클래스를 답습한 더 구체적인 자식 클래스로 구분됩니다.

청출어람이라고, 부모가 갖지 않은 것들을 자식 클래스가 하고

부모가 하는 것보다 더 잘 한다면 참 좋겠죠.

그렇게 하기 위해서 어떻게 하면 좋을지 간단한 예제를 통해 알아봅니다.

학습 목표

자식 클래스에 기능을 추가하는 법에 대해서 알아봅니다.

핵심 단어

  • 부모 클래스(superclass)
  • 자식 클래스(subclass)
  • 재정의(override)

강의 내용

class Cal {
	public int sum(int v1, int v2) {
		return v1 + v2;
	}
}
class Cal3 {
	public int minus(int v1, int v2) {
		return v1 - v2;
	}
	// 부모가 가지고 있는 기능을 덮어썻다. 라는 의미에서 Overriding
	public int sum(int v1, int v2) {
		System.out.println("cal3!!");
		return v1 + v2;
	}
}

public class InheritanceApp {

	public static void main(String[] args) {
		Cal c = new Cal();
		System.out.println(c.sum(3, 2));
		
		Cal3 c3 = new Cal3();
		System.out.println(c3.minus(3, 2));
		System.out.println(c3.sum(3, 2));
	}

}

3. Overriding, Overloading

들어가기 전에

지난 시간에 재정의(override)에 대해서 배워 보았습니다.

그런데 우리를 헷갈리게 하는 용어 중에는 overloading이라는 단어도 있습니다.

이 둘의 차이는 무엇일까요?

학습 목표

override와 overload의 차이에 대해서 알아봅니다.

핵심 단어

  • override
  • overload : 같은 이름의 메서드를 클래스 내에서 중복해서 생성하는 것

강의 내용

// 오버로딩. 너무 많이 과적하다.
class Cal {
	public int sum(int v1, int v2) {
		return v1 + v2;
	}
	public int sum(int v1, int v2, int v3) {
		return v1 + v2 + v3;
	}
}
class Cal3 {
	public int minus(int v1, int v2) {
		return v1 - v2;
	}
	// 부모가 가지고 있는 기능을 덮어썻다. 라는 의미에서 Overriding
	public int sum(int v1, int v2) {
		System.out.println("cal3!!");
		return v1 + v2;
	}
}

public class InheritanceApp {

	public static void main(String[] args) {
		Cal c = new Cal();
		System.out.println(c.sum(3, 2));
		
		Cal3 c3 = new Cal3();
		System.out.println(c3.minus(3, 2));
		System.out.println(c3.sum(3, 2));

		//오버로딩
		System.out.println(c.sum(3, 2));
		System.out.println(c.sum(3, 2, 1));
	}

}

4. This Super

들어가기 전에

우리는 지난 시간에 인스턴스의 참조로서 this 키워드에 대해서 알아 보았습니다.

이와 비슷하게 상속관계에 있는 부모 클래스를 가리키는 super 키워드도 있습니다.

이번 시간에는 super 키워드에 대해서 알아봅니다.

학습 목표

super 키워드에 대해서 알아봅니다.

핵심 단어

  • this
  • super

강의 내용

class Cal {
	public int sum(int v1, int v2) {
		return v1 + v2;
	}
	// 오버로딩. 너무 많이 과적하다.
	public int sum(int v1, int v2, int v3) {
		return v1 + v2 + v3;
	}
}
class Cal3 extends Cal {
	public int minus(int v1, int v2) {
		return v1 - v2;
	}
	// 부모가 가지고 있는 기능을 덮어썻다. 라는 의미에서 Overriding
	public int sum(int v1, int v2) {
		System.out.println("cal3!!");
		return super.sum(v1,v2);
	}
}

public class InheritanceApp {

	public static void main(String[] args) {
		Cal c = new Cal();
		System.out.println(c.sum(3, 2));
		
		Cal3 c3 = new Cal3();
		System.out.println(c3.minus(3, 2));
		System.out.println(c3.sum(3, 2));

		//오버로딩
		System.out.println(c.sum(3, 2));
		System.out.println(c.sum(3, 2, 1));
	}

}

5. 상속과 생성자

들어가기 전에

자식 클래스는 부모 클래스의 모든 것들을 상속받습니다.

생성자도 마찬가지인데, 이번 시간에는 이 생성자와 관련하여 주의해야 할 점을 배워 봅니다.

학습 목표

상속에서의 생성자 규칙에 대해서 알아봅니다.

핵심 단어

  • 상속
  • 생성자

강의 내용

자식클래스가 인자를 받는 기본 생성자를 가진 부모클래스를 상속할 경우,

자식클래스도 기본클래스가 필요하고 그안에 super를 써서 부모클래스를 지정해준다?

class Cal {
	int v1, v2;
	Cal(int v1, int v2){
		this.v1 = v1; this.v2 = v2;
		System.out.println("Cal init");
	}
	public int sum() {
		return this.v1 + v2;
	}
}
class Cal3 extends Cal {
	//상속 받은 클래스의 부모가 생성자가 있다면 자식은 반드시 부모생성자를 실행시키도록 강조하고 있다.
	Cal3(int v1, int v2) {
		super(v1, v2);
		// TODO Auto-generated constructor stub
		System.out.println("Cal3 init");
	}
	public int minus() {
		return this.v1 - v2;
	}
}

public class InheritanceApp {
	public static void main(String[] args) {
		Cal c = new Cal(2,1);		
		Cal3 c3 = new Cal3(2,1);
		System.out.println(c3.sum());
		System.out.println(c3.minus());
	}

}

6. 수업을 마치며

들어가기 전에

상속이라는 어려운 주제에 대해서 다뤄 보았습니다.

이번 시간에는 앞으로 배울 주제에 대해서 소개하는 시간을 가져 봅니다.

학습 목표

앞으로 어떤 주제를 더 공부할 수 있을지 알아봅니다.

핵심 단어

  • 다형성(polymorphism)
  • 접근 제어자
  • Final
  • Abstract class

강의 내용

다형성(polymorphism)은 상속 관계에 있는 클래스간의 호환성을 높여주는 기능입니다.

우리가 인스턴스를 생성할 때, 같은 클래스의 자료형을 가진 변수를 선언하여

인스턴스를 생성해 왔습니다.

그런데 부모 클래스의 자료형을 가진 변수를 선언하여 자식 클래스의 인스턴스를 생성할 수 있습니다.

그렇게 생성한 변수에서 자식 클래스의 변수나 메소드를 호출할 수 있습니다.

접근 제어자(access modifier)는 우리가 public과 private에 대해서 이미 알아본 바가 있습니다.

접근 제어자에는 이 외에도 default, protected라는 두 개의 접근 제어자가 더 있습니다.

default의 경우 같은 패키지 내의 클래스에서는 접근할 수 있는 권한이 있고,

protected의 경우 해당 클래스와 자식 클래스를 통해서 접근할 수 있습니다.

final 키워드는 상속과 관련하여 제한을 걸어주는 키워드 입니다.

만약 현재 클래스에서 더 이상 자식 클래스를 생성하지 못하게 막기 위해서는

클래스에 final 키워드를 삽입합니다.

그리고, 메소드가 자식 클래스에서 더 이상 오버라이드 되기를 원하지 않는다면

메소드에 final 키워드를 삽입합니다.

abstract 키워드는 해당 클래스, 메소드가 재정의가 필요하다는 것을 강제하는 키워드 입니다.

abstract 메소드는 선언만 되어 있는 상태이고, abstract 클래스는 인스턴스로 만들 수 없습니다.

만약 클래스 안에 abstract 메소드가 있다면 그 클래스는 abstract 클래스여야 합니다.