[F-lab 모각코 챌린지 13일차] TIL

JeongheeKim·2023년 6월 13일

TIL

목록 보기
13/66

학습계획


  • 자바의 신 10장 읽고 정리
  • 자바의 신 10장 연습문제 풀기

Today I Learned


자바에서 상속이란?

extends라는 예약어로 부모의 클래스를 상속받는다.

  • 자식 클래스의 생성자가 호출되면, 자동으로 부모클래스의 매개변수 없는 생성자가 실행된다.
  • 자식 클래스에서는 부모클래스에 있는 public, protected로 선언된 모든 인스턴스 및 클래스 변수와 메소드를 사용할 수 있다.
  • 자바에서는 다중ㅅ아속이 되지 않아, 두가지 이상의 클래스를 상속할 수 없다.

상속과 생성자

  • 부모 클래스의 생성자가 기본생성자일 경우 기본생성자를 자동으로 생성해서 부모의 기본 생성자를 직접 명시하지 않아도 되지만, 매개변수가 있는경우는 아래와 같이 코드를 작성해야한다.
  • 자식 클래스에서 부모 클래스의 생성자를 명시적으로 지정 시 super()를 사용한다.
    • super()를 사용하여 부모 클래스의 생성자를 호출한다.

    • 자바는 매개변수가 없는 기본생성자를 찾는것이 기본이고, 클래스의 생성자 중 변수가 있는 생성자가 있을 경우 super()를 사용하게 된다.

    • super()메소드를 명시하지 않으면 컴파일 시 자동으로 생성된다.

    • public class Parent {
          public Parent(String name) {
              System.out.println("parent constructor" + name);
          }
      
          public void printName() {
              System.out.println("parent printName()");
          }
      }
      public class Child extends Parent {
          public Child() {
              super("test");
              System.out.println("child constructor");
          }
      }

메소드 Overriding

  • 자식 클래스에서 부모 클래스에 있는 메소드와 동일하게 선언하는것
  • 접근 제어자, 리턴 타입, 메소드 이름, 매개변수타입 및 개수가 동일해야한다.
public class Parent {
    public Parent() {
        System.out.println("parent constructor");
    }

    public void printName() {
        System.out.println("parent printName()");
    }
}
public class Child extends Parent {
    public Child() {
        System.out.println("child constructor");
    }
    public void printName() {
        System.out.println("child printName");
    }
}
public class MainTest {
    public static void main(String[] args) {
        Child child = new Child();
        child.printName();
    }
}
parent constructor
child constructor
child printName
  • 부모 클래스에 선언된 메소드와 동일하게 자식 클래스에서 오버라이딩했는데(=시그니처(메소드 이름, 매개변수 타입 및 개수)가 같다.) 자식 클래스에 선언된 메소드가 호출되었다.
    • 생성자의 경우 자동으로 부모 클래스에 있는 생ㅅ어자를 호출하는 super()가 호출되지만, 메소드는 그렇지 않다.

    • 부모 클래스의 메소드를 오버라이딩 할때 자식 메소드가 부모 클래스 메소드의 접근 제어자보다 범위가 축소 될 수 없다.
      - @Override 어노테이션을 통해 검사할 수 있는데 접근 범위가 좁아졌기때문에 컴파일 오류가 난다.

      public class Parent {
          public Parent() {
              System.out.println("parent constructor");
          }
      
          **private** void printName() {
              System.out.println("parent printName()");
          }
      }
      
      public class Child extends Parent {
          public Child() {
              System.out.println("child constructor");
          }
          @Override
          **public** void printName() {
              System.out.println("child printName");
          }
      }

참조 자료형의 형 변환

public class MainTest {
    public static void main(String[] args) {
        Parent child = new Child();
        Child parent = (Child) new Parent();
        child.printName();
    }
}
  • 부모 클래스를 상속받았을때는 부모타입으로 형변환이 가능하지만 자식 타입으로 형변환시에는 명시적 타입 선언이 있어야한다.
  • 형변환 이후 instanceof() 메서드를 통해타입 검사 시 작은 타입의 타입부터 검사 해야한다.

polymorphism - 다형성

  • 다형성을 구현하기 위해 자동타입변환 + 메소드 오버라이딩이 구현되어야한다.
  • 다형성이란 하나의 객체가 여러 가지 타입을 가질 수 있는것을 뜻한다.
  • 자바에서는 다형성을 부모클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 구현한다. Parent child = new Child();

  • switch문은 내부적으로 jump table, lookup table방식을 선택해서 실행한다고 한다.
    • jump table
      • case :1, case:2, case:3 이렇게 균등하게 case가 있을 경우는 jump table
    • lookup switch
      • case :1, case:242, case:3515 불균등하게 있을 경우 look up table 방식을 사용한다고 한다.

정리해봅시다

상속을 받는 클래스의 선언문에 사용하는 예약어는 무엇인가요?

  • extends

상속을 받은 클래스의 생성자를 수행하면 부모의 생성자도 자동으로 수행된다.

  • O

부모 클래스의 생성자를 자식 클래스에서 직접 선택하려고 할 때 사용하는 예약어는 무엇인가요?

  • super

메소드 Overriding과 Overloading을 정확하게 설명해 보세요.*

  • 메소드 오버라이딩은 부모의 클래스에 선언된 메서드들을 동일한 시그니처로 자식의 클래스에서 재정의하는것
  • 메소드 오버로딩은 동일한 메서드명을 타입, 매개변수 개수, 순서등을 달리하여 동일한 이름의 동일한 역할을 하게 하는것.

A가 부모, B가 자식 클래스라면 A a=new B(); 의 형태로 객체 생성이 가능한가요?*

  • O

명시적으로 형변환을 하기 전에 타입을 확인하려면 어떤 예약어를 사용해야 하나요?*

  • instanceof

위의 문제에서 사용한 예약어의 좌측에는 어떤 값이, 우측에는 어떤 값이 들어가나요?*

  • 좌측에는 형변환 하기전 타입, 우측에는 형변환 한 후 의 타입이 들어간다.

instanceof 예약어의 수행 결과는 어떤 타입으로 제공되나요?*

  • boolean

Polymorphism이라는 것은 뭔가요?*

  • 다형성이란 하나의 객체가 여러가지 타입을 가질 수 있음을 뜻한다.
  • 메소드 오버라이딩과 자동타입 변환이 구현되어야한다.

0개의 댓글