코딩과 결혼합니다

230919 - 자바의 정석 chapter 07 (362p ~411p) 본문

2세/Java

230919 - 자바의 정석 chapter 07 (362p ~411p)

코딩러버 2023. 9. 19. 14:06
728x90

instanceof 연산자

  • 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용. boolean값
  • 메서드 내에서 정확히 어떤 인스턴스인지 알 기 어렵기 때문

 

⭐참조변수와 인스턴스의 연결

  • 멤버변수의 경우 참조변수의 타입에 따라 달라진다.
  • 인스턴스변수에 직접 접근하면, 참조변수의 타입에 따라 사용되는 인스턴스 변수가 달라질 수 있으므로 주의한다.

 

 

⭐매개변수의 다형성

  • 조상클래스의 자손타입의 참조변수면 어느 것이나 매개변수로 받아들일 수 있다.

buy라는 메서드가 있다. buy(Tv t)를하면 tv밖에 살 수 없기 때문에 다른 제품들도 구입할 수 있는 추가 메서드가 필요하다. 이렇게 되면, 제품의 종류가 늘어날 때마다 Buyer클래스에는 새로운 buy메서드를 추가해 주어야 한다.

그러나 메서드의 매개변수에 다형성을 적용하면 간단히 처리할 수 있다.
void buy(Product p){
     money = money -  p.price;
     bounsPoint = bonusPoint + p.bonusPoint;
}

앞으로는 다른 제품 클래스를 추가할 때 Product클래스를 상속받기만 하면, but 메서드의 매개변수로 받아들여질 수 있다.

 

 

 

⭐여러 종류의 객체를 배열로 다루기

  • 조상타입의 참조변수로 자손타입의 객체를 참조하는 것이 가능하므로, 다름과 같이 할 수 있다.
Porduct p1 = new Tv();
Porduct p1 = new Computer();
Porduct p1 = new Audio();

위의 코드를 Product타입의 참조변수의 배열로 처리

Product p[]  = new Product[3]
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
  • Vector클래스 :
    • Object타입의 배열을 가지고 있어서, 이 배열에 객체를 추가하더나 제거할 수 있게 작성되어 있다.
    • 배열의 크기를 알아서 관리해 주기 때문에 저장할 인스턴스의 개수에 신경 쓰지 않아도 된다.

 

 

⭐추상클래스

     - 미완성 설계도에 비유할 수 있다. 멤버의 개수에 관계된 것이 아닌, 단지 미완성 메서드를 포함하고 있다는 의미.

  • 추상 클래스를 사용하는 이유
    • 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상클래스로서 중요한 의미를 가짐
    • 완전하지는 못하더라도 어느 정도 틀을 갖춘 상태에서 시작하는 것이 나을 것이다.
    • 서로 다른 설계도를 따로 그리는 것보다 공통부분만을 그린 미완성 설계도를 만들어 놓고, 이 미완성 설계도를 이용해 각각의 설계도를 완성하는 것이 훨씬 효율적일 것이다.
  • 추상 클래스의 작성
    • 공통적으로 사용될 수 있는 클래스를 바로 작성하는 경우 (추상화)
    • 기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우 (구체화)
    • 공통조상이 있으므로 하나의 배열로 다루는 것도 가능
    • abstract를 붙여 추상메서드로 선언하는 이유 : 자손 클래스에서 추상메서드를 반드시 구현하도록 강요하기 위해.
어차피 자손 클래스에서 오버라이딩하여 자신의 클래스에 맞게 구현할 테니 추상메서드로 선언하는 것과 내용 없는 빈 몸통만 만들어 놓는 것이나 별차이가 없지만 abstract를 붙여서 자손 클래스를 작성할 때 내용을 구현해주여야 한다는 사실을 인식할 수 있도록 한다.

 

 

 

⭐인터페이스

     - 인터페이스는 추상 메서드의 집합이다.

     - 구현된 것이 전혀 없는 설계도이다. (모든 멤버가 public)

  • 인터페이스 vs 추상 클래스
    • 추상 클래스는 클래스인데 추상 메서드를 포함하는 클래스로 멤버 변수를 가질 수 있다.
    • 인터페이스는 추상메서드만 포함하는 클래스로 멤버 변수를 가질 수 없다.
  • 인터페이스의 작성
    • 인터페이스의 모든 멤버는 public이다. (생략이 가능)
    • 상수 선언에서 public, finalc, static 생략 가능
    • 추상 메서드 선언에서 publicm abstract 생략 가능
  • 인터페이스의 상속
    • 인터페이스의 조상은 인터페이스만 가능하다. (Object가 최고 조상이 아님!)
    • 인터페이스는 다중 상속이 가능하다.(추상 메서드는 선언부만 있기 때문에 충돌해도 상관이 없다.)
      • 두 개의 클래스로부터 상속을 받아야 할 때 
        1.  두 조상클래스 중에 비중이 높은 쪽을 선택하고 다른 한쪽을 클래스 내부에 멤버로 포함시키는 방식으로 처리.
        2. 어느 한쪽의 필요한 부분만 뽑아서 인터페이스로 만든 다음 구현하도록 한다.
  • 인터페이스 구현
    • 인터페이스의 정의된 추상 메서드를 모두 구현해야한다.
  • 인터페이스를 이용한 다형성
    • 인터페이스도 구현 클래스의 조상 개념으로 본다.
    • 인터페이스 타입의 참조변수로 자손 객체를 참조 가능하다.(다형성 개념)
📌인터페이스 타입 매개변수의 사용은 해당 인터페이스를 구현한 클래스 객체만 가능하다.
📌리턴 타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 인스턴스를 반환한다는 것을 의미한다.
  • 인터페이스의 장점
    - 인터페이스는 두 객체 간의 연결, 대화, 소통을 돕는 중간 역할을 한다.
    1. 개발시간을 단축시킬 수 있다. 일단 인터페이스가 작성되면 이를 사용해서 프로그램을 작성하는 것이 가능.
    2. 표준화가 가능하다. Oracle DB가 가격이 오르면서 MySQL DB를 이용해야 하는 상황이 생김. 이 때 인터페이스가 없으면 수많은 자바 코드들을 변경해야 했을 것임.
      • 자바 애플리케이션과 DB사이에 JDBC라는 인터페이스 집합을 둠으로써,
        (애플리케이션 - JDBC - DATABASE) 의 간접관계가 형성됨.
      • 이 JDBC가 바로 ‘표준’에 해당.
    3. 서로 관계없는 클래스들의 관계를 맺어 줄 수 있다.
    4. 독립적인 프로그래밍이 가능하다. 인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제 구현에 독립적인 프로그램을 작성하는 것이 가능하다.
  • 인터페이스의 이해
    • 인터페이스는 실제 구현 내용을 감싸고 있는 껍데기이며, 인터페이스와 관계된 클래스는 직접적인 관계가 있는 인터페이스에만 영향을 받게된다.