
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
// 클래스 상속을 위해서는 'extends' 키워드 사용
class Dog extends Animal { // Animal 클래스를 상속한다.
// Dog 클래스에 객체 변수인 name과 메서드인 setName을 만들지 않았다.
// Animal 클래스를 상속했기 때문에 사용이 가능
void sleep() { // sleep 메서드 추가 => Dog클래스는 Animal 클래스보다 더 많은 기능을 가지게 되었다.
System.out.println(this.name+" zzz");
}
}
public class Sample {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("poppy");
System.out.println(dog.name);
dog.sleep();
}
}
// 결과 : poppy
// poppy zzz
IS-A 관계
Animal dog = new Dog(); // Dog is a Animal(O)
// Dog으로 만든 객체는 Animal 자료형이다.
Dog dog = new Animal(); // 컴파일 오류
// Animal is a Dog(X)
// Animal로 만든 객체는 Dog 자료형이다.
메서드 오버라이딩(method overriding) : 부모 클래스의 메서드를 자식 클래스가 동일한 형태로 또다시 구현 = 메서드 덮어쓰기
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Dog extends Animal {
void sleep() {
System.out.println(this.name+" zzz");
}
}
class HouseDog extends Dog {
}
public class Sample {
public static void main(String[] args) {
HouseDog houseDog = new HouseDog();
houseDog.setName("happy");
houseDog.sleep(); // happy zzz 출력
}
}
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Dog extends Animal {
void sleep() {
System.out.println(this.name + " zzz");
}
}
class HouseDog extends Dog {
void sleep() {
System.out.println(this.name + " zzz in house");
// Dog 클래스에 있는 sleep 메서드를 HouseDog 클래스에 다시 구현
// HouseDog 클래스의 sleep 메서드가 Dog 클래스의 sleep 메서드보다 우선순위 가짐
}
}
public class Sample {
public static void main(String[] args) {
HouseDog houseDog = new HouseDog();
houseDog.setName("happy");
houseDog.sleep(); // happy zzz in house 출력
}
}
public class House {
private Bedroom bedroom;
private LivingROom livingroom;
//...
int num = 10; // 정수 변수
double num2 = 10.1; // 실수 변수
num = num2; // num2값을 num에 대입 -> X. double타입이 int타입에 대입될 수 없다.
num2 = num; // num의 값을 num2에 대입 => O. int타입이 double타입에 대입되었다.(X)
// => int타입이 double타입으로 모습을 바꿔서(형변환) 대입되었다.(O)
System.out.println(num2);
// 정수가 실수가 되는 것은 안전. 10 => 10.0, 100 => 100.0
// 실수가 정수가 되는 것은 위험. 10.3 => 10, 3.14 => 3
// 안전한 변환은 자바가 대신 해줌. (자동형변환)
// 위험한 변환은 자바가 막음. 에러가 나고, 개발자가 강제로 변환은 가능(수동 형변환)
num2 = num; // 안전한 자동 형변환
num = (int)num2; // 값 앞에 () 표현으로 형변환을 강제로 시도할 수 있다.
Parent parent = new Child();
좌항과 우항의 객체 유형이 서로 다른 경우 + 두 유형이 서로 상속관계에 있고 왼쪽 객체가 오른쪽 객체의 상위 클래스인 경우 => 암묵적 형변환
하위 클래스 -> 상위 클래스로 할당하는 것 가능하나 반대의 경우에는 명시적 형변환 필요
암묵적 형변환
명시적 형변환
Tiger tiger = new Tiger(); // Tiger is a Tiger
Animal animal = new Tiger(); // Tiger is a Animal
Predator predator = new Tiger(); // Tiger is a Predator
Barkable barkable = new Tiger(); // Tiger is a Barkable
// 각 객체는 사용할 수 있는 메서드가 서로 다르다.