클래스 상속
● 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 클래스를 구현함
● 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 기존 클래스를 상속함

● 상속하는 클래스 : 상위 클래스, parent class, super class
● 상속받는 클래스 : 하위 클래스, child class, subclass
상속을 구현 하는 경우
● 상위 클래스는 하위 클래스 보다 더 일반적인 개념과 기능을 가짐
● 하위 클래스는 상위 클래스 보다 더 구체적인 개념과 기능을 가짐
● 하위 클래스가 상위 클래스의 속성과 기능을 확장 (extends)한다는 의미
상속 예제
package ch01;
public class A {
String name;
int height;
int weight;
int age;
// main 함수 테스트 - 잠시 자리만 빌림
public static void main(String[] args) {
C c1 = new C();
c1.age = 10;
System.out.println(c1.age);
} // end of main
} // end of class
// 하나의 .java 파일안에서 여러개의 클래스를
// 설계할 수 있다.
// 단. 하나의 자바 파일에서 접근제어 지시자 public class는
// 단 하나만 설계 가능하다.
class B {
String name;
int height;
int weight;
int age;
String tel;
}
class C extends A {
String phone;
}
결과
10
Hero
package ch01;
public class Hero {
int hp;
int damage;
public static void main(String[] args) {
warrior wa = new warrior();
wa.hp = 100;
System.out.println(wa.hp);
archer ar = new archer();
ar.hp = 80;
System.out.println(ar.hp);
wizard wi = new wizard();
wi.hp = 50;
System.out.println(wi.hp);
System.out.println(wi.damage);
}
}
class warrior extends Hero{
}
class archer extends Hero{
}
class wizard extends Hero{
}
결과
100
80
50
0
상속
부모 클래스가 메모리에 먼저 생성이 되고 자식 클래스가 메모리에 올라오게 된다.
오버라이드 != 오버로딩 다른 개념이다.
생성자 오버로딩 --> 메서드 오버로딩 같은 개념
컴파일러에게 주석 + 힌트 주는 걸 @Override 어노테이션 이라 부른다.
함수 protected = 상속을 받는 자식 클래스들은 접근 할 수 있다.
예시
접근 제어 지시자 - protected
상속을 받는 자식 클래스들은 접근 할 수 있다.
부모 클래스에 사용자 정의 생성자가 있다면 자식 클래스에 반드시 부모 생성자를 먼저 호출해야 한다.(super)

