읽은 책 정리/자바의정석 3판

[Java] Chapter07 객체지향 프로그래밍

포포015 2021. 3. 22. 14:57

상속

- 상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는것

(새로 작성하고자 하는 클래스의 이름뒤에 상속받고자 하는 클래스의 이름을을 키워드 'extends'와 함께 써주면됨)

- 조상 클래스가 변경되면, 자손클래스는 영향받지만, 자손클래스가 변경되어도 조상클래스는 영향 X

 (생성자와 초기화 블럭은 상속 X)

 자손클래스의 멤버 개수는 조상보다 같거나 많다

 자손클래스의 인스턴스를 생성하면, 조상클래스의 멤버와 자손클래스 멤버가 합쳐진 인스턴스로 생성됨

 

클래스간의 관계 - 포함관계

- 하나의 거대한 클래스를 작성하는것보단, 단위별로 여러개의 클래스를 작성한다음

 이 단위로 클래스들을 포함관계로 재사용 하는 방법이 간결하고 손쉽게 클래스 작성가능.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Ciracle{
    int x;
    int y;
    int z;
}
////보단 아래와 같이 세분화 하는게 더 바람직
class Point{
    int x;
    int y;
}
class Ciracle{
    Point p = new Point();
    int z;
}
cs

 

클래스간의 관계 결정

- 클래스 작성시 ,상속관계 OR 포함관계 결정할때는

 ~은 ~ 이다(is-a)와(상속) ~은 ~을가지고 있다(has-a)문장(포함)을 만들어보면 클래스간의 관계가 명확해진다

 

단일 상속

- 자바는 단일 상속만 허용

 

object 클래스는 모든 클래스의 조상

 - 모든 클래스의 상속 계층도의 최상위에 있는 조상클래스 이다.(마지막 최상위조상은 object클래스)

 아무것도 상속안받은 클래스는, 자동적으로 extends object를 컴파일러가 추가해줌

 

오버라이딩 

- 조상 클래스로 부터 상속받은 메서드 내용 변경(덮어쓰다)

 

오버라이딩 조건

 - 오버라이딩은 메서드의 내용만을 새로작성하는것이기 때문에, 메서드의 선언부는 조상의것과 완전히 일치해야함

 (이름,반환타입, 매개변수가 같아야함)

 

오버로딩 과 오버라이딩의 차이

- 오버로딩 - 기존의 없는 새로운 메서드 정의하는 개념(new) -> println 과같은.

- 오버라이딩 - 조상으로부터 상속받은 메서드 내용변경 (change) - >덮어 씌우는

 

super

- 자손 클래스에서 조상클래스로부터 상속받은멤버를 참조하는데 사용되는 참조변수 ( this와 비슷한기능) 조상클래스 멤버와, 자손클래스 멤버가 중복정의되고 서로 구분해야할 경우 super를 사용하자( 메서드에도 사용가능)

 

super() 조상 클래스의 생성자

- this()와 같은 클래스의 다른 생성자 호출이지만, super()는 조상클래스의 생성자를 호출하는데 사용 모든 클래스의 생성자는 첫줄에 반드시 자신의 다른생성자, 조상생성자를 호출해야함( 그렇지않으면 생성자 첫줄에 컴파일러가 super()를 추가 해줌)

 

제어자

접근 제어자, 그외 제어자로 나뉠수 있다

접근제어자 - public , private , (default), protected

그외 - static, final, absract 

 

static  - 클래스 공통적인

