[java] 상속

DEVELOPERS_Ivan ㅣ 2023. 8. 7. 12:25

클래스 상속
● 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 클래스를 구현함
● 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 기존 클래스를 상속
● 상속하는 클래스 : 상위(부모) 클래스, parent class, super class
● 상속받는 클래스 : 하위(자식) 클래스, child class, subclass

상속을 구현 하는 경우
● 상위 클래스는 하위 클래스 보다 더 일반적인 개념과 기능을 가짐
● 하위 클래스는 상위 클래스 보다 더 구체적인 개념과 기능을 가짐
● 하위 클래스가 상위 클래스의 속성과 기능을 확장 (extends)한다는 의미

 

// 20230807_상속 #1

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;

 

}

 

// public class B { } <-- public 하나 더 생성 시 에러 발생

 

class C extends A { // A를 C가 상속 받는다.

 

}


// 20230807_상속 #2

package ch01;

 

public class Hero {

/*

* 문제 클래스 Hero 설계 클래스 전사, 궁수, 마법사, 클래스를 설계하고 상속 기법을 활용해 보세요 단, 지금은 속성만 정의해 주세요.

*/

// 생성자 정의

String name;

public static void main(String[] args) {

// 속성

Warrior name1 = new Warrior();

name1.name = "전사1";

Archer name2 = new Archer();

name2.name = "궁수1";

Wizard name3 = new Wizard();

name3.name = "마법사1";

 

System.out.println(name1.name);

System.out.println(name2.name);

System.out.println(name3.name);

 

} // end of main

 

} // end of class

 

class Warrior extends Hero {

}

 

class Archer extends Hero {

}

 

class Wizard extends Hero {

}


// 20230808_상속 #3

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;

}

 

// !!! 상속에서는 메서드의 재정의가 가능하다.

// 주석 + 힌트

@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

 

// 20230808_상속 #3

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


1. 부모 클래스가 메모리에 먼저 생성이 되고 자식 클래스가 메모리에 올라오게 된다.

2. 오버라이드 != 오버로딩 다른 개념이다.
3. 생성자 오버로딩 --> 메서드 오버로딩 같은 개념

4. 컴파일러에게 주석 + 힌트 주는 걸 @Override 어노테이션 이라 부른다.
5. 메서드 오버로딩은 sysout 이다. 아래 오버로딩 된 메서드는 println -> dimension 속성(정보) 커서+우측 마우스에서 확인 시 System.out.println("안녕"); System.out.println('A'); System.out.println(100); System.out.println(0.5); System.out.println(true);
6. 함수 protected = 상속을 받는 자식 클래스들은 접근 할 수 있다. 예시 // 접근 제어 지시자 - protected // 상속을 받는 자식 클래스들은 접근 할 수 있다. protected void attack() { System.out.println("기본 공격을 합니다."); }
7. 부모 클래스에 사용자 정의 생성자가 있다면 자식 클래스에 반드시 부모 생성자를 먼저 호출해야 한다.
// super <-- 부모를 의미한다.
          public Warrior(String name, int hp) {
                                                                   super(name, hp);
                                                                   } // 부모 생성자를 먼저 호출해야 한다.

 

Hero 설계 개요

// 20230808_상속 #4

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("기본 공격을 합니다.");

}

 

} // end of class

// 20230808_상속 #4

package ch03_1;

 

public class Warrior extends Hero {

 

// !! 부모 클래스에 사용자 정의 생성자가 있다면

// 자식 클래스에 반드시 부모 생성자를 먼저 호출해야 한다.

 

// super <-- 부모를 의미한다.

 

public Warrior(String name, int hp) {

super(name, hp); // 부모 생성자를 먼저 호출해야 한다.

}

 

public void comboAttack() {

System.out.println("전사가 2단 공격을 합니다.");

}

 

// 상속에서 오버라이드

@Override // 어노테이션

protected void attack() {

super.attack(); // super.

System.out.println(super.name + " 이 기본 공격을 합니다.");

}

 

} // end of class

// 20230808_상속 #4

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(super.name + " 이 기본 공격을 합니다.");

}

} // end of class

// 20230808_상속 #4

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(super.name + " 이 기본 공격을 합니다.");

}

 

} // end of class


 

'Java' 카테고리의 다른 글

[java] 기초 연습  (0) 2023.08.10
다형성(polymorphism)  (0) 2023.08.09
[Java] 배열  (0) 2023.08.04
[java] 대중교통 이용 프로그램 만들기  (0) 2023.08.03
[java] static  (0) 2023.08.03