2023-12-15 (7일차) - 상속(inheritance)

민짱·2024년 1월 7일
post-thumbnail

📅2023. 12. 15 7일차


🎨 Java

상속이란?

  • 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것
  • 이러할 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그램을 구성하는 중요한 특징 중 하나 임.
  • 기존에 정의된 클래스를 부모 클래스(Parent class) 또는 상위클래스(super class), 기초(base class)
  • 새롭게 작성되는 클래스를 자식 클래스(Child class) 또는 하위 클래스(sub class), 파생 클래스(derived class)라고 한다.
  • 자식 클래스(child class)

상속을 쓰는 이유?

코드 재사용
클래스들간의 관계 성립

부모클래스 ? (속성과 기능을) 물려주는 클래스

자식 클래스? 부모 클래스의 모든 특성을 물려받아 새롭게 작성된 클래스

  • 문법 --> class 자식클래스이름 extends 부모클래스이름
    • 부모클래스는 자식 클래스에 포함된다.
      따라서 부모 클래스에 새로운 필드를 하나 추가하면, 자식 클래스에도 자동으로 해당 필드가 추가된 것처럼 동작한다.

오버라이딩 과 오버로딩의 차이

  • 오버라이딩: 메소드를 덮어씌우는 과정
  • 오버로딩: 같은 메소드를 사용하는데 각각의 다른 매개변수를 사용해서 두 개의 다른 메소드처럼 처리하는 것

추상메서드란?(abstract Method)

  • 자식한테 물려주기 위해 또는 버튼 유지용으로 사용되는 메서드는 abstract를 붙여주면 된다.
    대신 class도 abstract해줘야한다.
  • abstract 추상 메서드, 추상 클래스를 만드는 키워드 -> 메서드 바디가 없어지기 때문에 구현을 못해 -> 의도 : 버튼용이니 까 건드리지마
  • 순도 100% 추상 메서드만 가지는 추상 클래스는 interface
  • interface는 다중 구현 가능
interface Parents {
	void a();
	void b();
}

interface Parents2 {
	void a();
	void b();
}

abstract class Child implements Parents,Parents2 {
	public void a() {
		System.out.println("a");
	}
	public void b() {
		System.out.println("a");
	}
}

📋 문제 풀이

  • 요구사항에 맞게 오리게임을 만들어보시오.
/* 요구사항
- D1 요구 : 오리를 생성하고 날게하시오.
- D1 완료 : 클래스와 메서드를 만들어서 처리
- D2 요구 : 게임의 디테일을 살리기 위해서 `청둥오리`와 `흰오리`를 생성하고 날게하시오.
- D2 완료 : 클래스와 메서드를 만들어서 처리
- D3 요구 : 오리 계열의 클래스에 날다 메서드가 중복되었습니다. 중복을 제거해주세요.
- D3 완료 : 상속을 사용해서 처리
- D4 요구 : 게임의 재미를 위하여 고무오리를 추가하고 날게 하시오.
- D4 완료 : 클래스와 메서드를 만들어서 처리
- D5 요구 : 주말 주주회의에서 고무오리가 하늘을 날아다니는 것에 대해서 태클이 들어왔습니다. 고무오리 계열은 하늘을 날 수 없게 해주세요.
- D5 완료 : 메서드 오버라이드를 사용해서 처리
- D6 요구 : 고무오리가 반응이 좋습니다. 고무2오리를 추가하고 날게 해주세요.
- D6 완료 : 고무오리가 반응이 좋습니다. 고무2오리를 추가하고 날게 해주세요.
- D7 요구 : 고무오리계열에서 날다 메서드의 중복을 제거해주세요.
- D7 완료 : 상속으로 해결
- D8 요구 : 자바에서 다중상속은 불가능 합니다. 상속에는 한계가 있습니다. 복잡한 상속을 사용하지 않고 고무오리계열의 중복을 제거해주세요.
  - 복잡한 상속을 사용하지 않는다는 것의 의미 : 모든 오리 계열 클래스들은 부모클래스가 오리 클래서 여야 한다.
*/

class Main {
	public static void main(String[] args) {
		MallardDuck m = new MallardDuck();
	    m.fly();
	    // 출력 : 오리가 날개로 날아갑니다.
	    
	    WhiteDuck w = new WhiteDuck();
	    w.fly();
	    // 출력 : 오리가 날개로 날아갑니다.
	    RubberDuck r = new RubberDuck();
	    r.fly();
	    // 출력 : 저는 날 수 없어요. ㅠㅠ
	    RubberDuckNum2 r2 = new RubberDuckNum2();
	    r2.fly();
	}
}

