Java

2024.04.23 상속(Inheritance)

정훈5 2024. 4. 23. 09:50

상속에 대한 개념을 이해하자.

학습 목표 

1. 상속에 대한 개념을 이해하자. 
2. 오버라이딩 이란 뭘까?

 

상속(Inheritance)은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다.

상속은 기존의 클래스를 확장하여 새로운 클래스를 정의하는 메커니즘을 말합니다.

상속을 통해 기존 클래스의 속성메서드를 재사용하고 확장하여 새로운 클래스를 만들 수 있습니다.

 

이를 위해 상속에서는 두 개의 클래스가 필요합니다:

  1. 부모 클래스(Parent Class) 또는 슈퍼 클래스(Superclass)
    기존에 정의된 클래스로, 상속의 대상이 되는 클래스입니다.
    부모 클래스의 속성과 메서드를 자식 클래스에게 상속합니다.
  2. 자식 클래스(Child Class) 또는 서브 클래스(Subclass)
    부모 클래스를 확장하여 새롭게 정의되는 클래스입니다.
    자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받습니다.

시나리오 코드 1

package basic.ch17;

// 상상력 추가
// A 라는 클래스를 선임이 작성한 코드라고 과정

public class A {

	String name;
	int height;
	int weight;
	int age;
	// 코드를 추가해 달라고 요청
	// 1. 잘 돌아가고 있는 코드를 바로 수정 ...
	// 2. ctrl + v 하는 방법
}
	// 단. 하나의 자바 파일안에 여러개의 클래스를 작성할 수 있다.
	// 단. public 클래스는 오직 하나만 정의 가능하다.

	// 복사 붙여 넣기도 가능
	class B {
		// public 클래스는 오직 하나만 정의 가능하다.
		// public 없이 class 만 있으면 패키지 ch17 안에서만 접근 가능하다.
		String name;
		int height;
		int weight;
		int age;
		
		int level;
		String nickName;
}
	
	// 상속이라는 문법을 배운 개발자라면
	
	class C extends A {
		// 클래스 C가 A를 상속하겠다.
		int level;
		int nickName;
		int phone;
	}

 

 

package basic.ch17;
/*
 * OOP 란?
 * 객체와 객체간에 관계를 형성하고
 * 상호작용하게 코드를 설계해 나가는 것
 * 
 * 상속
 * 
 */

public class CTest {

	public static void main(String[] args) {
		
		C c = new C();
		c.name = "A";
		
	} // end of main

} // end of class

 

package basic.ch17;

public class Cal {
	
	public int sum(int n1, int n2) {
		return n1 + n2; 
	}
	
	public int multiply(int n1, int n2) {
		return n1 * n2;
	}
	
	// 코드 테스트 
	public static void main(String[] args) {
		
		Cal2 cal2 = new Cal2();
		System.out.println(cal2.sum(5, 3));
		System.out.println(cal2.minus(10, 3));
		System.out.println(cal2.multiply(10, 0));
		
		
	} // end of main 
	
}

class Cal2 extends Cal {
	
	public int minus(int n1, int n2) {
		return n1 - n2; 
	}
    // 부모 코드의 기능을 변경하고 싶다면 --> 재정의 하고 싶다면
	// 오버라이드 이라고 한다.
	// 오버라이딩 부모Class의 기능을 재정
	
	 
	public int multiply(int n1, int n2) {
		// a 또는 b --> 논리 연산자 --> 논리 합 --> 두개 중 하나라도 True 라면 True
	    // a 그리고 b --> 논리 연산자 --> 논리 곱 --> 전부 True 여야 --> True 이다.
		if(n1 == 0 || n2 == 0) { // 두개 중 하나라도 0 이라면
			System.out.println("0을 입력하지 마시오");
		}
		return n1 * n2;
	}
	
}

 

부모 클래스가 먼저 존재해야 자식 클래스가 생성 될 수 있다.

super. <- 부모 객체를 가르킨다.

 

