자바의정석 7장

서현우·2022년 3월 21일
0

자바의정석

목록 보기
7/22

ch7-1 상속(Inheritance)

  • 기존의 클래스로 새로운 클래스를 작성 하는것.(코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것.
    class 자식클래스 extends 부모클래스 {
    //. . .
    }
  • 자손은 조상(부모의 부모)의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
  • 자손의 멤버 개수는 조사보다 적을 수 없다.(같거나 많다)
  • 자손의 변경은 조상에 영향을 미치지 않는다.

ch7-3 포함 관계

포함(composite)이란?

  • 클래스의 멤버로 참조변수를 선언하는 것

ch7-4 클래스 간의 관계 결정하기

상속관계 '~은 ~이다.(is-a)'
포함관계 '~은 ~을 가지고 있다.(has-a)'

ch7-5 단일 상속(Single Inheritance)

  • Java는 단일상속만을 허용한다.(C++은 다중상속 허용)
  • 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

ch7-6 Object클래스 - 모든 클래스의 조상

  • 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
  • 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
    toString(), equals(Object obj), hashCode(), ...
    상속계층도의 최상위

ch7-7 (메서드)오버라이딩(overriding)

  • override: 덮어쓰다
  • 상속받은 조상의 "메서드"를 자신에 맞게 변현하는 것

ch7-8 오버라이딩의 조건

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
    String getLocation() { //선언부(반환타입, 메서드이름, 매개변수 목록)
    }
  2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

ch7-9 오버로딩 vs 오버라이딩

  • 오버로딩(overloading) 기존에 없는 새로운 메서드를 정의하는 것(new)
  • 오버라이딩(overriding) 상속받은 메서드의 내용을 변경하는 것(change, modify)

ch7-10 참조변수 super

  • 참조변수 this(lv, iv 구별)와 비슷
  • 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
    (static 메서드 내에 사용불가)
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용

ch7-11 super() - 조상의 생성자

  • 조상의 생성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화
  • "생성자의 첫 줄에 반드시 생성자를 호출해야 한다."
    (그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입)

ch7-12 패키지(package)

  • 서로 관련된 클래스의 묶음
  • 클래스는 클래스 파일(*.class), 패키지는 폴더. 하위 패키지는 하위 폴더
  • 클래스의 실제 이름(full name)은 패키지를 포함.(java.lang.String)
    rt.jar는 클래스들을 압축한 파일(JDK설치경로\jre\lib에 위치)

ch7-13 패키지의 선언

  • 패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
  • 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
  • 패키지 선언이 없으면 이름없는(unnamed) 패키지에 속하게 된다.

ch7-14 클래스 패스(classpath)

  • 클래스 파일(*.class)의 위치를 알려주는 경로(path)
  • 환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용
  • classpath(환경변수)에 패키지의 루트를 등록해줘야 함.

ch7-15 import문

  • 클래스를 사용할 때 패키지이름을 생략할 수 있다.
  • 컴파일러에게 클래스가 속한 패키지를 알려준다.
  • 이클립스 단축키 ctrl+shift+o
  • java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.
    (String, Object, System, Thread ...)
  • import문을 선언하는 방법은 다음과 같다.
    import 패키지명.클래스명; //ctrl+shift+o
    또는
    import 패키지명.*; //모든 클래스
  • import문은 패키지문과 클래스선언의 사이에 선언한다.
  • import문은 컴파일 시에 처리되므로 프로그램의 성능에 영향없음.

ch7-16 static import문

  • static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.

ch7-17 제어자(modifier)

  • 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여

    접근 제어자 : public, protected, (default), private
    (4개 중 1개만 붙일 수 있다.)
    그 외 : static, final, abstract, ...

  • 하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만!)

ch7-18 static - 클래스의, 공통적인

  • 멤버변수, 메서드, 복잡초기화에 붙일 수 있음.