class Duck {
	void fly() {
		System.out.println("오리가 날개로 날아갑니다.");
	}
}
class MallardDuck extends Duck {
}
class WhiteDuck extends Duck {	
}
class RubberDuck extends Duck {
  // 메서드 재정의 라고 합니다.
  // 메서드 오버라이드 라고도 합니다.
  // 메서드 재정의 => 부모가 물려준 능력을 다시 구현한다.
	void fly() {
		System.out.println("저는 날 수 없어요. ㅜㅠ");
	}
}
class RubberDuckNum2 extends Duck {
	void fly() {
		System.out.println("저는 날 수 없어요. ㅜㅠ");
	}
}
  • 인력관리사무소 관리하기 (아래가 실행되도록 해주세요, 배열사용금지)
class Main {
	public static void main(String[] args) {
		사람인력관리소 a사람인력관리소 = new 사람인력관리소();

		a사람인력관리소.add사람("홍길순", 33);
		// 나이가 33살인 1번째 사람(홍길순)이 추가되었습니다.
		a사람인력관리소.add사람("홍길동", 20);
		// 나이가 20살인 2번째 사람(홍길동)이 추가되었습니다.
		a사람인력관리소.add사람("임꺽정", 30);
		// 나이가 30살인 3번째 사람(임꺽정)이 추가되었습니다.

		사람 a사람1 = a사람인력관리소.get사람(1);
		a사람1.자기소개();
		// 저는 1번, 홍길순, 33살 입니다.

		사람 a사람2 = a사람인력관리소.get사람(2);
		a사람2.자기소개();
		// 저는 2번, 홍길동, 20살 입니다.

		사람 a사람3 = a사람인력관리소.get사람(3);
		a사람3.자기소개();
		// 저는 3번, 임꺽정, 30살 입니다.
	}
}

class 사람인력관리소 extends 사람 {
	int num;
	사람 첫번째사람;
	사람 두번째사람;
	사람 세번째사람;

	void add사람(String name, int age) {
		사람 a사람 = new 사람();
		a사람.age = age;
		a사람.name = name;
		a사람.n = num + 1;
		System.out.printf("나이가 %d살인 %d번째 사람(%s)이 추가되었습니다.\n", a사람.age, a사람.n, a사람.name);
		if (a사람.n == 1) {
			첫번째사람 = a사람;
		} else if (a사람.n == 2) {
			두번째사람 = a사람;
		} else if (a사람.n == 3) {
			세번째사람 = a사람;
		}
		this.num = a사람.n;
	}

	사람 get사람(int n) {
		사람 가져온사람 = new 사람();
		if (첫번째사람.n == n) {
			가져온사람 = 첫번째사람;
		} else if (두번째사람.n == n) {
			가져온사람 = 두번째사람;
		} else if (세번째사람.n == n) {
			가져온사람 = 세번째사람;
		}
		return 가져온사람;
	}
}

class 사람 {
	int n;
	String name;
	int age;

	void 자기소개() {
		System.out.printf("저는 %d번, %s, %d살 입니다.\n", n, name, age);
	}
}
  • 인력관리사무소 관리하기 (배열 ver.)
class Main {
	public static void main(String[] args) {
		사람인력관리소 a사람인력관리소 = new 사람인력관리소();

		a사람인력관리소.add사람("홍길순", 33);
		// 나이가 33살인 1번째 사람(홍길순)이 추가되었습니다.
		a사람인력관리소.add사람("홍길동", 20);
		// 나이가 20살인 2번째 사람(홍길동)이 추가되었습니다.
		a사람인력관리소.add사람("임꺽정", 30);
		// 나이가 30살인 3번째 사람(임꺽정)이 추가되었습니다.

		사람 a사람1 = a사람인력관리소.get사람(1);
		a사람1.자기소개();
		// 저는 1번, 홍길순, 33살 입니다.

		사람 a사람2 = a사람인력관리소.get사람(2);
		a사람2.자기소개();
		// 저는 2번, 홍길동, 20살 입니다.

		사람 a사람3 = a사람인력관리소.get사람(3);
		a사람3.자기소개();
		// 저는 3번, 임꺽정, 30살 입니다.
	}
}

class 사람인력관리소 extends 사람 {

	int num = 0;
	사람[] 사람들 = new 사람[100];

	void add사람(String name, int age) {
		int 번호 = num + 1;
		사람 a사람 = new 사람();
		a사람.age = age;
		a사람.name = name;
		a사람.n = 번호;
		
		사람들[번호 - 1] = a사람;
		
		System.out.printf("나이가 %d살인 %d번째 사람(%s)이 추가되었습니다.\n", a사람.age, a사람.n, a사람.name);

		this.num = a사람.n;
	}

	사람 get사람(int n) {

		return 사람들[n - 1];
	}
}

class 사람 {
	int n;
	String name;
	int age;

	void 자기소개() {
		System.out.printf("저는 %d번, %s, %d살 입니다.\n", n, name, age);
	}
}

🔔 TODO

  • 했던 내용 전부 복습
  • 인력관리소 문제 이해
  • 코드업 최대한 많이
  • WIKI 정리

💡느낀점

오리문제는 그나마 낫 뱃 했다. but 인력관리소 문제는 어렵다...어려워.. 먼가 복잡하다 다시 try 해보자!

0개의 댓글