자바의정석 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 클래스 간의 관계 결정하기
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 오버라이딩의 조건
- 선언부가 조상 클래스의 메서드와 일치해야 한다.
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
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. 형변환 연산자를 항상 붙여도 됨.
Author And Source
이 문제에 관하여(자바의정석 7장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tone8943/자바의정석-7장저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)