- static 이 붙은 메서드는 인스턴스 생성 X 호출가능

 (멤버 변수는, 공통적으로 사용하는 클래스 변수가 된다( 인스턴스 생성 X 사용가능)

 클래스가 메모리로드시, 생성됨

absract - 추상, 미완성의

- 메서드 선언부만 작성, 실제 수행내용 구현 X (인스턴스 생성 불가)

 

접근제어자

- 해당하는 멤버 또는, 클래스를 외부에서 접근하지 못하도록 제한하는것.

 (접근제어자가 지정되있지 않다면 접근제어자는 default 이다)

private - 같은클래스내 접근가능

default - 같은 패키지내 접근가능 (접근제어자를 선언하지 않으면 자동적으로 default 선언됨)

protected - 같은 패키지내에서  + 다른 패키지의 자손 클래스 접근 OK

public - 제한 X

 

제어자의 조합

1) 메서드에 static과 absract 함께 사용 X

2) 클래스에 absract와 , final 동시에 사용 X

3) absracte 메서드의 접근제어자는 private 는 X (다른 클래스에서 접근해서 구현해야하기떄문)

4) 메서드에 private과 final 같이 사용 X

 

다형성

- 조상타입의 참조변수로, 자손 클래스의 인스턴스를 참조할수 있다

 (참조변수의 타입에 따라 사용할수 있는 멤버변수가 달라진다.)

 

참조변수의 형변환

- 서로 상속 관계에 있는 클래스 사이에서 형변환 가능(업,다운 캐스팅)

 자식 - > 부모 타입 인스턴스 참조 X (참조변수가 가르키는 인스턴스 타입 Check)

 

instanceof 연산자

- 인스턴스 실제 타입 확인 / (참조변수) instanceof (클래스명)

 파라미터를 조상타입으로 선언후, 자식이 어떤게 들어올지 모르기 때문에 그때사용. (결과가 true시 형변환가능)

 

매개변수의 다형성

- 메서드의 매개변수로 조상클래스를 선언해두면, 자손타입의 참조변수면 어느것이나 허용가능

 

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

- 조상클래스의 배열을 만들어두고, 각각의 인덱스에 자손타입의 객체를 넣어서 사용가능하다.

 

추상 클래스 

-미완성 설계도(인스턴스 생성불가) // 상속을 통해, 자손클래스에 의해 완성가능 

 추상메서드를 포함했을뿐, 생성자와 멤버변수 메서드를 가질수 있다.

 

추상메서드 (asbracte method)

- 설계만 해두고, 수행될 내용 구현 X

주석을 통해 , 어떤 기능을 수행할 목적으로 작성되었는지 알수 있다.

 

인터페이스

-오직 추상메서드와, 상수만 멤버로 가질수 있다(일반메서드, 멤버변수 X)

 

인터페이스의 작성

- 인터페이스에도 접근제어자가능

 모든 멤버변수는 public staic final (생략가능) // 컴파일러 자동생성

 모든 메서드는 public absracte (생략가능) // 컴파일러 자동생성

 

인터페이스 상속

- 인터페이스는 인터페이스로만 상속 가능( 다중상속가능)

 

인터페이스 구현

- 인터페이스도, 추상클래스처럼 인스턴스 생성 불가. 자손 클래스에서, 상속받아 구현

 클래스는 확장한다는 의미의 키워드 'extends' , 인터페이스는 구현한다는 의미로 'Implements'의 차이가 있다

 

인터페이스를 이용한 다형성

- 자손클래스의 인스턴스를 조상타입의 참조변수로 참조 가능하다.

 (리턴타입이 인터페이스 라는것은, 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는것을 의미)

 

인터페이스의 장점

1) 표준화가능 

2) 독립적인 프로그래밍가능

3) 서로 관계없는 클래스들에게 관계를 맺어줄수 있다.

4) 개발시간 단축가능

 

인터페이스의 이해

- 클래스를 사용하는(user)쪽 클래스를 제공하는 (provider)

( 사용하는 쪽은, 메서드 선언부만 알면되서, 시간 단축 (메서드 내용을 알필요 X) - 느슨한결합

 

디폴드 메서드와 static메서드

- JDK1.8 부터 default 메서드가 생겼는데,

디폴트 메서드는 추상메서드의 기본적인 구현을 제공하는 메서드이고,

기존의 인터페이스를 구현한 클래스를 변경 안해도됨