상속
: 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
: 코드의 재사용성을 높이고 코드의 중복 제거하여 생산성, 유지보수에 크게 기여함
: 단일 상속만 가능하다.
class Parent {
int age;
}
class Child extends Parant {
void play()
{
//내용
}
}
조상 클래스 : 상속해주는 클래스 , 부모클래스, 상위클래스 , 기반클래스
자손 클래스 : 상속 받는 클래스 , 자손 클래스, 하위 클래스, 파생된 클래스
만일 Parent클래스에 age라는 정수형 변수를 멤버 변수로 추가하면, 자손 클래스는 조상의 멤벌르 모두 상속 받기 때문에, Child 클래스는 자동적으로 age라는 멤버 변수가 추가된다.
- 자손 클래스의 멤버변수 개수는 조상 클래스 보다 항상 같거나 많다.
- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
클래스간의 관계 - 포함관계
class Circle {
Point c = new Point(); // 원점
int r;
}
class Point {
int x;
int y;
}
is는 상속
has는 포함관계로 설정한다.
Object 클래스
:Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상 클래스다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속 받게 한다.
class Tv {
...
}
//를 컴파일하면 자동적으로
class Tv extends Object {
...
}
오버라이딩
:조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것 (change, modify)
조건
- 이름이 같아야 한다.
- 매개 변수가 같아야 한다.
- 반환 타입이 같아야 한다.
즉, 선언부가 서로 일치해야 한다.
조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때
1. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
2. 예외는 조상 클래스의 메서드 보다 많이 선언할 수 없다.
3. 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
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;
}
}
오버라이딩 vs 오버로딩
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} // 오버라이딩
void parentMethod(int i) {} // 오버로딩
void childMethod() {}
void childMethod (int i) {} // 오버로딩
}
super
: 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수.
: 상속받은 멤버와 자신의 멤버와 이름이 같을 때는 super를 붙여서 구별할 수 있다.
class SuperTest{
public static void main(String args[]){
Child c = new Child();
c.method();
}
}
class Parent {
int x = 10;
}
class Child extends Parent {
int x = 20;
void method() {
System.out.println("x=" + x);
// x = 20
System.out.println("this.x=" + this.x);
// this.x = 20
System.out.println("super.x=" + super.x);
// super.x = 10
}
}
변수 뿐 아니라 메서드도 super을 써서 호출할 수 있다.
class Point {
int x;
int y;
String getLocation(){
return "x :" + x + ", y :" + y ;
}
}
class Point3D extends Point {
int z;
String getLocation(){ //오버라이딩
return super.getLocation() + ", z : " + z;
}
}
super() - 조상 클래스의 생성자
Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자 this() 또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 super()를 생성자의 첫 줄에 삽입한다.
왜냐하면 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 한다.
class PointTest{
public static void main(String args[]){
Point3D p3 = new Point3D(1,2,3);
}
}
class Point {
int x, y;
Point(int x, int y){
this.x = x;
this.y = y;
}
String getLocation() {
return "x :" + x + ", y :" + y;
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z){
this(100,100,100);
}
Point3D(int x, int y, int z){
super(x,y);
this.z = z;
}
String getLocation() {
return super.getLocation() + ", z: " + z ;
}
}
Package
: 하나의 디렉토리
: 클래스의 묶음
: 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다. 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로 자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.
import
다른 패키지의 클래스를 사용할 때 "import 패키지명.클래스명;" 을 사용
static import
static멤버를 호출할 때 클래스 이름을 생략할 수 있다.
제어자
static - 클래스의 , 공통적인
멤버변수
: 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.
: 클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.
:클래스가 메모리에 로드될 때 생성된다.
메서드
:인스턴스를 생성하지 않고도 호출이 가능한 static메서드가 된다.
:static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
final - 마지막의, 변경될 수 없는
클래스 : 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 다른 클래스의 조상 불가
메서드 : 오버라이딩을 통해 재정의 불가
멤버, 지역 변수 : 값을 변경할 수 없는 상수가 된다.
abstract - 추상의, 미완성의
클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미
메서드 : 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
접근제어자
private - 같은 클래스 내에서만 접근 가능
default - 같은 패키지 내에서만 접근이 가능하다.
protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
public - 접근 제한이 전혀 없다.
다형성
https://life-with-coding.tistory.com/485
책 내용이 이해가 잘 안가서 이분 블로그를 참고했다.
다형성이란 여러가지 형태를 가질 수 있는 능력을 의미하며 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 한다. 즉, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.
이 말을 더 쉽게 풀어 쓰면, 상위 클래스가 동일한 메세지로 하위 클래스들을 서로 다르게 동작시키는 원리를 말한다.
다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알 수 없어도 오버라이딩을 통해 접근 가능한데, 바로 동적 바인딩 때문에 가능하다.
동적 바인딩
:메서드가 실행 시점에서 성격이 결정되는 바인딩
다형성 필수 조건
1. 상속관계
2. 오버라이딩
3. 업캐스팅(형변환)
:자식 클래스의 객체가 부모클래스 타입으로 형변환 되는 것
구현 방법
1. 부모 자식 클래스 구현
2. 메소드 오버라이딩
3. 형변환 하여 객체 선언
4. 부모 클래스 객체로 자식 메소드 호출
내일은 추상 클래스 부터 다시~~ 하면서 자바의 정석1을 끝낼거다!
오늘 못적은 내용들도 적고~~ 복습 하면서 빠진부분이나 추가되는 부분도 적어야지
'Study > JAVA' 카테고리의 다른 글
[Spring] 게시판 만들기 1 (5) | 2022.12.03 |
---|---|
[2022-11-30] Java의 정석 2 - 11. 컬렉션 프레임웍 (0) | 2022.11.30 |
[2022-11-29] Java의 정석 - 1편 마지막~ (0) | 2022.11.29 |
[2022-11-28] JAVA의 정석 - 객체지향 I (1) | 2022.11.28 |
[2022-11-25] Java의 정석 (0) | 2022.11.25 |