💡 학습 목표
|
1. 상속에 대한 개념을 이해하자.
상속(Inheritance)은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다. 상속은 기존의 클래스를 확장하여 새로운 클래스를 정의하는 메커니즘을 말합니다. 상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장하여 새로운 클래스를 만들 수 있습니다.
이를 위해 상속에서는 두 개의 클래스가 필요합니다:
- 부모 클래스(Parent Class) 또는 슈퍼 클래스(Superclass): 기존에 정의된 클래스로, 상속의 대상이 되는 클래스입니다. 부모 클래스의 속성과 메서드를 자식 클래스에게 상속합니다.
- 자식 클래스(Child Class) 또는 서브 클래스(Subclass): 부모 클래스를 확장하여 새롭게 정의되는 클래스입니다. 자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받습니다.
2. 오버라이드란 무엇일까?
오버라이드(Override)란 상속 관계에서 부모 클래스에 정의된 메서드를 자식 클래스에서 재정의(다시 정의)하는 것을 말합니다. 즉, 자식 클래스에서 부모 클래스의 메서드를 새로운 내용으로 구현하는 것입니다. 이렇게 하면 자식 클래스는 부모 클래스의 메서드를 덮어쓰게 되므로, 부모 클래스의 메서드 대신에 자식 클래스에서 정의한 메서드가 호출됩니다.
시나리오 코드 1
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;
int nickName;
String 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;
}
// 부모 코드의 기능을 변경하고 싶다면 --> 재정의 하고 싶다면
// 오버라이드 처리 한다.
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;
}
}
부모클래스가 먼저 존재해야 자식 클래스가 생성 될 수 있다.
super. <- 부모객체를 가리킨다.
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);
}
} // end of 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);
}
@Override
void attack() {
System.out.println("전사가 기본공격을 합니다.");
}
void comboAttack() {
System.out.println("전사가 이중타격을 시전합니다.");
}
}
package basic.ch17;
public class Archer extends Hero {
public Archer(String name, int hp) {
super(name, hp); // 부모 생성자 호출
}
@Override
void attack() {
System.out.println(name + "가 기본공격을 합니다.");
}
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(name + "가 기본공격을 했습니다.");
}
void fresszing() {
System.out.println(name + "가 얼리기를 시전했습니다.");
}
}
package basic.ch17;
public class HeroTest {
public static void main(String[] args) {
Warrior warrior1 = new Warrior("바바리안", 100);
Archer archer1 = new Archer("아마존", 80);
Wizard wizard1 = new Wizard("소서리스", 60);
warrior1.attack();
archer1.fireArrow();
}
}
UML: 클래스 다이어그램과 소스코드 매핑
불과 몇 년 되지 않은 학생 시절... 처음으로 UML을 접했고, UML의 기초적인 그리는 법과 사용법을 배웠습니다. 개인적으로 쉽지 않은 수업이었는데 그 중 가장 많이 사용되는 클래스 다이어그램에
www.nextree.co.kr
'Java > JAVA 2 - 객체지향 핵심' 카테고리의 다른 글
JAVA 2 - 연관, 의존 관계란? (0) | 2024.04.23 |
---|---|
JAVA 2 - Composition(포함관계) (0) | 2024.04.23 |
JAVA 2 - 메서드 오버로딩 (0) | 2024.04.23 |
JAVA 2 - 전화번호관리 프로그램 만들기 - {연습문제} (0) | 2024.04.22 |
JAVA 2 - 배열의 활용(도서 관리프로그램) (0) | 2024.04.22 |