super 키워드
● 하위 클래스에서 가지는 상위 클래스에 대한 참조 값
● super()는 상위 클래스의 기본 생성자를 호출 함
● 하위 클래스에서 명시적으로 상위 클래스의 생성자를 호출하지 않으면 super()가 호출 됨
( 이때 반드시 상위 클래스의 기본 생성자가 존재 해야 함)
● 상위 클래스의 기본 생성자가 없는 경우 ( 다른 생성자가 있는 경우 ) 하위 클래스에서는 생성자에서는 super를 이용하여 명시적으로 상위 클래스의 생성자를 호출 함
● super는 생성된 상위 클래스 인스턴스의 참조 값을 가지므로 super를 이용하여 상위 클래스의 메서드나 멤버 변수에 접근할 수 있음
상속 예제2
클래스
package ch02;
public class Cal {
// 속성
// 기능
public Cal() {
System.out.println("Cal() 생성자 호출 - 부모");
}
public int sum(int n1, int n2) {
return n1 + n2;
}
public int mutiply(int n1, int n2) {
return n1 * n2;
}
} // end of class
// 객체 지향 패러다임 핵심
// 객체와 객체간에 상호작용 그리고 관계를 형성해 나가는 것
class Cal2 extends Cal {
public Cal2() {
System.out.println("Cal2() 생성자 호출 - 자식");
}
public int minus(int n1, int n2) {
return n1 - n2;
}
// !!! 상속에서는 메서드의 재정의가 가능하다.
// ctrl + 클릭
// 주석 + 힌트
@Override // 어노테이션 이라 부른다.
public int mutiply(int n1, int n2) {
if (n1 == 0 || n2 == 0) {
System.out.println("0을 입력 하였습니다.");
}
return n1 * n2;
}
// 위와 같은 기법을 오버라이드 라고 한다.
// 오버라이드 != 오버로딩
// 생성자 오버로딩 --> 메서드 오버로딩
public int minus(int n1, int n2, int n3) {
return n1 - (n2 - n3);
}
} // end of class
객체
package ch02;
public class MainTest1 {
public static void main(String[] args) {
// default - 같은 패키지 내에서 접근 가능
Cal2 cal2 = new Cal2();
cal2.sum(10, 20); // sum 메서드는 부모
cal2.minus(20, 10); // this 자신에 있는 메서드
// ??? Cal 이란 부모 객체는 생성이 된 걸까 ???
// 부모 클래스가 메모리에 먼저 생성이 되고
// 자식 클래스가 메모리에 올라오게 된다.
// multiply 메서드 재정이 (오버라이드)
cal2.mutiply(10, 0);
// 메서드 오버 로딩은 sysout 이다.
System.out.println("안녕");
System.out.println('A');
System.out.println(100);
System.out.println(0.5);
System.out.println(true);
} // end of main
} // end of class
Hero 예제2
hero클래스
package ch03_1;
public class Hero {
String name;
int hp;
public Hero(String name, int hp) {
this.name = name;
this.hp = hp;
}
// 접근 제어 지시자 - protected
// 상속을 받는 자식 클래스들은 접근할 수 있다.
protected void attack() {
System.out.println("기본 공격을 합니다");
}
}
warrior클래스
package ch03_1;
public class Warrior extends Hero {
// !! 부모 클래스에 사용자 정의 생성자가 있다면
// 자식 클래스에 반드시 부모 생성자를 먼저 호출 해야한다
public Warrior(String name, int hp) {
// super <-- 부모를 의미한다.
// System.out.println("asdasda"); <-- 부모가 태어나기 전에 일을 할 수 없다.
super(name, hp); // 부모 생성자를 먼저 호출해야 한다.
}
public void comboAttack() {
System.out.println("전사가 2단 공격을 합니다");
}
// 상속에서 오버라이드
@Override // 어노테이션
protected void attack() {
// super.attack();
System.out.println( super.name + " 기본 공격을 합니다.");
}
}
Archer 클래스
package ch03_1;
public class Archer extends Hero {
public Archer(String name, int hp) {
super(name, hp);
}
public void fireArrow() {
System.out.println("불화살 공격을 합니다");
}
@Override
protected void attack() {
System.out.println(name + "이 기본 공격을 합니다");
}
}
Wizard 클래스
package ch03_1;
public class Wizard extends Hero {
public Wizard(String name, int hp) {
super(name, hp);
}
public void freezing() {
System.out.println("얼음 공격을 합니다");
}
// 오버라이드
@Override
protected void attack() {
System.out.println(name + " 기본 공격을 합니다");
}
}
객체
// 20230808_상속 #4
package ch03_1;
public class MainTest1 {
public static void main(String[] args) {
Warrior warrior1 = new Warrior("전사1", 100);
Wizard wizard1 = new Wizard("마법사1", 80);
Archer archer1 = new Archer("궁수1", 100);
// 오버라이드 메서드
// 1. 자기 자신에 메서드를 확인 (자식 - warrior)
// 2. 자기 자신에 attack() 메서드가 없다면 부모 객체를 확인한다.
warrior1.attack();
wizard1.attack();
archer1.fireArrow();
} // end of main
} // end of class
포함 관계
자동차와 엔진은 포함 관계 (상속관계 x)
'JAVA' 카테고리의 다른 글
[JAVA] 추상 클래스 (0) | 2023.08.10 |
---|---|
[JAVA] 다형성 (0) | 2023.08.09 |
[JAVA] 배열 (0) | 2023.08.04 |
[JAVA] this 사용법과 스타크래프트 게임 만들기 그리고 CRUD (0) | 2023.08.02 |
[JAVA] 접근 제어 지시자 (0) | 2023.08.01 |