1) 종류
분석 단계
학생
has a(use a) 컴퓨터
대학생
is a 학생
cat
is a pet
설계 단계
2) 종류
has a
표현public class 학생 {
string name;
컴퓨터 p; // 학생 has 컴퓨터를 은연 중 표현~
}
is a
표현
- 1) is a 관계:
대학생 is a 학생
고양이 is a 애완동물
개발자 is a 사원
- 2) 애완동물 관리 프로그램
![](https://velog.velcdn.com/images/heejoojeon/post/2fce08ab-927e-4448-9588-90816d2911dd/image.png)
- Cat, Dog, Bird 간에는 관계 없음
- 상속 관계(is-a) 로 선언되면, 부모의 변수, 메서드를 자식이 선언 없이 사용 가능 (생성자, private은 상속 불가)
Super class
Sub class
extends
뒤에는 하나의 부모 클래스만 올수 있다.+) 생성자 호출 및 정의 리뷰
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
System.out.println("Animal 생성자 호출");
}
}
public class Cat extends Animal {
public Cat(String name) {
super(name); // 부모 클래스의 생성자 호출
System.out.println("Cat 생성자 호출");
}
}
private 불가
+) 오버라이딩을 사용하는 이유
: 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 필요에 따라 수정하거나 보완하기 위해서임
이를 통해 코드의 재사용성
을 높이고, 유지보수를 용이하게 할 수 있음
class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();
myAnimal.makeSound(); // 출력: The animal makes a sound
myDog.makeSound(); // 출력: Woof
myCat.makeSound(); // 출력: Meow
}
}
"@Override"
어노테이션"@Override"
라는 어노테이션(annotation)을 제공하여 오버라이딩이 제대로 이루어졌는지를 확인class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof");
}
}
Pet[] pets = { new Cat("야옹이", "암컷", 2), new Dog("멍멍이", "수컷", 3, "진돗개"), new Bird("짹짹이", "암컷", "노랑") };
for (Pet p : pets) {
System.out.println(p.getName());
}
public void myMethod(Object obj) {
// 메서드 내용
}
Animal myAnimal = new Animal();
Cat myCat = new Cat();
Dog myDog = new Dog();
myMethod(myAnimal); // Object 타입으로 형변환되어 전달됨
myMethod(myCat); // Object 타입으로 형변환되어 전달됨
myMethod(myDog); // Object 타입으로 형변환되어 전달됨
class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();
myAnimal.makeSound(); // 출력: The animal makes a sound
myDog.makeSound(); // 출력: Woof
myCat.makeSound(); // 출력: Meow
}
}
Animal myAnimal = new Animal()은 Animal 클래스의 객체를 생성하는 것
Animal myDog = new Dog()와 Animal myCat = new Cat()는 각각 Dog 클래스와 Cat 클래스의 객체를 생성하면서 Animal 클래스로 형변환하여 참조하고 있는 것입니다.
이러한 성질을 "다형성(Polymorphism)"
이라고 부르며, 자바에서는 상속과 오버라이딩을 통해 이러한 다형성을 구현할 수 있습니다.
class Animal {
public void makeSound() {
System.out.println("Animal is making a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog is barking");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Dog dog = new Dog();
Animal a = new Dog(); // 다형성을 이용한 상위 클래스 타입의 변수에 하위 클래스 객체 할당
animal.makeSound(); // Animal is making a sound
dog.makeSound(); // Dog is barking
a.makeSound(); // Dog is barking (동적 바인딩 적용)
}
}
Dog 클래스가 Animal 클래스를 상속받고 있습니다. Animal 클래스에는 makeSound() 메서드가 정의되어 있고 Dog 클래스에서는 이 메서드를 오버라이딩하여 재정의했습니다.
main() 메서드에서 Animal 클래스와 Dog 클래스로 객체를 생성하고, Animal 클래스 타입의 a 변수에 Dog 클래스 객체를 할당합니다. 이렇게 하면 a 변수는 Animal 클래스 타입으로 선언되어 있지만, 런타임 시 Dog 클래스의 객체를 참조하게 됩니다.
m a.makeSound()에서는 a 변수가 참조하는 객체가 Dog 클래스이므로, Dog 클래스에서 오버라이딩한 makeSound() 메서드가 호출되어 "Dog is barking"이 출력됩니다.
실행 시점에서 객체의 실제 타입을 확인하여 적절한 메서드를 호출하는 것이 바로 동적 바인딩입니다.
java.lang.Object
모든 클래스의 최상위 클래스
clone(), equals(), hashCode(), toString()을 흔히 override해서 사용
object의 toString()
String s = "hello";
package p05;
import java.util.Date;
public class TestPet3 {
public static void main(String[] args) {
Cat c = new Cat("야옹", "암컷", 2);
// Cat 클래스에서 toString() 메서드를 재정의하지 않음
// Object 클래스에서 상속받은 기본 toString() 메서드가 호출
System.out.println(c);
System.out.println(c.toString()); // Cat@16진수
////////////////////////////////////API (우리가 만든 클래스가 아니라 내장된 것)
// String 클래스와 Date 클래스는 Java API (Application Programming Interface)에 포함된 클래스
// s는 String 클래스의 인스턴스
// String 클래스에서 toString() 메서드는 인스턴스 자신을 반환
String s = "hello";
System.out.println(s); // 참조변수, 자동으로 toString() 호출됨
System.out.println(s.toString()); //hello
// d는 Date 클래스의 인스턴스
Date d = new Date();
System.out.println(d);// d.toString()과 동일한 결과를 출력
System.out.println(d.toString()); // 2023~
}
}