자바의 정석 -(7장 객체지향 II)

김우경·2022년 2월 22일
0

Java

목록 보기
6/9
post-thumbnail

7장

가끔 헷갈리는 부분만 요약한 것입니다

4.1 상속

상속 : 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
ex) class Child extends Parent{  //...   }

상속해주는 클래스 : '조상 클래스'
상속 받는 클래스 : '자손 클래스'

조상 클래스 : 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스
자손 클래스 : 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스

상속을 받는다는 것은 조상 클래스를 확장한다는 의미

  • 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
  • 자손 클래스의 멤버 개수는 조상클래스보다 항상 같거나 많다.
  • 클래스간의 상속관계를 적절히 맺어 주는 것이 객체지향 프로그래밍에서 중요한 부분

클래스간의 관계 - 포함,상속

class Circle{
 int x;
 int y;
 intr;
}
class Point{
 int x;
 int y;
}
-->
class Circle{
Point c =new Point();
int r; //포함관계
}

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

  • 조상 클래스에 정의된 메서드와 같은 메서드(같은 이름의 메서드)를 자손 클래스에 정의(같은 이름의 메서드)하는 것을 '오버라이딩'이라고 한다.

class Card {
static final int KIND_MAX = 4; // 카드 무늬의 수
static final int NUM_MAX = 13; // 무늬별 카드 수

static final int SPADE = 4;
static final int DIAMOND = 3;
static final int HEART = 2;
static final int CLOVER = 1;

int kind;
int number;

public String toString() {
String[] kinds = {"", "CLOVER", "HEART", "DIAMOND", "SPADE"};
String numbers = "0123456789XJQK"; // 숫자 10은 X로 표현

return "kind : " + kinds[this.kind]
+ ", number : " + numbers.charAt(this.number);
} // toString()의 끝
} // Card클래스의 끝

이처럼 참조변수의 출력이나,덧셈연산자를 이용한 !!참조변수와 문자열의 결합!!에는
toString()이 자동적으로 호출되어 참조변수를 문자열로 대치한 후 처리
toString()은 어떤 종류의 객쳉에대해서도 toString()을 호출하는 것이 가능하다.

main 호출 시
Card c = d.pick();
Card e = d.pick(0);
System.out.println(c); // System.out.println(c.toString());과 같다.
System.out.println(e); // System.out.println(e.toString());과 같다.

1.5 Object클래스 - 모든 클래스의 조상

object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 object클래스로부터 상속받게한다.
object클래스에는 toString(), equals()와 같은 메서드를 따로 정의하지 않고도 사용할 수 있다. -> 기본적인 11개의 메서드가 정의되어 있다.

2.오버라이딩

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
자손 클래스 자신에 맞게 변경해야하는 경우

조건

  • 메서드의 선언부는 조상의 것과 완전히 일치해야 한다.
  • 이름, 매개변수, 반환타입이 같아야 한다.

예외조건

  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
    public > protected > (default) > private
  • 예외는 조상클래스의 메서드보다 많이(최상위도 x) 선언할 수 없다.
  • 인스턴스메서드를 static메서드로 또는 그 반대로 변경할수 없다?

2.3 오버로딩

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것

2.4 super

자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 변수
멤버변수, 지역변수의 이름이 같을 때 -> this()
상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때 -> super()

class Point(){
int x;
int y;
String getLocation(){
return "X:" +x+"Y:"+y}
}

class Point3D extends Point{
int z;
return super.getLocation() + "z:"+z
}
이처럼 super()를 사용하면 조상 클래스의 메서드가 변경되더라도 자동반영된다.

####2.5 super() - 조상 클래스의 생성자
this()와 마찬가지로 super() 역시 생성자이다.
조상 클래스의 멤버들을 사용하려면 초기화 작업이 수행되어야 한다
-> 자손클래스가 사용할 수 있기 때문에

생성자의 첫줄에 조상클래스의 생성자를 호출해야한다.--> 안하면 error

object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자,this(),super() 를 호출해야 한다.

3.package와 import

3.1 패키지

클래스의 묶음 : 클래스 또는 인터페이스를 포함시킬 수 있다.
서려 관련된 클래스들끼리 그룹단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다.

  • 패키지는 점을 구분자로 하여 계층구조로 구성할 수 있다.
  • 패키지는 물리적으로 클래스 파일을 포함하는 하나의 디렉토리이다.
  • 대소문자를 모두 허용하지만, 클래스명과 구분하기 쉽게 소문자를 원칙으로 한다.

3.3 import

다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다.
import문은 프로그램의 성능에 전혀 영향을 미치지 않는다. 많이 사용하면 컴파일 시간이 아주 조금 더 걸릴 뿐이다.
import 패키지명.* 실행 시 성능상의 차이는 전혀 없다.
하지만 import java.* 하위 패키지의 클래스까지 포함하는 것이 아니라서 선언해주어야한다.

  • java.lang.* 때문에 System, string 같은 클래스들의 패키지명으로 매우 빈번하게 사용되기 때문에 지정하지 않아도 되도록 한 것이다.

4.제어자

제어자의 종류는 크게 접근 제어자, 그 외의 제어자로 나눈다.
제어자는 클래스, 변수 또는 메서드의 선언부에 함께 사용된다.
접근제어자 : public, protected, default, private
그 외 : static, final, abstract, native, ...

static

공통적인 의 의미를 가지고 있다.
인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만,
클래스변수(static멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다. 하나의 변수를 모든 인스턴스가 공유한다.

static가 붙은 멤버변수와 메서드, 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생서하지 않고도 사용할 수 있다.

  • 인스턴스메서드와 static메서드의 근본적인 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있다.
    static이 사용될수 있는 곳 - 멤버변수, 메서드, 초기화 블럭

    멤버변수 : 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.
    클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.
    클래스가 메모리에 로드될 때 생성된다.

    메서드: 인스턴스를 생서하지 않고도 호출이 가능한 static 메서드가 된다.
    static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.

final

변경될수 없는 의미를 가진다.
final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수

클래스 : 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
다른 클래스의 조상이 될 수 없다.

메서드 : 변경될 수 없는 메서드, 오버라이딩을 통해 재정의될 수 없다.

멤버변수, 지역변수 : 변경할 수 없는 상수가 된다.

abstract

미완성의 의미를 가지고 있다.
메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않는 추상 메서드를 선언하는데 사용
그리고 클래스에 사용되어 클래스 내에 추상메서드가 존재한다는 것을 쉽게 알 수 있게한다.
abstract이 사용될 수 있는 곳 - 클래스, 메서드

클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미
메서드 : 선언부만 작성하고 구현부는 작성하지 않는 추상 메서드임을 말한다.

  • 추상 클래스는 아직 완성되지 않는 메서드가 존재하므로 인스턴스 생성 불가
  • 다른 클래스가 이 클래스를 상속받아서 일부의 원하는 메서드만 오버라이딩할 수 있다.

0개의 댓글