열렬히.뛰기

상속과 포함

Language > 프로그래밍 언어 > Java > 상속과 포함

상속이란?

기존의 클래스를 재사용해 새로운 클래스를 만드는 것.

보다 적은 양의 코드로 새 클래스를 작성할 수 있음.

또한 코드의 공통적인 관리가 가능하기에 추가 및 변경이 용이.

자바에서의 상속

다음과 같이 class 뒤에 extends라는 키워드를 붙이면 된다.

java
class 42ecole {
}

class 42seoul extends 42ecole {
}
  • 42ecole 클래스를 부모 클래스라고 한다.
  • 42seoul 클래스는 자식 클래스라고 한다.

클래스 간의 상속 관계를 상속계층도로 표현할 수 있다.

상속의 대상

우리는 지금까지 클래스 안에 다음과 같은 것들이 있다고 배웠다.

  1. 메소드
  2. 멤버변수
  3. 생성자
  4. 초기화 블록

이 중에서 메소드와 멤버변수는 상속되지만, 나머지는 상속되지 않는다.

만약 부모 클래스 안에 멤버변수가 추가되면, 자식클래스에도 그 멤버변수가 자동적으로 추가된다.

그러나, 반대로 자식 클래스 안의 멤버변수/메소드는 부모클래스에 적용되지 않는다.

java
class 42ecole {
	String[] cadet;
}

class 42seoul extends 42ecole {
	// string[] cadet은 자동 추가.
}

포함이란?

여러 클래스를 다루는 방법은 상속만 있지 않다.

이번에는 클래스 안에 클래스를 집어 넣는 포함을 알아보자.

java
class Circle {
	int x;
	int y;
	int z;
}

class Point {
	int x;
	int y;
}

이 경우 point 클래스를 Circle 클래스 안에 포함시킬 수 있다.

java
class Circle {
	Point c = new Point();
	int z;
}

class Point {
	int x;
	int y;
}

상속 vs 포함

어떨 때 상속을 쓰고, 어떨 때 포함을 써야 하는가?

이럴 때는 각 인스턴스(객체)를 비교해 보는 수 밖에 없다.

예를 들어 아까와 같이 Circle(원)과 Point(점)을 비교해 본다면 다음과 같다.

java
원은 점을 상속받는다. (상속)
원은 점을 가지고 있다. (포함)

포함관계가 좀 더 적당함을 알 수 있다.

자바에서의 상속

자바에서의 상속은 여러가지 특징이 있다.

단일 상속

자바의 부모 클래스는 한 개다. (C++은 한 개 이상도 가능한다.)

클래스 간의 복잡한 관계를 막기 위해서 걸어 놓은 규칙이라고 할 수 있다.

Object 클래스

자바의 모든 것은 결국 클래스 안에 들어가 있다.

이 경우, 다음과 같은 문제들을 생각해 볼 수 있다.

  1. 부모 클래스가 없는 클래스는 어떻게 할 것인가?
  2. 모든 클래스들의 조상은 누구인가?

이 점을 해결하기 위해 Object 클래스라는 것이 나왔다.

모든 부모가 없는 클래스들은 Object 클래스에서 상속을 받는다.

java
class putstr {	
}

// 컴파일러가 알아서 extends Object를 붙인다.

그 결과 굳이 상속을 받지 않아도 기본적으로 쓸 수 있는 메소드가 존재한다.