오늘은 상속(Inheritance)과 다형성(Polymorphism)을 중심으로 객체지향 개념을 정리했다.
개념 자체가 많아서 처음엔 헷갈렸지만, 예제 코드를 다시 정리하면서 흐름이 조금씩 보이기 시작했다.
상속이란 부모 클래스의 필드와 메서드를 자식 클래스가 물려받는 것을 말한다.
이처럼 “~은 ~이다”라고 말할 수 있는 관계를
is-a 관계 또는 kind-of 관계라고 한다.
공통 로직을 부모 클래스에 두고 자식 클래스가 상속받아 사용하면
중복 코드를 줄이고 가독성을 높일 수 있다.
자식 클래스에서 기능을 추가하거나 변경(오버라이딩)하여
유연하게 확장할 수 있다.
부모 타입으로 자식 객체를 다룰 수 있다.
⚠️ 자바는 다중 상속을 지원하지 않으며, 반드시 하나의 부모 클래스만 가질 수 있다.
상속을 받기 위해서는 클래스 이름 뒤에 extends 키워드를 사용한다.
class Animal { // 부모 클래스
public void makeSound() {
System.out.println("동물이 소리를 냅니다");
}
}
class Dog extends Animal { // 자식 클래스
}
public class OverrideExam {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // 동물이 소리를 냅니다
}
}
부모 클래스의 메서드를 그대로 상속받아 사용할 수 있다.
메서드 오버라이딩이란
부모 클래스의 메서드를 자식 클래스에서 재정의하는 것이다.
@Override 어노테이션 사용 권장class Animal {
public void makeSound() {
System.out.println("동물이 소리를 냅니다");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("멍멍!");
}
}
public class OverrideExam {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // 멍멍!
}
}
부모 클래스의 필드나 메서드에 접근할 때 사용한다.
class Library {
int code = 1234;
}
class Book extends Library {
int code = 5678;
void print() {
System.out.println(code); // 자식 필드
System.out.println(super.code); // 부모 필드
}
}
부모 클래스의 생성자를 호출한다.
super() 호출class Parent {
Parent(String msg) {
System.out.println("Parent 생성자: " + msg);
}
}
class Child extends Parent {
Child() {
super("Hello from Child!");
System.out.println("Child 생성자 실행");
}
}
public class Main {
public static void main(String[] args) {
new Child();
}
}
👉 자식 객체를 생성할 때 부모 생성자가 항상 먼저 실행된다.
부모 클래스의 필드가 private일 경우
외부 클래스에서 직접 접근할 수 없기 때문에 getter/setter를 사용한다.
class Car {
private String name;
private int speed;
// Getter
public String getName() {
return name;
}
public int getSpeed() {
return speed;
}
// Setter
public void setName(String name) {
this.name = name;
}
public void setSpeed(int speed) {
if (speed >= 0) {
this.speed = speed;
}
}
}
public class GetterSetter {
public static void main(String[] args) {
Car car = new Car();
car.setName("BMW");
car.setSpeed(120);
System.out.println(car.getName());
System.out.println(car.getSpeed());
}
}
instanceof는 객체의 실제 타입을 확인하는 연산자이다.
주로 다운캐스팅의 안전성 확보를 위해 사용한다.
Animal animal = new Dog();
System.out.println(animal instanceof Animal); // true
System.out.println(animal instanceof Dog); // true
System.out.println(animal instanceof Cat); // false
Animal a = new Dog();
if (a instanceof Dog) {
Dog d = (Dog) a;
d.wagTail();
}
다형성이란 부모 타입으로 여러 형태의 자식 객체를 다룰 수 있는 것이다.
일반적인 객체 생성
Dog dog = new Dog();
다형성 활용 (업캐스팅)
Animal a = new Dog();
자식 고유 기능 사용 (다운캐스팅)
Dog d = (Dog) a;
오늘은 병원 진료 때문에 오전 수업을 듣지 못해
진도를 따라가기 조금 벅찼다.
그래도 회고가 끝난 후 약 3시간 정도 블로그 정리를 하면서
개념을 다시 복습하니 기본적인 흐름은 어느 정도 잡힌 것 같다.
요즘 점점 객체지향 개념이 재미있어지고 있어서
그 점은 다행이라고 느낀 하루였다.