Java - Inheritance

iseon_u·2022년 4월 30일
0

Java

목록 보기
24/77
post-thumbnail

Inheritance 상속


  • 기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것

구조

class Parent {}
class Child extends Parent {}
  • extends 키워드 사용
  • Parent 클래스와 Child 클래스는 상속 관계
  • 자손은 조상 (부모의 부모) 의 모든 멤버를 상속 받는다. (생성자, 초기화 블럭 제외)
  • Child 객체가 생성 되기전에 Parent 객체가 자동 생성


class Parent {
		int age;
}
// 부모 클래스 멤버 개수 1개
class Child extends Parent {}
// 상속 받은 멤버 개수 1개 (age)
  • 자손의 멤버 개수는 조상보다 적을 수 없다. (같거나 많다.)

class Parent {
		int age;
}
// 부모 클래스 멤버 개수 1개
class Child extends Parent {
		void play() {
				System.out.println("Play");
// 자신 멤버 1개, 상속 받은 멤버 1개, 총 2개
		}
}

  • 자손의 변경은 조상에 영향을 미치지 않는다.

class Point3D {
		int x;
		int y;
		int z;
}

객체 생성 결과는 똑같다. 1️⃣

Point3D p = new Point3D( );

class Point {
		int x;
		int y;
}
class Point3D extends Point {
		int z;
}

객체 생성 결과는 똑같다. 2️⃣

Point3D p = new Point3D( );

  • Point3D 클래스는 Point 클래스에 상속 받고 있기 때문에 영향을 받음
  • 부모 클래스 변경 사항이 자식 클래스에 반영된다.

Composite 포함 관계

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
class Circle {
		int x;
		int y;
		int r;
}
void call(){
	Circle c = new Circle();
	c.x = 0;
	c.y = 0;
	c.r = 0;
}

구조적 차이가 생긴다. 1️⃣

class Point {
		int x;
		int y;
}
class Circle {
		Point c = new Point();
		int r;
}
void call(){
	Circle c = new Circle();
	c.r = 0;
	c.c.x = 0;
	c.c.y = 0;

구조적 차이가 생긴다. 2️⃣

클래스 간의 관계 결정 (상속 vs 포함)

자연스러운 문장으로 결정

  • 상속 관계 (꼭 필요할 때만 사용)
    • A 는 B 이다. (is-a)
  • 포함 관계 (대부분 포함 관계 사용)
    • A 는 B 를 가지고 있다. (has-a)

단일 상속

  • Java 는 단일 상속만을 허용한다.
class Car extends Hyundai~~, Kia~~ {} // 에러, 조상 하나만 허용

  • 다중 상속시 일어날 수 있는 충돌
  • 인터페이스를 이용하면 다중 상속 효과 가능
  • 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

Object 클래스

  • 모든 클래스의 조상
  • 부모가 없는 클래스는 자동적으로 Object 클래스를 상속 받는다.
  • 모든 클래스는 Object 클래스에 정의된 11개 메서드를 상속 받는다.
class Car {}
class Tesla extends Car {}
// 컴파일러 자동 추가
class Car extends Object {}
class Tesla extends Car {}

Overriding 오버라이딩

  • 상속 받은 조상의 메서드를 자신에 맞게 변경하는 것
  • 선언부 제외하고 구현부 {} 만 변경 가능
  • 기존 메서드도 상속을 받음
class Point {
		int x;
		int y;

		String getLocation() {
				return "x:" + x + ",y:" + y; // 기존 메서드
class Point3D extends Point {
		int z;
	
		String getLocation() {
				return "x:" + x + ",y:" + y + "z:" + z; // 오버라이딩

오버라이딩 조건

  • 선언부 (반환 타입, 메서드 이름, 매개변수 목록) 가 조상 클래스의 메서드와 일치해야 한다.
  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

오버로딩 vs. 오버라이딩

  • 오버로딩
    • 기존에 없는 새로운 메서드를 정의
  • 오버라이딩
    • 상속받은 메서드의 내용을 변경!!
profile
🧑🏻‍💻 Hello World!

0개의 댓글