Java의 정석 객체지향 프로그래밍

김민석·2026년 2월 25일

다형성

참조변수 하나로 여러 종류의 객체를 다루는 것
즉 부모 타입 참조변수로 자손 객체 참조가 가능하다는 것 반대는 X

참조변수 형변환

자손 -> 부모 (UpCasting) : 형변환 생략가능
부모 -> 자손 (DownCasting) : 형변환 생략불가
=> 그냥 오류나면 형변환 해주면됨. 그렇게 중요 X

instanceof 연산자

객체 타입 확인에 사용됨. if 문으로 instanceof 연산자를 사용해 true면 형변환 하여 그 해당 객체의 메서드 및 변수 사용 가능하도록.

instanceof 패턴 매칭

if (c instanceof FireEngine fe)
 fe.water();

이런식으로 기존에 instanceof 연산자를 사용해 확인 후 형변환 하던것을 생략할 수 있음.

switch문 패턴 매칭

switch문을 사용해 복잡한 if문을 사용하지 않고 처리가능.
모든 경우의 수 처리해야함. null인 경우도 처리 해야함. default 위에서

switch문 패턴 매칭 주의할점

switch 문은 위에서부터 주루룩 실행되므로 위에서 부모 타입이 있으면 아래에 있는 자손 타입에 도달하지 않으므로 부모 타입이 잇는 경우 자손보다 아래로 배치한다.

참조변수와 인스턴스의 연결

메서드는 항상 객체 타입에 정의된 것이 호출됨
부모와 자식이 같은 매개변수 및 메서드가 존재할때 class 에서 객체 생성해 호출할 경우 변수는 부모것이 호출 되지만 메서드는 자손꺼가 호출됨.
즉, 메서드는 참조변수 타입과 관계가 없음.

매개변수의 다형성

참조형 매개변수에 자신 or 자손 타입의 객체 대입 가능.

package com.codechobo.book;

public class Product {
    int price;
    int bonusPoint;

    Product(int price,int bonusPoint) {
        this.price = price;
        this.bonusPoint = bonusPoint;
    }
}

package com.codechobo.book;

public class Tv extends Product {
    Tv() {
        super(100,2); 
    }
}

package com.codechobo.book;

public class Buyer {
    int money =1000;
    int bonusPoint =0;

    void buy(Product p) {
        money = money -p.price;
        bonusPoint = bonusPoint + p.bonusPoint;
    }
}




package com.codechobo.book;

public class Hello {
    public static void main(String[] args) {
        Buyer b = new Buyer();

        System.out.println("구매 전 money = " + b.money);
        System.out.println("구매 전 bonusPoint = " + b.bonusPoint);
        b.buy(new Tv());

        System.out.println("구매 후 money = " + b.money);
        System.out.println("구매 후 bonusPoint = " + b.bonusPoint);
    }

}

Product는 가격과 보너스 포인트를 가지는 공통 부모 클래스이다.
Tv는 Product를 상속받으며, super()를 통해 가격을 초기화할 수 있다.
Buyer는 money와 bonusPoint를 가지며, buy(Product p) 메서드를 통해 상품을 구매한다.
buy의 매개변수 타입을 Product로 선언했기 때문에, Product를 상속받은 모든 상품(Tv등)을 하나의 메서드로 처리할 수 있다. 이는 상속과 다형성을 활용한 구조이다.

하나의 배열에 여러 종류의 객체 저장가능


위는 구매자의 cart를 구성한 코드이다. 다형성의 장점으로 하나의 배열에 여러 종류 객체 저장가능한 것으로 Proudct 배열을 cart로 만들어 여러 tv,audio 등등을 buy 메서드를 사용할때마다 cart에 넣어줄 수 있다.

추상 클래스

보통 추상 메서드를 가지고 있으면 추상 클래스.
추상 메서드는 선언부만 있는 경우를 추상 메서드라고함. 안에 몸통 로직이 없는경우

추상 클래스 사용 경우

최상위 부모 클래스를 추상 클래스 및 추상 메서드를 만든다. 그럼 추상 클래스는 객체 생성이 안됨. 그리고 그 자손의 클래스가 상속을 받아 그 안에서 부모안에 있던 추상 메서드를 완성시켜주어 사용함.

abstract class Player {
	abstract void play(int pos);
}

class AudioPlayer extends Player {
	void play(int pos) {
    	//이 안에서 로직 작성
    }
}
profile
나만의 기록장

0개의 댓글