ch7-19 final - 마지막의, 변경될 수 없는

  • 클래스, 메서드, 멤버변수, 지역변수에 붙일 수 있음.

    클래스: 변경될 수 없는 클래스. 확장될 수 없는 클래스가 됨.
    --> 다른 클래스의 조상이 될 수 없다.(상속계층도의 최하위(String, Math))
    메서드: 변경될 수 없는 메서드.
    final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
    멤버변수,지역변수: 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 됨.

ch7-20 abstract - 추상의, 미완성의

  • 클래스, 메서드에 붙일 수 있다.

    클래스: 클래스 내에 추상 메서드가 선언되어 있음을 의미.
    메서드: 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림
    (미완성 클래스 -> 미완성 설계도 -> 제품 생성 불가)
    (추상 클래스는 인스턴스 생성 불가)
    ==> 상속을 통해 메서드를 완성 시켜야 함.
    ==> 추상클래스를 상속받아서 완전한클래스(구상클래스)를 만든 후에 객체 생성 가능.

ch 7-21 접근제어자(access modifier)

private : 같은 클래스 내에서만 접근 가능
(default) : 같은 패키지 내에서만 접근이 가능
protected : 같은 패키지, 다른 패키지의 자손클래스에서 접근 가능
public : 접근 제한이 전혀 없다
(public > protected > (default) > private)

ch7-22 캡슐화와 접근 제어자

접근 제어자를 사용하는 이유
-> 외부로부터 데이터를 보호하기 위해서
-> 직접접은은 막고, 메스드를 통한 간적접근 허용(getter/setter)
->외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서

ch7-23 다형성(polymorphism)

  • 여러 가지 형태를 가질 수 있는 능력
  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
  • 장점 2가지가 있음
    SmartTv s = new SmartTv(); //참조변수와 인스턴스의 타입이 일치
    Tv t = new SmartTv(); //조상타입 참조변수로 자손타입 인스턴스 참조
  • 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.
    Tv t = new SmartTv(); //OK. 허용
    SmartTv s = new Tv(); //에러. 허용안됨.
    --> 실제 사용 할 수 있는 기능보다 리모컨 버튼 개수가 더 많으면 안된다.

Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?
A. 아니오. 보통 일치하지만, 아닐 수도 있다.--> 다형성

Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이?
A. 사용할 수 있는 멤버의 개수가 달라짐.

Q. 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 있나요?
A. 아니오. 허용되지 않는다.

ch7-24 참조변수의 형변환

  • Only 사용할 수 있는 멤버의 개수를 조절하는 것
    (주소값, 객체 등은 변하지 않음)
  • 조상 자손 관계의 참조변수는 서로 형변환 가능
    (형제관계는 형변환 불가)
FireEngine f = new FireEngine();
Car c = (Car)f; //OK. 조상인 Car타입으로 형변환(생략가능)
FireEngine f2 = (FireEngine)c; //OK. 자손인 FireEngine타입으로 형변환
f2.water() 
//[아래 주석 확인 필요]
//컴파일은OK. But 형변환 실행 에러!! 
//실제로 가리키는 객체Car()에 water()가 없음!!
Ambulance a = (Ambulance)f; //에러. 형제간 형변환 불가
- 리모콘을 변경함으로써 사용 할 수 있는 멤버의 개수를 늘였다 줄였다 할 수 있다.
==>f(5개) -> c(4개) -> f2(5개)
==>참조변수간의 형변환

ch7-26 instanceof 연산자

  • 참조변수의 형변환 가능여부 확인에 사용. 가능하면 true 반환.
  1. 확인
    (형번환 해도 되는지, instanceof 사용)
  2. 형변환
    (instanceof에서 자기자신과 조상은 전부 true가 나오지만
    실제 가리키는 객체가 맞는지 확인해야함!)

Q. 참조변수의 형변환은 왜 하나요?
A. 참조변수(리모콘)을 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해서

Q. instanceof연산자는 언제 사용하나요?
A. 참조변수를 형변환하기 전에 형변환 가능여부를 확인할 때

다형성의 장점

  1. 다형적 매개변수
  2. 하나의 배열로 여러종류 객체 다루기

