Java

상속(Inheritance)

H_u 2024. 4. 23. 16:14
728x90
반응형
SMALL

💡 학습 목표

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

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

상속(Inheritance)은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다. 상속은 기존의 클래스를 확장하여 새로운 클래스를 정의하는 메커니즘을 말합니다. 상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장하여 새로운 클래스를 만들 수 있습니다.

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

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

 

 

2. 오버라이드란 뭘까?

오버라이드(Override)란 상속 관계에서 부모 클래스에 정의된 메서드를 자식 클래스에서 재정의(다시 정의)하는 것을 말합니다. 즉, 자식 클래스에서 부모 클래스의 메서드를 새로운 내용으로 구현하는 것입니다. 이렇게 하면 자식 클래스는 부모 클래스의 메서드를 덮어쓰게 되므로, 부모 클래스의 메서드 대신에 자식 클래스에서 정의한 메서드가 호출됩니다.

 

시나리오 코드

package basic.ch17;

 

//상상력 추가

//선임이 작성한 코드라고 가정

 

public class A {

 

String name;

int height;

int weight;

int age;

 

//만약 바로 수정하게 된다면....문제가 생길수있다

 

}

//단 하나의 자바 파일에 여러개의 클래스를 작성할 수 있다.

//단 public 이 붙은 클래스는 오직 하나만 정의 가능하다.

 

// 복사 붙여넣기도 가능

class B {

 

String name;

int height;

int weight;

int age;

 

int level;

String nickName;

}

 

 

//상속이라는 문법을 배운 개발자라면??

 

class C extends A {

 

int level;

String nickName;

String phone;

}

package basic.ch17;

/**

* OOP란?

* 객체와 객체간에 관계를 형성하고

* 상호작용하게 코드를 설계해 나가는 것

*

* 상속

*/

public class Ctest {

 

public static void main(String[] args) {

 

C c = new C();

c.name = "A";

}

 

}

package basic.ch17;

 

public class Cal {

 

public Cal() {

System.out.println("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 main

}

 

class Cal2 extends Cal {

public Cal2() {

System.out.println("Cal2() 자식 생성자 호출");

}

 

public int minus(int n1, int n2) {

return n1 - n2;

}

 

// //부모 코드에 기능을 변경하고 싶다면 --> 재정의 하고 싶다면

// //오버라이드 처리 한다.

// public int multiply(int n1, int n2) {

// //a 또는 b --> 논리 연산자 ||(논리 합) 을 쓸수있다. 하나만 true 여도 true

// //a 그리고 b --> 논리 연산자 &&(논리 곱) 을 쓸수있다. 전부 true 여야 true

// if(n1 == 0 || n2 == 0) {

// System.out.println("0을 입력 하지 마시오");

// }

// return n1 * n2;

// }

 

 

@Override //<--이러한 표기법은 어노테이션 이라 부른다 (주석 + 힌트)

public int multiply(int n1, int n2) {

System.out.println("1. 호출");

return super.multiply(n1, n2);

}

}

 

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

super. ← 부모 객체를 가리킨다.

 

package basic.ch17;

 

 

public class Hero {

 

public String name;

public int hp;

 

public Hero(String name, int hp) {

this.name = name;

this.hp = hp;

}

 

void attack() {

 

}

 

 

}

package basic.ch17;

 

public class Warrior extends Hero {

 

public Warrior(String name, int hp) {

super(name, hp);

}

 

@Override

void attack() {

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

}

 

void comboAttack() {

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

}

 

}

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(name + " 가 얼음 공격을 합니다");

}

 

}

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 + " 가 불화살 공격을 합니다");

}

 

}

728x90
반응형
SMALL

'Java' 카테고리의 다른 글

연관, 의존 관계란?  (1) 2024.04.23
Composition(포함관계)  (0) 2024.04.23
메서드 오버로딩  (0) 2024.04.23
전화번호관리 프로그램 만들기 - {연습문제}  (0) 2024.04.22
배열 의 활용(도서관리프로그램)  (0) 2024.04.22