ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA]_6일차_05.04
    프로그래밍/Java 2021. 5. 5. 08:37

    Important


    나의 Vision & Mission 은?

    • Vision:
    • Mission:

    What I don't know


    Q. 인터페이스는 다중으로 implements 될 수 있는데 이러면 또한 다중 상속을 하지 않는 이유 中 하나인 death diamond 문제에 빠지지 않는가?



    Vision

    • Your vision of a future situation or society is what imagine or hope it would be like, if things were very different from the way they are now.
    • 나, 가족, 공동체, 국가, 인류 - 상상하고 희망하는 것

     

    Mission (사명)

    • If you say that you have a mission, you mean that you have a strong commitment(헌신) and sense of duty(의무감) to do or achieve(해내다) something.

    프로그래밍 실력

    • 라이브러리를 많이 아는 것 → 실력
      • API문서 + 구글 계속 살펴보기 (읽고 해보고 읽고 해보고 반복)

     

    클래스 계층 구조

     

    (중요) 메소드에 접근하는 과정

    다형성의 이점

    • 상위 타입의 참조 변수로 하위 타입의 모든 객체를 받을 수 있다(제어)

     

    웬만하면 사진처럼 상위 타입의 참조변수 - 하위 타입 으로 만드는게 좋다고 한다

    상속의 기본적인 원칙

    • 웬만하면 자식 클래스에서 새로운 메소드를 추가하지 말아야 한다 (다형성의 위배, 고쳐야 할게 많아짐→버그와 직결)

    상속

    • java에서는 super class는 한개만! (다중 상속 불가능)
    • sub class는 여러개 가능! (Animal — Dog, Hippo, Rion.....)

    is-a 관계(물려받는 관계(extends))

    has-a 관계(훨씬 많음, 이용하는 관계)

    • is-a 관계
      • 늑대 is a 동물 (동물 is a 늑대 X) : 반대로는 불가능

    상위 클래스의 private 변수는 상속이 가능한가?

    • ex) Animal - Dog 상속관계
    • 접근이 불가능하다, 다만 public로 지정한 getter, setter함수를 이용하면 접근이 가능하다
    • Head First Java_217p에서는 상속되지 않는다고 설명되어 있다

    ★★★ 상속의 이점 (pdf 203p-206p)

    • 코드 중복 방지 (상위 클래스 멤버 사용가능하기 때문)
    • ★★★★ Inheritance provides a powerful and natural mechanism for organizing and structuring your software. (You define a common protocol for a group of classes)
    • 상위 타입의 참조 변수로 하위 타입의 모든 객체를 받을 수 있다 (ex. Animal an = new Dog();)

    ??????

     

    다형성이 성립되지 않는다면

    • 다형성이 성립되지 않는다면 giveShot() 를 타입에 맞게 여러개 만들어야 한다 (Animal a → Dog a, Cat a, Lion a........)
      • → 변화에 유연하게 대응할 수 없게됨

     

    Overriding ↔ Overloading (의미는 전혀 다르다)

    • 부모 관계의 메소드는 Overriding ↔ 형제 관계의 메소드는 Overloading
    • Overriding:
      • 상속 관계일 때, 부모로부터 물려받은 메소드를 재사용하는 것
      • 인스턴스 변수는 오버라이드 대상이 아니다. 오버라이드가 필요하지 않다.
      • Argument는 같아야 한다.
      • 즉, 서브 클래스에서 매개변수가 다르게 선언된 메소드는 Override가 아니다 ! (새롭게 선언하는 메소드이다)
    • Overloading:
      • 이름이 같은 함수를 여러개 사용하는 것(매개변수 형태(개수, 타입)에 따라 구분된다)
      ex) System.out.println("xxx"); System.out.println(100);

    Interface (100% 추상 클래스)

    • 인스터스를 만들 수 없는 클래스
    • 자바에서 필수불가결한 부분(정말 중요)

    추상클래스

    Animal a = new Animal(); 여기서 Animal() 객체는 Dog? Cat?

    • 따라서, 상위 클래스(Animal, Feline, Canine)에 new를 할 수 없게 만드는 abstract를 붙여야 한다(추상 클래스로 만들어야 한다).

    추상메소드

    • 메소드 실행 내용이 없는 메소드 = ****추상 메소드
    • 추상 메소드를 담고 있는 클래스는 무조건 추상 클래스여야 한다(abstract를 붙여야 한다).
    • 상위 클래스에 추상 메소드가 있을 경우, 하위 클래스는 해당 메소드를 반드시 Override해야 한다. (+ 하위 클래스를 추상 클래스로 만들면 Override 안해도 됨)

    Object 클래스內

    • 객체에 대한 내용을 String으로 반환하는 메소드 목록
    • equals(Object o)
    • getClass()
    • hashCode()
    • toString()

    ★★★★★247p

    • 컴파일러는 레퍼런스 변수의 타입을 보고 어떤 메소드를 이용할 수 있는지 없는지 판단하지, 실제 연결되어 있는 객체의 타입을 판단하지는 않는다. ← 중요 !!!
    • aDog 변수를 선언할 때 지정한 타입(Dog)을 보고 판단을 하지, 실제 객체(new Dog())의 타입을 보고 판단하지 않는다.

    인터페이스 사용하는 이유

    • 상속의 단점: 필요하지 않은 것까지 상속받게 된다 ex) Animal - Lion (Dog()에만 필요한 adorable()까지 상속받게 된다)

    반론

    • → 근데 dog() 에만 메소드를 추가하면 되지 않은가?? → 가장 최악의 방식 → 그렇게 하는 순간 다형성을 사용할 수 없다
    • dog() 메소드에만 특별한 메소드가 있다는 것을 알고 있어야 한다
    • 변경할 일이 생기면, 변화로 인한 복잡성이 증가한다
    • 다중 상속! → 실제로 c++ 에서는 다중 상속을 허용하고 있다. → 하지만 diamond problem이 발생한다 (ex. 두 상위 클래스에 각각 존재하는 같은 이름의 메소드를 상속받게 된다면?)
    • → 이를 해결하기 위한 방법은 아주 복잡하다.
    • 다음과 같은 상속의 한계 → 인터페이스를 사용한다

    super 키워드

    • super.xxx : 상위 클래스에 접근 가능

    Object 최상위 클래스

    • java.lang 패키지 안에 있는 Object 최상위 클래스

    댓글

Designed by Tistory.