다형성

  1. Tv t = new SmartTv(); // 조상 참조변수로 자손 객체 다루기
  2. 참조변수의 형변환 -> 리모콘 바꾸기(사용가능한 멤버개수 조절)
  3. instanceof연산자 -> 형변환 가능여부 확인

ch7-27 매개변수의 다형성

  • 참조형 매개변수는 메서드 호출시,
    자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.

ch7-29 여러 종류의 객체를 배열로 다루기

  • 조상 타입의 배열에 자손들의 객체를 담을 수 있다.

ch7-31 추상 클래스(abstract class)

  • 미완성 설계도. 미완성 메서드를 갖고 있는 클래스
    (추상 메서드 : 몸통{}이 없는 미완성 메서드)
    ==> 추상 메서드가 있으면 추상 클래스.
  • 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가.
  • 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
    (추상메서드 몸통{} 만들기 --> 구현)

ch7-32 추상 메서드(abstract method)

  • 미완성 메서드. 구현부(몸통{})가 없는 메서드
    //주석을 통해 어떤 기능을 구행할 목적으로 작성했는지 설명
    abstract 리턴타입 메서드이름();

  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우

  • 추상메서드 호출 가능(호출할 때는 선언부만 필요)

ch7-34 추상클래스의 작성

  • 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나
    기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.
  • 추상화 <--> 구체화
  • 추상화된 코드는 구체화된 코드보다 유연하다. 변경에 유리

ch7-35 인터페이스(interface)

  • 결론: 추상 메서드의 집합
    (프로그래밍 관점)
  • 구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 public)
interface 인터페이스이름 {
	public static final 타입 상수이름 = 값; //상수
	public abstract 메서드이름(매개변수목록); //추상메서드
} //모든 인터페이스 멤버는 public, 모든 메서드는 추상메서드
//메서드: public, abstract 생략 가능!!
//상수: public, static, final 생략 가능!!

ch7-36 인터페이스의 상속

  • 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상 아님)
  • 다중 상속이 가능(추상메서드는 충돌해도 문제 없음)

ch7-37 인터페이스의 구현

  • 인터페이스에 정의된 추상 메서드를 완성하는 것
    (인터페이스: 미완성 설계도 --> 구현)
class 클래스이름 implements 인터페이스이름 {
	//인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
(implement뜻: 구현)
  • 일부만 구현하는 경우, 클래스 앞에 abstract를 붙어야 함.

Q. 인터페이스란?
A. 추상메서드의 집합

Q. 인터페이스의 구현이란?
A. 인터페이스의 추상메서드 몸통{}만들기(미완성 설계도 완성하기)

Q. 추상 클래스와 인터페이스의 공통점은?
A. 추상 메서드를 가지고 있다.(미완성 설계도)

Q. 추상 클래스와 인터페이스의 차이점은?
A. 인터페이스는 iv를 가질 수 없다.

ch7-38 인터페이스를 이용한 다형성

  • 인터페이스도 구현 클래스의 부모? --> Yes
  • 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.

ch7-39 인터페이스의 장점

  • 두 대상(객체)간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
  • 선언(설계)와 구현을 분리시킬 수 있게 한다.
    (선언-껍데기, 구현-알맹이)
  • 변경에 유리, 유연한 코드
  • 개발 시간을 단축할 수 있다.
  • 변경에 유리한 유연한 설계가 가능하다.
  • 표준화가 가능하다.
  • 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.

ch7-40 디폴트 메서드와 static 메서드

  • 인터페이스에 디폴트 메서드, static메서드 추가 가능.(JDK1.8부터)
  • 인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어려움.
    해결책--> 디폴트 메서드(default method)
  • 디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반)
  • 디폴트 메서드가 기존의 메서드와 충돌할 때의 해결책
  1. 여러 인터페이스의 디폴트 메서드 간의 충돌
  • 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다.
  1. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
  • 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
    --> 그냥 직접 오버라이딩 하면 해결

하루 30분씩 6, 7장 번갈아서 요약한 것을 봐라!!

profile
안녕하세요!!

0개의 댓글