관리 메뉴

나구리의 개발공부기록

자바의 정석 기초편 ch7 - 1 ~ 4[상속, 클래스간의 관계, 상속과포함] 본문

유튜브 공부/JAVA의 정석 기초편(유튜브)

자바의 정석 기초편 ch7 - 1 ~ 4[상속, 클래스간의 관계, 상속과포함]

소소한나구리 2023. 11. 22. 16:08

1) 상속

  • 기존의 클래스로 새로운 클래스로 작성 하는 것 -> 기존 클래스의 코드를 재사용
  • 두 클래스를 부모와 자식으로 관계를 맺어 주는 것
  • class 자식클래스이름 extends 부모클래스이름 { }
class Parent { }
class Child extends Parent {	// Child class와(자식) Parent class를(모) 상속관계로 만듦
}

 

(1) 하위 클래스(자손)는 상위 클래스(조상)들의 모든 멤버를 상속 받음

  • 생성자와 초기화블럭은 제외
  • 자신의 바로 상위클래스 뿐만아니라 그 상위의 클래스의 멤버도 모두 상속 받음
  • 하위 클래스의 멤버개수는 상위 클래스보다 적을 수 없음, 즉 같거나 많을 수 밖에 없음
class Parent {
	int age;	// 멤버가 1개
}

class Child extends Parent { }
// 멤버가 없지만 상위 클래스를 상속하였으므로 멤버가 1개 들어있음

 

(2) 하위클래스의 변경은 상위 클래스에 영향을 미치지 않음

  • 하위클래스인 Child에 play() 메서드를 추가하여 멤버를 추가하여도 상위 클래스인 Parent 클래스는 영향이 없음
class Parent {
	int age;	// 멤버가 1개
}

class Child extends Parent {	// Parent class를 확장해서 Child클래스를 만듦
	void play() {	        // 새로운 멤버 추가
}

// Parent class = 멤버 1개
// Child class = 멤버 2개 (상속받은 멤버와 추가한 멤버)

 

(3) 상속 클래스간의 관계 예시

  • Point3D_2 클래스는 Point 클래스를 상속 받았으므로 Point 클래스가 변경되면 멤버가 변경됨
class Point {    // 2차원 좌표 클래스
	int x;	 // 멤버 2개
	int y;
}

// 상속 되지 않았으므로 별도 클래스
class Point3D {     // 3차원 좌표 클래스 - 그냥 만들기 (Point클래스와 관계가 없음)
	int x;	    // 멤버 3개
	int y;
	int z;
}

// Point클래스를 상속하였으므로 Point클래스가 변경되면 멤버가 변경 됨
class Point3D_2 extends Point { // 3차원 좌표 클래스 - 상속ver. (Point클래스를 상속)
	int z;	                // Point클래스 멤버를 포함하여 총 3개
}

// 모두 객체 생성시 동작되는 메커니즘은 같음

 

(4) 상속 예시

  • Tv 클래스를 정의후 SmartTv 클래스에 상속
  • SmartTv() 객체를 생성하여 선언한 참조변수로 Tv클래스의 멤버를 모두 사용할 수 있음
// 멤버 5
class Tv {
	boolean power; // 전원상태(on/off)
	int channel;   // 채널

	void power()       {   power = !power; }
	void channelUp()   {   ++channel;      }
	void channelDown() {   --channel;      }
}

// Tv클래스의 멤버를 포함해서 총 7개
class SmartTv extends Tv {  // SmartTv는 Tv에 캡션(자막)을 보여주는 기능을 추가
	boolean caption;    // 캡션상태(on/off)
	void displayCaption(String text) {
		if (caption) {   // 캡션 상태가 on(true)일 때만 text를 보여 준다.
			System.out.println(text);
		}
	}
}

class ex7_1 {
	public static void main(String args[]) {
		SmartTv stv = new SmartTv();
		stv.channel = 10;			// 조상 클래스로부터 상속받은 멤버
		stv.channelUp();			// 조상 클래스로부터 상속받은 멤버
		System.out.println(stv.channel);
		stv.caption = true;	// 캡션(자막) 기능을 켠다.	       
		stv.displayCaption("Hello, World");
	}
}

2) 포함

  • 클래스의 멤버로 다른클래스타입의 참조변수를 선언하고 그 타입의 객체를 생성
  • 작은 단위의 클래스를 만들고 이들을 조합해서 큰단위의 새로운 클래스를 만든다고 보면됨
