[Java] 자바 문법(다형성 / 추상 클래스 / 예외처리)

김도윤·2025년 1월 10일

추가 공부

목록 보기
6/8
post-thumbnail

☁️2025-01-10


🎈다형성(Polymorphism)(중요)

  • 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질(Up Casting, Down Casting)
  • 부모 클래스 타입의 참조 변수에 자식 객체들을 대입하여 다룰 수 있는 것이 다형성의 기본 개념이다.

✏️업 캐스팅(Up Casting)

  • 자식 타입의 객체가 부모 타입의 객체로 형 변환되는 것을 말한다
  • 자동으로 형 변환이 일어나기 때문에 부모 클래스 타입의 참조 변수가 모든 자식 객체들을 별도의 형 변환 없이 대입 받을 수 있다.
  • 부모 타입으로 업 캐스팅된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근 가능
  • 예외로 부모 탑입의 메소드가 오버라이딩 되었다면 오버라이딩된 메소드가 대신 호출

<부모 클래스>

// 부모 클래스
public class Animal {
  private String name;
  private String kinds;

  // 생성자 선언
  ... 

  public String bark() {
      return "짖는다.";
  }
}

<자식 클래스>

// 자식 클래스
public class Dog extends Animal {
  private int weight;

  // 생성자 선언
  ... 
  @Override
  public String bark() {
      return "멍멍~ " + super.bark();
  }
}

ex)

// Dog 클래스 타입의 객체를 Animal 클래스 타입의 참조 변수에 대입
Animal animal = new Dog();

// 자식 클래스에서 오버라이딩 된 코드가 실행된다.
System.out.println(animal.bark()); // "멍멍~ 짖는다." 출력

```java
// Cat 클래스 타입의 객체를 Animal 클래스 타입의 참조 변수에 대입
Animal animal = new Cat();

// 자식 클래스에서 오버라이딩 된 코드가 실행된다.  
System.out.println(animal.bark()); // "야옹~ 운다." 출력

똑같은 실행 코드로 다양한 실행 결과를 이용할 수 있는 것을 ex)를 통해 알 수 있고 이를 다형성이라 한다

✏️다운 캐스팅(Down Casting)

  • 부모 타입의 객체가 자식 타입의 객체로 형 변환되는 것을 말한다
  • 자동으로 형 변환이 일어나지 않기 때문에 형 변환 연산자를 사용해서 형 변환을 해야 한다
  • 업 캐스팅을 통해 부모 클래스로 참조된 객체를 다시 원래의 자식 타입으로 변환하는 과정으로 사용
    Animal animal = new Dog();
    // 클래스 간의 형 변환은 반드시 상속 관계에 있는 클래스들끼리만 가능하다.
    Dog dog = (Dog) animal; 
    // 상속 관계가 아니기 때문에 오류
    // Cat cat = (DOg) animal;
  • 부모 클래스 타입 참조 변수가 실제로 참조하는 객체를 확인하지 않고 강제 형 변환 시도 시 ClassCastException 예외 발생
  • 객체가 어떤 클래스의 인스턴스인지 instanceof 연산자를 사용하여 확인
    // animal이 참조하는 객체가 Dog 클래스로 생성된 객체이면 true
    // animal이 참조하는 객체가 Dog 클래스로 생성된 객체가 아니면 false
    if(animal instanceof Dog) {
      ...
    // animal이 참조하는 객체가 Cat 클래스로 생성된 객체이면 true
    // animal이 참조하는 객체가 Cat 클래스로 생성된 객체가 아니면 false
    } else if (animal instanceof Cat){
      ...
    } 

🎈추상 클래스(Abstract Class)

  • 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다
  • 추상 클래스를 부모 타입으로, 객체로 생성될 실체 클래스가 자식 타입으로 구현되어 추상 클래스의 모든 특성을 물려받을 수 있다.
  • 추상 클래스는 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없고 부모 클래스로만 사용

✏️추상 클래스 선언

  • 선언 구문 [접근 제한자] abstrat class 클래스명 { ... }
  • 추상 클래스 내에 필드, 메소드, 생성자를 포함할 수 있다
  • 추상 클래스는 객체로 생성이 안되지만 참조 변수의 타입으로는 사용이 가능

🎈인터페이스(Interface)

  • 인터페이스는 자바에서 클래스들이 구현해야 하는 동작을 지정하는 역할
  • class 선언 대신에 interface 키워드 사용
  • 인터페이스의 선언된 필드는 public static final의 특성을 갖는다
  • 인터페이스의 선언된 메소드는 public abstract의 특성을 갖는다
    public interface Runable {
      void run(); // public abstract 생략 가능
    }

✏️ 인터페이스 구현

  • 인터페이스를 구현하는 클래스는 클래스 선언부에 implements 키워드를 추가하고 인터페이스명을 명시
  • 인터페이스에 정의된 추상 메소드는 반드시 오버라이딩 해야 한다
    // 인터페이스 구현 방법
    public class Cat implements Runable {
      ...
    
      @Override
      public void run() {
        ...
      }
    }
  • 또한 상속과 다르게 인터페이스는 다중 구현이 가능
    // 인터페이스의 다중 구현 시 콤마(,)로 구분한다.
    public class Cat implements Runable, Swimable {
        ...
      @Override
      public void run() {
        ...
      }
    
      @Override
      public void swim() {
        ...
      }
    }
  • 인터페이스를 구현하는 클래스로 객체 생성 후 구현된 메소드 호출
    Cat cat = new Cat();
    
    cat.run();
    cat.swim();

🎈예외처리

✏️ 에러(Error)

  • 프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것을 프로그램 에러라고 한다
  1. 에러의 종류
    • 컴파일 에러 : 소스코드 상의 문법 에러로 소스코드를 수정하여 해결
    • 런타일 에러 : 프로그램 실행 중에 발생하는 에러로 사용자로부터 잘못된 값을 입력받거나 계산식의 오류 등으로 발생
    • 시스템 에러 : 컴퓨터 하드웨어 오작동 또는 고장으로 발생하는 에러로 소스코드를 수정하여 해결이 불가능

✏️예외(Exception)

  • 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류
  • 예외의 경우 if문 또는 예외 처리 구문을 통해서 예측 가능한 예외 상황에 대해 해결이 가능
  • 모든 예외는 Exception 클래스를 상속하고 있다
  1. Checked Exception

    • 반드시 예외 처리해야 하며 되어있지 않으면 컴파일 에러 발생조건
    • 소스코드 수정으로는 해결이 되지 않는다. 주로 외부에 매개체와 입출력이 일어날 때 발생한다.
  2. Unchecked Exception

    • 컴파일 시 예외 처리 코드가 있는지 검사하지 않는 예외를 말한다

✏️예외 처리

  • 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있도록 처리하는 코드를 예외 처리 코드라고 한다
  1. try-catch-finally 문

    • try 블록에는 예외가 발생할 가능이 있는 코드가 위치
    • try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행
    • finally 블록은 생략 가능, 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에 finally 블록 작성
      try {
        ...
      } catch (Exception e) {
        ... 
      } finally {
        // 예외 발생 여부와 상관없이 실행해야 하는 코드  
      }
  2. throws

  • 메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, throws 키워드를 통해 메소드를 호출한 곳으로 예외를 떠넘길 수 있다

profile
나태해 지지 말고 꾸준히

0개의 댓글