1. 클래스의 재사용
-합성
: 기존 클래스를 새로운 클래스 정의에서 데이터 필드의 자료형으로 사용
: "has-a" 관계
ex) calss Line { Point begin, end; ... }
-상속
: 기존 클래스(부모)를 사용하여 새로운 클래스(자식)를 정의
: 코드의 중복 작성을 줄이고 프로그램의 확장성이 좋아짐
: 상속은 기존 클래스를 확장 or 특화하는 것
: 자식 "is-a" 부모의 관계
2. 클래스의 상속
-상속은 부모 클래스와 자식 클래스 간의 관계
: 자식 클래스가 부모 클래스의 필드와 메소드를 상속 받음
: 기존 클래스를 상속받을 때 키워드 extends를 사용함
ex) class Manager extends Employee {...}
// 자식 : Manager
// 상속 : extends
// 부모 : Employee
: 자식 클래스에서 상속받은 메소드를 재정의(오버라이딩)할 수 있음
-클래스의 상속은 단일 상속만 가능
: 인터페이스 상속의 경우는 다중 상속 가능
ex)
// 접근제어자 때문에 오류 발생
// 오류를 발생시키지 않으려면 sub.setPrivate(40);으로 출력해야 함.
3. 메소드 오버라이딩
: 부모로부터 상속받은 메소드의 몸체를 자식 클래스에서 재정의 하는 것
: 부모와 자식에서 같은 이름의 메소드가 다른 기능을 수행하게 됨
-오버라이딩 방법
: 메소드의 이름, 인자의 개수와 자료형, 반환형이 같은 메소드를 정의
: 단, 반환형은 서브 타입(상속 관계에서 자식 클래스)도 가능함
: 접근 제어자의 가시성(접근 범위)은 같거나 커져야 함
-> protected인 경우, protected 또는 public이 가능
-> public인 경우, public만 가능
ex)
// Shape 클래스를 상속받은 자식 클래스 Triangle
// Triangle 클래스는 Shape클래스의 getArea()메소드를 상속받아 사용할 수 있다.
// Triangle 클래스에서 Shape 클래스의 h * w를 h * w * 0.5로 재정의.
// Main클래스에서 Triangle()객체 생성
// Triangle()객체는 Shape클래스의 getArea()메소드와 Triangle 클래스의 getArea()메소드 둘 다 사용 할 수 있다.
// t가 가리키는 실제 유형이 Triangle 객체이기 때문에 Triangle의 getArea()를 사용한다.
// Shape 클래스. 즉, 부모유형의 변수는 자식 유형의 객체도 가질 수 있다.
4. this
: 메소드 호출 시, 숨은 인자로 this가 메소드에 전달됨
-> this는 현재 객체에 대한 참조값을 가지고 있음
-> c1.display()과 c2.display()의 결과가 다른 이유임
: 인스턴스 메소드나 생성자에서 필드를 참조하거나 메소드를 호출할 때 사용 가능(생략 가능함)
* this.필드이름
* this.메소드이름(인자)
ex)
5. super
: this와 같으나 자료형이 부모 클래스 유형임
: 자식 클래스의 인스턴스 메소드나 생성자에서 사용됨
-> this와 마찬가지로 static 메소드에서는 사용할 수 없음
: 부모 클래스에서 오버로딩 당한 메소드를 호출하거나 상속되었으나 감춰진 필드에 접근할 때 필요함
* super.필드이름
* super.메소드이름(인자)
ex)
// this와 super의 차이점
// super.f();의 값은 CSuper. this.f();의 값은 CSub.
6. this와 super의 사용 예
// sub 객체는 x가 2개가 존재한다.
// 부모 클래스에서 상속 받은 x = 100.0
// 자식 클래스의 x = 10.0
7. 상속과 생성자
- this()
: 같은 클래스의 다른 생성자를 호출하는 것
- super()
: 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출하는 것
->상속받은 데이터 필드를 초기화하기 위해 사용
->자식 클래스의 생성자 몸체에서 부모 클래스 생성자의 명시적 호출이 없다면, 인자가 없는 생성자인 super()가 자동 호출됨
: this()와 super()는 생성자 몸체의 맨 앞에 위치해야 함
ex)
// Main 클래스의 Cylinder(3, 10)으로 radius=3, h=10
9. 메소드 체이닝
: 하나의 명령문에서 동일 객체에 대해 연속적으로 메소드 호출을 하는 프로그래밍 기법
-> 메소드 체이닝에 사용되는 메소드는 현재 객체의 참조값(this)을 반환해야 함
: 메소드 체이닝은 프로그램의 가독성을 향상시키고, 코딩을 단순화 함
ex)
p.estName("홍길동").setAge(30).setAddress("서울");
ex2)
// getName() : name을 받아 옴.
// setName() : name값을 설정 or 변경 함.
// String name이 2개이기 때문에 this를 써서 첫 번째 name을 가져 온다.
// 만약, setName(String s)였다면 this.name=s;에서 this 생략 가능.
// 차이점
// setName에서 현재객체 return. 따라서 반환형은 People.
// p.setName("홍길동")에서 this를 return하기 때문에 결과적으로 p가 리턴 됨.
// 그런식으로 p.setAge(), p.setAddress()로 메소드 체이닝이 이루어짐
'방통대 > Java' 카테고리의 다른 글
5-1 추상 클래스와 인터페이스 (0) | 2024.03.22 |
---|---|
4강. Java - 클래스와 상속(2) (0) | 2024.03.15 |
4-1 클래스 정의와 사용 (0) | 2024.03.15 |
3강. Java - Java 기본 문법(2), 클래스와 상속(1) 연습 문제 (0) | 2024.03.08 |
3-5 객체의 사용 (0) | 2024.03.08 |