Hello

Java 클래스 간의 관계, 상속과 포함관계

by 볼빵빵오춘기

클래스의 관계를 크게 보면 상속관계포함관계로 2가지로 나눌 수 있다.

 

포함 관계

  • 클래스의 멤버로 참조변수를 선언하는 것
더보기
// 코드1
class Point{
	int x; // 원점의 x 좌표
	int y; // 원점의 y 좌표
}
// 코드2
class Circle{
	int x; // 원점의 x 좌표
	int y; // 원점의 y 좌표
	int r; // 반지름
}
// 코드3
class Circle{
	Point c = new Point();
	int r;
}

⇒ 코드2처럼 사용할 수 있지만 코드3처럼 작성하여 코드1의 Point와 관계를 맺을 수 있다.

⇒ 여기서 맺는 관계는 포함관계가 된다.

 

포함관계 설명1
포함관계 설명2

⇒ 코드2(포함관계 설명1 그림 참고)와 코드3(포함관계 설명2 그림 참고)을 그림을 그려보면 위와 같다.

 저장공간 x,y,r 3곳을 갖는것이 같다고 볼 수 있지만 그림으로 보면 구조적으로(저장방식이) 다르다는 것을 알 수 있다.

 

 구조적으로 다르기 때문에 변수를 가져와 사용할 때도 

코드2의 경우 x,y,z를 사용할 때는 c.x, c.y, c.y

코드3의 경우 x,y,z를 사용할 때는 c.c.x, c.c.y, c.c.y 이렇게 가르키게 된다.

 

 어느 쪽이 더 좋다라고 할 수는 없다. 하지만 코드3처럼 쓰면서 복잡도가 줄어들었다.

 

  • 작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
더보기
class Car{
	Engine e = new Engine(); // 엔진
	Door[] d = new Door[4]; // 문, 문의 개수를 넷으로 가정하고 배열로 처리했다.
}

 

예제 코드

더보기
class MyPoint{
	int x;
	int y;
}

class Circle extends Object{
	MyPoint p;
	int r;

	Circle(){
		p = new MyPoint();
	}
}

public class InheritanceTest{
	public static void main(String[] args){
		Circle c = new Cicle();
		System.out.println(c.toString()); 
		// extends Object 자동적으로 상속되어 toString()사용가능
	}
}

 

클래스 간의 관계 결정하기

  • 상속관계 : ‘~은 ~이다. (is-a)’
  • 포함관계 : ‘~은 ~을 가지고 있다. (has-a)’

가장 간단한 방법은 위와 같이 문장을 만들어보고 어느 쪽이 자연스러운지 확인한다.(절대적인건 아님)

 

대부분 90% 경우가 포함관계이다.

상속은 여러가지 제약이 많기 때문에 꼭 필요할 때 사용한다.

잘모르겠다할 때 포함관계로 해본다. 

 

위와 같이 해보라는데 언제 상속인지 포함인지 여전히 헷갈린다.

많이 다른 사람들이 작성한 코드 보고 공부하다 보면 느낌이 오겠지 생각하면서 더 공부하기! 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기