나 <--> 부모님
상속
자바에서 클래스의 상속은 아래와 같은 장점이 있습니다.
1. 기존에 작성된 클래스를 재활용할 수 있습니다.
2. 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면,
자식 클래스에서는 해당 멤버를 작성하지 않아도 됩니다.
3. 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련합니다.
class 자식클래스이름 extend 부모클래스이름 { ... }
자바에서 클래스는 단 한 개의 클래스만을 상속받는 단일 상속만이 가능합니다.
========================================================
자바의 모든 클래스는 Object의 하위 클래스입니다.
[ 상속 ] _ 단일상속 (자식들은 부모 하나만 가질 수 있음) <--> 다중상속
package jun20;
class Animal { // 부모 클래스, 상위 타입, 슈퍼 타입
String name;
int age;
public void sount() { // 자식클래스의 속성들이 겹친다면 부모 클래스에 넣어줌
System.out.println("자식마다 소리가 달라요");
}
}
class Dog extends Animal { // 자식 클래스1, 하위 클래스, 서브 타입
int number;
}
class Cat extends Animal { // 자식클래스2
}
public class inheritance {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat(); // 객체생성하면
dog.name = "poppy"; // 부모가 가진것들 사용가능
cat.age = 3;
Animal a = new Animal(); // 부모 객체 생성하면 자식이 가진건 사용못함..
// a.number = 2; // 불가능
}
}
[ 오버라이드 ] _ 자식요소마다 다른 기능을 실행시키고 싶다면!?!?
package jun20;
class Animal {
String name;
int age;
public void sount() {
System.out.println("자식마다 소리가 달라요");
}
}
// 부모에 정의된 메소드를 재정의해서 사용해보겠습니다.
// 어노테이션 --> 정보표시
class Dog extends Animal {
int number;
@Override
public void sount() {
System.out.println("BOWOW");
}
}
class Cat extends Animal {
@Override
public void sount() {
System.out.println("Mew~ Mew~");
}
}
public class inheritance {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.sount(); // BOWOW
cat.sount(); // Mew~ Mew~
}
}
Dog dog = new Cat(); // 불가능!!
// 둘은 같은 부모를 가진 자식일 뿐 묶여있지 않은 별개의 클래스
// 연관관계는 가능
Object obj = new String();
Number n = new Integer(10);
[ 상속 및 연관 클래스 생성 ]
부모 > 자식
class Animal
> class Dog
> class Cat
> class KorShort
> class Human
> class Asia
> class Korean
> class MZ
위의 관계에서 Human, Asia, Korean, MZ 는 연관관계. 오버라이드 가능.
package jun20;
class Animal {
String name;
int age;
public void sound() {
System.out.println("자식마다 소리가 달라요");
}
}
// 부모에 정의된 메소드를 재정의해서 사용해보겠습니다.
// 어노테이션 --> 정보표시
class Dog extends Animal {
int number;
@Override
public void sound() {
System.out.println("BOWOW");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("Mew~ Mew~");
}
}
public class inheritance {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.sound(); // BOWOW
cat.sound(); // Mew~ Mew~
KorShort korShort = new KorShort();
korShort.sound(); // Mew~ Mew~ (부모인 Cat의 속성 따름)
Korean k = new Korean();
k.sound(); // 살려줘
}
}
class Human extends Animal {
}
class Asia extends Human {
String rice;
}
class Korean extends Asia {
String ssn;
void myInfo( ) {
System.out.println("이름은 " + name + "입니다.");
System.out.println("나이는 " + age + "살 입니다.");
System.out.println( "주민번호는 " + ssn + "입니다.");
}
@Override
public void sound() {
System.out.println("살려줘");
}
}
class KorShort extends Cat {
// 고양이의 (부모가 가진) 이름&나이 속성 가지고 있음
}
class MZ 추가
package jun20;
class Animal {
String name;
int age;
public void sound() {
System.out.println("자식마다 소리가 달라요");
}
}
// 부모에 정의된 메소드를 재정의해서 사용해보겠습니다.
// 어노테이션 --> 정보표시
class Dog extends Animal {
int number;
@Override
public void sound() {
System.out.println("BOWOW");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("Mew~ Mew~");
}
}
public class inheritance {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.sound();
cat.sound();
KorShort korShort = new KorShort();
korShort.sound();
Korean k = new Korean();
k.sound();
MZ mz = new MZ();
mz.ssn = "950228-1234567";
mz.myInfo();
}
}
class Human extends Animal {
}
class Asia extends Human {
String rice;
}
class Korean extends Asia {
String ssn;
void myInfo( ) {
System.out.println("이름은 " + name + "입니다.");
System.out.println("나이는 " + age + "살 입니다.");
System.out.println( "주민번호는 " + ssn + "입니다.");
}
@Override
public void sound() {
System.out.println("살려줘");
}
}
class KorShort extends Cat {
}
class MZ extends Korean {
String name = "pyo";
int age = 0;
@Override
void myInfo() { // 950228 - *******
System.out.println("이름은 " + name + "입니다.");
System.out.println("나이는 " + age + "살 입니다.");
System.out.println( "주민번호는 " + ssn.substring(0, 8) + "*******입니다.");
}
}
BOWOW
Mew~ Mew~
Mew~ Mew~
살려줘
이름은 pyo입니다.
나이는 0살 입니다.
주민번호는 950228-1*******입니다.
[ 오버라이드 ] _ 상속, 메소드 재정의
부모의 메소드를 자식 클래스에서 재정의 해서 사용하는 것
부모의 일부 메소드를 다시 수정해서 사용하기
규칙 :
1. 부모의 메소드와 동일한 시그니처(리턴타입, 메소드명, 매개변수)를 가지고 있어야 합니다.
다르면 다른 메소드
2. 접근제한을 더 강하게 할 수 없습니다. 동일하게 설정합니다. 혹은 더 넓게 지정합니다.
3. 새로운 예외를 Throw 할 수 없습니다.
오버라이드 했다면 메소드 상단에 @Override 라고 표시됩니다.
자식 메소드에서 재정의 했다면 부모의 메소드는 은닉됩니다.
은닉된 부모의 객체를 호출할 때는 super로 호출합니다.
[ 오버로드 ] _ 매개변수, 같은 이름, 다른 호출
하나의 클래스 속에 같은 이름의 메소드를 여러개 만드는 것
메소드 시그니처 (수, 순서, 타입)이 일치하지 않으면 됩니다.
호출할 때는 시그니처에 맞는 메소드가 일을 합니다.
접근제어자, 리턴타입은 보지 않습니다. 오로지 파라미터만.
[ 관련 설명 ]
http://www.tcpschool.com/java/java_inheritance_concept
oArr 이라는 Animal 배열을 만들어서
자식요소 생성자들을 순서대로 배열요소로 입력 -> Dog, Cat, Human
oArr 배열을 for문으로 출력!!
package jun20;
class Animal { // 부모클래스
String name;
int age;
public void sound() {
System.out.println("자식마다 소리가 달라요");
}
}
class Dog extends Animal { // 자식클래스
int number;
@Override
public void sound() {
System.out.println("BOWOW");
}
}
class Cat extends Animal { // 자식클래스
@Override
public void sound() {
System.out.println("Mew~ Mew~");
}
}
public class inheritance {
public static void main(String[] args) {
Animal[] oArr = new Animal[3];
oArr[0] = new Dog();
oArr[1] = new Cat();
oArr[2] = new Human();
for (int i=0; i < oArr.length; i++) {
oArr[i].sound();
}
}
}
class Human extends Animal {
}
class Asia extends Human {
String rice;
}
class Korean extends Asia {
String ssn;
void myInfo( ) {
System.out.println("이름은 " + name + "입니다.");
System.out.println("나이는 " + age + "살 입니다.");
System.out.println( "주민번호는 " + ssn + "입니다.");
}
@Override
public void sound() {
System.out.println("살려줘");
}
}
class KorShort extends Cat {
}
class MZ extends Korean {
String name = "pyo";
int age = 0;
@Override
void myInfo() { // 950228 - *******
System.out.println("이름은 " + name + "입니다.");
System.out.println("나이는 " + age + "살 입니다.");
System.out.println( "주민번호는 " + ssn.substring(0, 8) + "*******입니다.");
}
}
BOWOW // Dog의 메소드 실행 (오버라이드한 sound() 메소드)
Mew~ Mew~ // Cat의 메소드 실행 (오버라이드한 sound() 메소드)
자식마다 소리가 달라요 // Human은 비어있음. 그래서 부모의 sound() 메소드 실행
---메인메소드
배열 타입을 Animal 이 아닌 Object로 할 경우......... 아직모르겠음....
....
public class Inheritance {
public static void main(String[] args) {
Object[] oArr = new Object[3];
oArr[0] = new Dog();
oArr[1] = new Cat();
oArr[2] = new Human();
for (int i=0; i < oArr.length; i++) {
((Animal) oArr[i]).sound(); // 부모 클래스로 캐스트필요
}
}
}
.....
....
public class Inheritance {
public static void main(String[] args) {
Animal aaa = new Dog();
Animal aaa4 = new Korean();
aaa4.sound();
캡쳐참고 - 파란부분은 Korean에만 있는부분이라 숨겨짐
Korean kor = (Korean) aaa4; 캐스트 걸어주면
이제는 Korean에만 있는 기능들 사용가능
kor.myInfo();
( (Korean) aaa4 ).myInfo();
---> 다형성관련
}
}
.....
얘도 아직 모르겠다
다형성 어쩌구
Animal aaa = new Dog();
Animal aaa4 = new Korean();
aaa4.sound();
캡쳐참고 - 파란부분은 Korean에만 있는부분이라 숨겨짐
Korean kor = (Korean) aaa4; 캐스트 걸어주면
이제는 Korean에만 있는 기능들 사용가능
kor.myInfo();
( (Korean) aaa4 ).myInfo();
---> 다형성관련
==============================
List<Integer> l = new ArrayList<>();
List 가 부모, ArrayList가 자식
Set<Integer> s = new HashSet();
Map<Integer, Integer> m = new HashMap();
얘네도 마찬가지 ...
다형성 - 타이어같은느낌... 다양하지만 기능은 똑같
'국비과정 > JAVA' 카테고리의 다른 글
20230621 _[14일차]_02. 정처기 문제연습 (0) | 2023.06.25 |
---|---|
20230621 _[14일차]_01. 인터페이스 (0) | 2023.06.22 |
20230620 _[13일차]_03. 추상화 (0) | 2023.06.21 |
20230619 _[12일차]_02. Set & Map (0) | 2023.06.21 |
20230620 _[13일차]_01. 접근제어자 (0) | 2023.06.21 |