// 1. 멤버변수 3개인 클래스
class Circle {
	int x;
	int y;
	int r;
}

// 2. Point 클래스를 Circle 클래스에 포함
class Circle {	

	// 포함한다는 것은 클래스에 다른 클래스의 객체를 생성하는 것
	Point c = new Point();	
	int r;
}

// 멤버변수가 2개인 클래스
class Point {	
	int x;
	int y;
}

 

(1) 1번클래스와 2번 클래스의 new Circle() 객체 생성 시 구조 차이

  • Circle c = new Circle()로 객체를 생성했다고 가정
  • 1번: Circle클래스의 멤버로 각 변수가 저장되어있어서 객체 생성시 선언한 참조변수로 모든 변수에 접근이 가능함
  • 2번: Circle 클래스의 직접적인 멤버변수는 c.r로 접근해야하고 포함관계인 Point()클래스의 멤버변수는 c.c.x, c.c.y로 접근해야함


3) 클래스 간의 관계 결정하기

  • 문장을 만들어 보면 무엇으로 해야할지 결정하는 데 도움이 될 수 있음

(1) 상속관계 = 약 10% 비율

  • 여러가지 제약이 많아서 꼭 필요할 때만 사용
  • A는 B이다

(2) 포함관계 = 약 90% 비율

  • 대부분 포함으로 코드를 작성하므로 잘 모르겠으면 포함으로 코드 작성을 권장함
  • A는 B를 가지고 있다
// Pointclass는 포함하는게 좋을까 상속하는게 좋을까?
// 문장 만들어 보기
class Point {
	int x;
	int y;
}

// 서클은 포인트를 가지고 있다 = 포함으로 코드 작성 진행
class Circle {
	Point c = new Point();
	int r;
}

// 서클(자식)은 포인트(모)다
class Circle extends Point {
	int r;
}

 

(3) 상속과 포함의 저장공간 구조 차이

  • 저장공간 개수는 같음
  • 상속은 마치 멤버 변수들이 Circle클래스에 선언되어있던 것처럼 변수들을 사용함

 

(4) 예제1

  • 상속으로 출력
class MyPoint {
	int x;
	int y;
}

class Circle extends MyPoint { //상속
	int r;
}

public class InheritanceTest {
	public static void main(String[] args) {
		Circle c = new Circle();
		c.x = 1;
		c.y = 2;
		c.r = 3;
        
		System.out.println("c.x = "+c.x);	// 상속 출력
		System.out.println("c.y = "+c.y);
		System.out.println("c.r = "+c.r);

	}
}

상속으로 출력
c.x = 1
c.y = 2
c.r = 3

 

(4) 예제2

  • 포함으로 출력

 

class MyPoint {
	int x;
	int y;
}

class Circle {
	MyPoint p = new MyPoint();
	int r;
}

public class InheritanceTest {
	public static void main(String[] args) {
		Circle c = new Circle();
		c.p.x = 1;
		c.p.y = 2;
		c.r = 3;

		System.out.println("c.p.x = "+c.p.x);	// 포함 출력
		System.out.println("c.p.y = "+c.p.y);
		System.out.println("c.r = "+c.r);
	}
}

포함으로 출력
c.p.x = 1
c.p.y = 2
c.r = 3

 

** 출처 : 남궁성의 정석코딩_자바의정석