[Java] 객체지향

N’oublie pas de t’aimer·2025년 1월 3일

Java

목록 보기
2/18

오버로딩 vs 오버라이딩

  • 오버로딩: 한 클래스에 이름이 같은 다른 메서드를 정의하는 것
  • 오버라이딩: 상속받은 클래스에서 메소드를 재정의하는 것

다형성

조상 타입 참조변수로 자손 타입의 인스터스를 참조할 수 있는 것
코드의 유연성과 재사용성을 향상해준다.

instanceof

형변환이 가능한지 확인하는 연산자
객체가 특정 클래스의 인스턴스이거나 그 클래스를 상속받은 클래스의 인스턴스이면 참.

public class ChessGame {

    ...

    // 6가지 기물이 추상화된 Piece가 파라미터로 들어온다.
    public void move(Piece piece) {

        // Piece가 Pawn일 경우를 처리하고 싶을 때 instanceof 사용
        if (piece instanceof Pawn) {
            ... // 대충 Pawn 이동 로직
        }
    }
}

위의 코드는 Piece를 사용하는 곳에서 하위 층인 Pawn을 사용하게 되어 추상화가 깨지고, Pawn의 로직들을 알 수 있기 때문에 캡슐화가 깨진다.

interface

추상메서드와 상수만을 멤버로 가질 수 있는 일종의 추상클래스이다.
인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
미래 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.

추상클래스

추상메서드(선언부만 있고 구현부가 없는 메서드)를 포함하고 있는 클래스
인스턴스를 생성할 수 없다.

final 키워드

클래스, 메서드, 변수 앞에 붙어서 변경될 수 없기 만들어 준다.
final 클래스는 상속될 수 없다. final 메서드는 오버라이딩을 통해 재정의될 수 없다. 변수 앞에 final이 붙으면 상수가 된다.

상속

기존 클래스를 이용해 새 클래스를 정의하는 것으로, 상속받은 클래스는 자손 클래스, 상속 대상은 조상 클래스가 된다. 자손 클래스는 생성자와 초기화 블록을 제외한 모든 멤버를 상속받는다. 자손 클래스는 부모 클래스 안에 구현된 코드를 재사용할 수 있어 코드의 재사용성을 높여준다.

다만 부모 클래스와 자식 클래스 간의 의존성이 높아져 코드의 유연성을 떨어뜨리고 유지보수를 어렵게 만들 수 있다.
또 계층 구조가 복잡해지는 단점이 있다.

조합은 클래스의 멤버 변수로 다른 객체의 참조변수를 선언하는 것이다.
A가 B를 상속할 경우 A is a B인 반면 A가 B를 포함할 경우 A has a B 관계가 된다.
상속은 부모 클래스 안에 구현된 코드 자체를 물려 받아 재사용하지만 조합은 객체 사이의 동적인 관계로, 포함되는 객체의 퍼블릭 인터페이스를 재사용할 수 있다.

public interface Engine {
    void start();
}

public class ElectricEngine implements Engine {
    public void start() {
        System.out.println("Electric engine starts");
    }
}

public class GasolineEngine implements Engine {
    public void start() {
        System.out.println("Gasoline engine starts");
    }
}

public class Car {
    private Engine engine;

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.start();
    }
}

Car 클래스는 런타임에 다른 종류의 엔진으로 교체할 수 있다.

profile
매일 1퍼센트씩 나아지기 ୧(﹒︠ ̫ ̫̊ ̫﹒︡)୨

0개의 댓글