package basic.ch17;

public class Cal {
	
	public Cal() {
		System.out.println("Cal() 부모 생성자 호출");
	}// Cal 생성자
	

	public int sum(int n1, int n2) {
		return n1 + n2;
	} // 원시코드 부모코드 같은 의미

	public int multiply(int n1, int n2) {
		System.out.println("2. 호출");
		System.out.println("여기는 부모 클래스 메서드 입니다.");
		return n1 * n2;
	} // 원시코드 부모코드 같은 의미

	public static void main(String[] args) {

		Cal2 cal2 = new Cal2();
		System.out.println(cal2.sum(5, 3));
		System.out.println(cal2.minus(10, 3));
		System.out.println(cal2.multiply(10, 0));

	}

} // end of Cal class 

class Cal2 extends Cal {
	// Cal2 가 Cal 에게 상속받았다. : extends
	
	public Cal2() {
		System.out.println("Cal2() 자식 생성자 호출");
	} // Cal2 생성자 
	

	public int minus(int n1, int n2) {
		return n1 - n2;
	}
	
	// 부모 코드의 기능을 변경하고 싶다면 --> 재정의 하고 싶다면
	// 오버라이드 이라고 한다.
	// 오버라이딩 부모Class의 기능을 재정
	
	
	// a 또는 b --> 논리 연산자 --> 논리 합 --> 두개 중 하나라도 True 라면 True
	// a 그리고 b --> 논리 연산자 --> 논리 곱 --> 전부 True 여야 --> True 이다.
	
//	public int multiply(int n1, int n2) {
//		if(n1 == 0 || n2 == 0 ) { // 두개 중 하나라도 0 이라면
//			System.out.println("0을 입력하시오 마시오");
//		}
		// System.out.println("자식 클래스에서 호출 된 multiply 메서드");
//		return n1 * n2;
//	}
	
	@Override  // <-- 애노티이션, 어노테이션 --> 주석 + 힌트
	public int multiply(int n1, int n2) {
		System.out.println("1. 호출");
		return super.multiply(n1, n2);
		// super 클래스는 부모를 가르킨다.
		// super.multiply()는 부모의 메서드를 가르킨다.
	}
	
} // end of Cal2 class

 

코드 설계

 

 

 

package basic.ch17;

public class Hero {
	// 멤버변수
	String name; 
	int hp; 
	
	public Hero(String name, int hp) {
		this.name = name; 
		this.hp = hp; 
	} // 생성자 
	
	void attack() {
		
	}
} // end of class

 

package basic.ch17;

public class Warrior extends Hero {

	public Warrior(String name, int hp) {
		super(name, hp); // 생성자 만들고 super()사용
	}
	
	// 오버라이드 
	@Override
	void attack() {
		System.out.println("전사가 기본 공력을 합니다");
	}
	
	void vomboAttack() {
		System.out.println("전사가 2단 공격을 합니다.");
	}

}

 

package basic.ch17;

public class Archer extends Hero {

	public Archer(String name, int hp) {
		super(name, hp);
	}
	
	@Override
	void attack() {
		System.out.println("궁수가 기본 공력을 합니다.");
	}
	
	void fireArrow() {
		System.out.println(name + " 가 불화살 공격을 합니다");
	}
}

 

package basic.ch17;

public class Wizard extends Hero {

	public Wizard(String name, int hp) {
		super(name, hp); // 부모 생성자 호출 
	}
	
	@Override
	void attack() {
		System.out.println("마법사가 기본 공격을 합니다.");
	}
	
	void freezing() {
		System.out.println("마법사가 얼음 공격을 합니다");
	}

}

 

 

package basic.ch17;

public class HeroTest {

	public static void main(String[] args) {
		
		Warrior warrior1 = new Warrior("야스오", 100);
		Archer archer1 = new Archer("애쉬", 100);
		Wizard wizard1 = new Wizard("라이", 100);
		
		warrior1.attack();

	}

}