객체지향 프로그래밍 기술은 코딩을 쉽게 하려고 하는 것이기 때문에, 일부 요소를 제작할 때 어렵다면 사용하지 않아도 된다.
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);
}
}
객체지향 프로그래밍 1. Object - 실제로 존재할 수 있는 것을 상상 - 생산될 질럿을 머릿 속으로 상상 2. class - 추상적인 설계도, 또는 구체적인 설계도 - 프로토스 또는 질럿의 속성과 기능을 코드로 표현 3. Instance - 클래스를 통해 Object가 실체화 된 것 - 생산된 질럿 4. 생성자 - 클래스의 속성을 초기화 5. this - 인스턴스화 했을때 해당 인스턴스를 가리킨다 6. 행동(책임) - 메서드 7. 속성은 행동에 의해 변경된다. 8. 오버로딩 - 동일한 이름의 메서드를 여러가지 매개변수로 생성 9. final - 한번 초기화 하면 변경 할 수 없다. 불변데이터. Read Only 10. 오버로딩의 한계 - 자료형이 한정되어 있을때 사용
오브젝트 - 구체적인것 클래스 - 추상적이거나, 구체적. 이것을 이용해서 구체적인 것(오브젝트)를 만들 수 있는 것