* 상속의 정의와 장점
- 기존의 클래스를 재사용해서(상속받아) 새로운 클래스를 작성하는 것
- 두 클래스를 조상과 자손으로 관계를 맺어주는 것 (extends 키워드 사용)
- 자손은 조상의 모든 맴버를 상속받는다. (단. 생성자, 초기화 블럭은 제외)
- 자손의 맴버개수는 조상보다 적을 수 없다(같거나 많다)
- 공통부분의 조상에서 관리하고 개별부분은 자손에서 관리한다.
- 조상의 변경은 자손에 영향을 미침, 자손의 변경은 조상에 아무런 영향을 미치 않는다.- 자바는 단일상속만 허용한다.(C++ 은 다중상속 허용)
class Point {
int x ;
int y ;
}
class Point3D extends Point { // Point 클래스를 상속 받아 x, y를 모두 사용 할 수 있고
int z ; // z멤버 변수를 추가로 선언
}
▶ 포함(composite) 이란?
- 한 클래스의 맵버변수로 다른 클래스를 선언하는 것
- 작은 단위의 클래스를 먼저 만들고 이 들을 조합해서 하나의 커다란 클래스를 만든다.
class Point {
int x ;
int y ;
}
class Circle {
int x ; //원점의 x좌표 class Circle {
int y ; // 원점의 y좌표 ----> point c = new Point(); // 원점
int r ; // 반지름(radius) int r ; // 반지름(radius)
} }
상속관계 : '~은 ~이다.(is-a)'
포함관계 : '~은 ~을 가지고 있다 (has-a)
* Object 클래스 - 모든 클래스의 최고조상
- 조상이 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
- 상속계층도의 최상위에는 Object클래스가 위치한다.
- 모든 클래스는 Object클래스에 정의된 11개의 매서드를 상속받는다.
* 오버라이딩(overrriding)이란?
- 조상클래스로 상속받은 메서드의 내용을 상속받은 클래스에 맞게 변경하는 것
- override - '~위에 덮어쓰다(overwrite).' '~에 우선하다'int x ;
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 ;
}
}
-> 오버라이딩의 조건
1. 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)
2. 접근제어자를 좁은 범위로 변경할 수 없다.
- 조상 메서드가 protected라면 범위가 같은 protected 나 public으로만 변경 가능
3. 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
4. static메서드를 인스턴스 매서드로, 또는 그반대로 오버라이딩 할 수 없다.
-> 오버로딩 VS. 오버라이딩(비교)
* 오버라이딩(overriding) - 상속받은 메서드의 내용을 변경하는 것 (change,modifiy)
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() { } // 오버라이딩
void parentMethod(int i) { } // 오버로딩
void childMethod() { }
void childMethod(int i) { } // 오버로딩
void childMethod() { } // 에러!!! 중복정의 임
-> 참조변수 (super)
▶ this - 인스턴스 자신을 가르키는 참조변수, 인스턴스 주소가 저장되어 있음 모든 인스턴스 메서드에 지역변수로
숨겨진 채로 존제
▶ super - this와 같은 역활 조상의 멤버와 자신의 맴버 구별하는 데 사용.
▶ super() - 조상의 생성자
- 자손클래스의 인스턴스를 생성하면, 자손의 맴버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성
- 조상들의 멤버들도 초기화 되야야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야한다.
그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫 줄에 삽입한다.
* 패키지(package)
- 서로 관련된 클래스와 인터페이스의 묶음
- 클래스가 물리적으로 클래스파일(*.class)인 것처럼 패키는 물리적으로 폴더다.
- 클래스의 실제이름은 패키지명이 포함된 것이다.
- rt.jar는 JAVA API의 기본 클래스들을 압축한 파일
->패키지의 선언
- 패키지는 소스파일에 첫 번째 문장으로 단 한번만 선언한다.
- 하나의 소스파일에 둘 이상의 클래스 포함 된경우 모두 같은 패키지에 속한다.
* import문
- import문은 패지지문과 클래스 선언 사이에 선언한다.
- import문을 사용하면 클래스를 사용할 때 패키지명을 생략가능하다.
- import문의 선언
import 패키지명.클래스명 ;
또는
import 패키지명.*; // 이렇게 선언하여도 프로그램 성능에 아무런 영향을 미치지 않는다.
// import문은 컴파일 시에 처리가 됨
- 이름이 같은 클래스가 속한 두 패키를 import 할 때는 클래스명 앞에 패키지명을 붙여야함
'JAVA' 카테고리의 다른 글
자바의 객체지향개념 2-3 (0) | 2015.10.18 |
---|---|
자바의 객체지향개념 2-2 (0) | 2015.10.05 |
자바의 객체지향개념 1-3 (0) | 2015.10.05 |
자바의 객체지향개념 1-2 (0) | 2015.10.05 |
자바의 객체지향개념 1-1 (0) | 2015.10.05 |