[JAVA] 상속

클래스 상속


● 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(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