클래스 상속
● 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(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);
} // 부모 생성자를 먼저 호출해야 한다.
// 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 |