[TIL] 2024-07-17

성장일기·2024년 7월 17일

회고

목록 보기
6/37

중요 학습 내용 [JAVA]

INHERITANCE

  • 정의
    • 각 클래스간의 부모-자식 관계를 맺어 부모클래스의 생성자를 제외한 멤버를 받아 자신의 멤버처럼 사용할 수 있도록 만든 문법적 요소
  • 목적
    • 클래스를 재사용하기 위함
    • 다형성을 위함
  • 선수 조건
    • 추상화(IS-A를 활용)

      자식은 부모의 클래스이다.라는 말을 만족하도록 부모-자식 관계를 구성
      "자식은 부모이다"가 말이 되면 된다.

      ex)
      Animal is a Tiger => doesn't make sense
      Tiger is a(n) Animal => make sense!
      자식: Tiger, 부모: Animal

  • 주의사항
    • 스파게티코딩: 상속의 상속관계가 연쇄적으로 맺어져 각각의 멤버가 본래 어떤 클래스의 소속인지를 파악할 수 없게 끔 코딩하는 방식.
    • JAVA는 단일 상속만 지원
    • 한 부모는 여러 자식을 가질 수 있으나, 한 자식은 여러 부모를 가질 수 없다.
    • 생성자는 상속받지 않는다.
    • 순수하게 재사용성만 고려하면 유지보수가 어려워지기에(OOP가 추구하는 바와 다름), Trade-off를 고려할 필요가 있다.

Overriding

  • 정의: 부모의 method를 자식 class에서 재정의.
    • 따라서 상속하는 부모의 method와 같은 이름의 method로 재정의
  • 목적: JAVA API는 기본적인 형식의 클래스를 제공하는데, (상속관계 상의) 적당한 시점에서 상속을 받아 커스텀하여 활용하기 제공하기 위함.

접근제어자

  • 부모클래스의 메서드를 Overriding하는 자식클래스의 메서드는 부모클래스의 메서드보다 더 좁은 범위의 접근제한자를 가질 수 없다.

반환 타입

  • 부모 클래스의 메서드를 오버라이드하는 자식 클래스의 메서드의 반환타입은 부모 클래스의 메서드의 반환타입을 상속받는 클래스로 설정할 수 있다.

SUPER & THIS

  • 각각의 키워드는 특정 클래스 내부에서의 관점으로 구분이 필요할 때, 명시적으로 사용한다.
  • 만일 특정 클래스 내부(+상속받은 필드)의 필드나 지역변수와 동일한 이름의 변수가 없을 때, 명시적으로 키워드를 작성하지 않으면, 컴파일 시점에 JVM이 자동으로 처리하여 바이트코드로 변환해준다.
  • Super
    • 모든 객체는 Object를 상속받는다.

POLYMORPHISM

  • 정의: 참조변수가 여러 타입의 객체를 참조할 수 있게끔 적용할 수 있는 문법적 요소

  • 특징

    • 상속을 하는 부모 클래스 타입의 참조 변수가 부모 클래스로부터 상속받는 다양한 자식 클래스를 참조할 수 있게끔 해준다.
    • 타입 은닉: 부모 클래스 타입의 참조 변수가 자식 클래스를 참조할 때, 참조 변수의 타입은 부모 클래스이기에 실제 인스턴스의 타입을 알 수 없다.
  • 예시:

    class Animal {
       void sound() {
           System.out.println("Animal makes a sound");
       }
    }
    
    class Dog extends Animal {
       @Override
       void sound() {
           System.out.println("Dog barks");
       }
    }
    
       @Override
       void run() {
           System.out.println("Dog runs");
       }
    }
    
    public class Application {
       public static void main(String[] args) {
           Animal myAnimal = new Dog();  // 업캐스팅: Animal 타입의 참조 변수가 Dog 객체를 참조 - 묵시적 형변환
           myAnimal.sound();  // 출력: Dog barks
    
           if (myAnimal instanceof Dog) {  // 정적 바인딩으로 compile error가 발생하지 않는 것에 대한 예외처리
               Dog myDog = (Dog) myAnimal;  // 다운캐스팅 - 명시적 형변환
               myDog.run();  // 출력: Dog runs
           }
       }
    }
  • 정적 바인딩: compile 시점에서 참조 변수의 메서드를 결정

  • 동적 바인딩: runtime 시점에서 참조 변수의 메서드를 결정

    • 실제 인스턴스(자식 객체)가 override하는 메서드를 호출할 수 있도록 한다.

ABSTRACT CLASS & ABSTRACT METHOD

  • ABSTRACT CLASS: 상속에서의 부모 역할만 하기 위한 클래스

  • ABSTRACT METHOD: body부가 없는 메서드로, 이후 해당 클래스를 상속받는 자식 클래스에서 해당 메서드를 재정의하도록 유도(규약)한 것.

  • 주의할 점:

    • 추상클래스는 직접적으로 인스턴스를 만들 수는 없다.
      • 하지만 추상클래스로부터 상속받는 자식클래스에서 기본생성자 선언 시 예외적으로 super()로서 객체가 생성된다.

기존에 몰랐던 이유

  • 내가 무엇을 모르는지 몰랐기에 학습 방법을 찾지 못했다.
  • 전반적인 흐름을 파악하지 못했다.
  • 키워드를 몰랐다.

개선의 여지

  • 상대방의 말에 귀를 조금 더 기울이자. 하나에 집중하다보면 다른 부분에 집중하기가 어려워진다.
profile
엔지니어로의 성장일지

0개의 댓글