자바의정석 7장

7장 객체지향개념 II

7장 객체지향개념 II

ch7-1 상속(Inheritance)

  • 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
  • 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다.)
  • 자손의 변경은 조상에 영향을 미치지 않는다.
class Parent {
	int age;
} //멤버 1개

class Child extends Parent {
	void play() {
		System.out.println("놀자~");
	}
} //멤버 2개 : 자신의 멤버 1개, 상속받은 멤버 1개

class point {
	int x;
	int y;
} //2차원 좌표의 한 점

class Point3D {
	int x;
	int y;
	int z;
} //1. Point와 관계 X

class Point3D extends Point {
	int z;
} //2. Point를 상속하는 관계

Point3D p = new Point3D();
//객체를 만들면 1번, 2번 코드가 같다.

ch7-3 포함 관계

포함(composite)이란?

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 클래스의 관계 1)상속, 2)포함
  • 작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
class Circle {
	int x; //원점의 x좌표 -> c.x
	int y; //원점의 y좌표 -> c.y
	int r; //반지름 -> c.r
} //1. 관계 X

class Circle {
	Point c = new Point(); //원점 -> c.c.x, c.c.y
	int r; //반지름 -> c.r
} //2. Circle이 Point를  포함하는 관계->복잡도가 줄어둠
 
class point {
	int x;
	int y;
}

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

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

ex)
원(Circle)은 점(Point)이다.
원(Circle)은 점(Point)을 가지고 있다.

ch7-5 단일 상속(Single Inheritance)

  • Java는 단일상속만들 허용한다.
    class TvDVD extend Tv, DVD { //에러. 조상은 하나만 허용된다.
    //. . .
    }

  • 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

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

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

ch7-7 (메서드)오버라이딩(overriding) - 덮어쓰다

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
class Point {
	int x;
	int y;
	
	String getLocation() {
		return "x :"+x+", y :"+y;
}
}

class Point3D extends Point {
	int z;

	String getLocation() {
		return "x :"+x+", y :"+y+", z :"+z;
} //오버라이딩

ch7-8 오버라이딩의 조건

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
  2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

ch7-9 오버로딩 Vs. 오버라이딩

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

ch7-10 참조변수 super

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

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(환경변수)에 패키지의 루트를 등록해줘야 함.

ch 7-15 import문의

  • 클래스를 사용할 때 패키지이름을 생략할 수 있다.
  • 컴파일러에게 클래스가 속한 패키지를 알려준다.

import문의 선언

  • import문을 선언하는 방법은 다음과 같다.
    import 패키지명.클래스명;
    또는
    import 패키지명.*;
  • import문은 패키지문과 클래스선언 사이에 선언한다.
  • import문은 컴파일 시에 처리되므로 프로그램 성능에 영향없음.

ch7-16 static import문

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

ch7-17 제어자(modifier)

  • 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
    접근 제어자 public, protected, (default), private
    그 외 static, final, abstarct, native, trasient, synchronized, volatile, strictfp

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

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

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

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

  • 미완성 클래스, 미완성 설계도 : 제품생성 불가
    추상클래스를 상속받아서 완전한클래스를 만든 후에 객체 생성 가능.
  • 클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미.
  • 메서드 : 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림.

ch7-21 접근제어자(access modifier)

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

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

접근제어자를 사용하는 이유

  • 외부로부터 데이터를 보호하기 위해서
  • 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서

ch7-23 다형성(polymorphism)

@@6장~7장 다형성까지 여러번 복습하면서 이해 하고 뒷 진도로 가자

  • 여러 가지 형태를 가질 수 있는 능력
  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
  • 객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이?
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 참조변수의 형변환

  • (결론)사용할 수 있는 멤버의 갯수를 조절하는 것
  • 조상, 자손 관계의 참조변수는 서로 형변환 가능
class Car { }
class FireEngine extends Car { }
class Ambulance extends Car { }

FireEngine f = new FireEngine(); 

Car c = (Car)f; //OK. 조상인 Car타입으로 형변환(생략가능)
FireEngine f2 = (FireEngine)c; //OK. 자손인 FireEngine타입으로 형변환(생략불가)
Ambulance a = (Ambulance)f; //에러. 상속관계가 아닌 클래스 간의 형변환 불가
//생략중요X. 형변환 연산자를 항상 붙여도 됨.

좋은 웹페이지 즐겨찾기