객체지향 프로그래밍 기술은 코딩을 쉽게 하려고 하는 것이기 때문에, 일부 요소를 제작할 때 어렵다면 사용하지 않아도 된다.
1. 오버라이드 override : 부모 클래스의 메서드를 무효화시킨다.
2. 상속 : (1) 부모의 모든 것을 물려 받는 것.
(2) 다형성이 충족 되어야 한다 (생물 - 동물 - 사자) -- 사자는 생물이며 동물이며 사자다.
3. 동적 바인딩 : 런타임시 필요한 메서드를 찾아가는 것.
상속
배우는 한국인이 아닐 수 있기 때문에 한국인에 상속되지 않는다
박서준을 new하면 사람 아시아인 한국인 박서준의 모든 속성이 뜬다
num을 호출하는 순간 부모 클래스들을 쭉 찾아 올라간다
자료형을 부모 자료형으로 제작하고, 생성자는 자식으로 할 수 있다
다운캐스팅
package ch05;
class 사람 {
int num = 10;
}
class 아시아인 extends 사람 {
int num = 30;
}
class 한국인 extends 아시아인 {
}
class 박서준 extends 한국인 {
int num = 20;
}
public class EveryPerson {
public static void main(String[] args) {
박서준 b1 = new 박서준();
System.out.println(b1.num);
한국인 b2 = new 박서준(); // 한국인 자료형이지만 박서준 클래스의 데이터도 메모리에 떠 있다
System.out.println(b2.num);
박서준 downB2 = (박서준)b2; // 업캐스팅이 선행되어 new를 한 경우 다운캐스팅이 가능하다
System.out.println(downB2.num);
사람 b3 = new 한국인();
System.out.println(b3.num);
// 박서준 b4 = new 한국인(); //오류가 난다
// System.out.println(b4.num);
}
}
오버라이딩, 동적 바인딩
package ch05;
class Car {
void run() {
System.out.println("기본 움직임");
}
}
class Sonata extends Car {
// 오버라이드 : 부모 클래스의 메서드를 무효화 시키는 것 (재사용과는 다르다는 것을 주의)
// [실행시!!]에 부모 메서드를 무시한다!
// 동적 바인딩 (C언어에서는 동적 로딩 이라고 한다)
// 동적 바인딩은 런타임시 필요한 메서드를 찾아가는 것이다.
@Override // 어노테이션
void run() {
super.run(); // super는 부모의 heap
System.out.println("소나타만의 움직임");
}
}
public class CarEx01 {
public static void main(String[] args) {
Car c1 = new Car();
c1.run();
System.out.println("----------");
Car s1 = new Sonata();
s1.run();
}
}
package ch05;
class Animal {
// 오버라이딩 하려면 원본 메서드가 필요하다.
String getName() {
return "동물";
}
}
class Dog extends Animal {
final String NAME = "강아지";
// 오버라이딩
String getName() {
return NAME;
}
}
class Cat extends Animal {
final String NAME = "고양이";
// 오버라이딩
String getName() {
return NAME;
}
}
class Bird extends Animal {
final String NAME = "새";
// 오버라이딩
String getName() {
return NAME;
}
}
public class AnimalEx01 {
// 매개변수를 Animal 타입으로 받으니 Dog Cat Bird가 묵시적 업캐스팅이 된다.
// Animal에는 NAME이 없으니 빨간줄이 뜬다.
// 그것을 해결 하려면 오버라이딩을 사용한다.
// 변수 호출은 자료형 기준이다.
// 함수(메서드)호출은 생성자 기준이다.(오버라이딩)
// 자식의 오버라이딩을 찾아 내려가는 것을 동적 바인딩이라고 한다.
static void attack(Animal u1, Animal u2) {
System.out.println(u2.getName() + "가 " + u1.getName() + "에게 공격 당했습니다.");
}
public static void main(String[] args) {
Dog d1 = new Dog();
Cat c1 = new Cat();
Bird b1 = new Bird();
System.out.println(d1.NAME + "탄생");
System.out.println(c1.NAME + "탄생");
System.out.println(b1.NAME + "탄생");
// 강아지 vs 고양이
attack(d1, c1);
// 강아지 vs 새
attack(d1, b1);
// 고양이 vs 새
attack(c1, b1);
}
}
추상 클래스
'Programming Language > Java' 카테고리의 다른 글
이클립스 lombok 롬복 (자동 생성자, 자동 게터 세터) (0) | 2020.03.31 |
---|---|
이클립스 계층별로 패키지 정리 (0) | 2020.03.31 |
200327 객체지향 프로그래밍, 오브젝트, STATE, PUBLIC, PRIVATE (0) | 2020.03.27 |
자바 스타크래프트 유닛으로 객체 이해하기 (0) | 2020.03.27 |
자바 메서드(함수)의 의미와 중요성 (0) | 2020.03.27 |