상속
기존의 클래스로 새로운 클래스를 작성하는 것.(코드의 재사용)
두 클래스를 부모와 자식으로 관계를 맺어주는 것.
자손은 조상의 모든 맴버를 상속받는다.(생성자, 초기화블럭 제외)
자손의 맴버 개수는 조상보다 적을 수 없다.
자손의 변경은 조상에 영향을 미치지 않는다.
class 자식클래스 extends 부모클래스
(부모를 확장해서 자식을 만들겠다)
ex)class Parent{}
class Child extends Parent{
}
포함
클래스의 맴버로 참조변수를 선언하는 것
상속관계 ~은 ~이다.
포함관계 ~은 ~을 가지고 있다.
단일 상속
Java는 단일 상속만을 허용한다.(c++은 다중상속 허용)
class TvDVD extends TV, DVD {} // 에러
이름이 같고 내용이 다르면 충돌위험이 높고 해결하기 어렵다.
그 이후 언어는 자바처럼 단일 상속으로 가고 있다.
비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
Object클래스
부모가 없는 클래스는 자동적으로 Objecrt클래스를 상속받게 된다.
모든 클래스는 Object클래스에 정의된 11개의 매서드를 상속받는다
toString(), equals(Objectobj), hashCode(), ...
class tv{} > class tv extends Object{}
toString 클래스이름 + 주소값을 찍어준다
객체를 하나 더 만들면 주소값이 다르게 나온다.
오버라이딩
상속받은 조상의 메서드를 자신에 맞게 변경하는 것
내용만 변경가능
System.out.println(p); = System.out.println(p.toString);
오버라이딩의 조건
1.선언부가 조상 클래스의 매서드와 일치해야 한다.,
2.접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
3.예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
오버로딩 vs 오버라이딩
오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것
참조변수 super
객체 자신을 가르키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
조상의 맴버를 자신의 맴버와 구별할 때 사용
super()-조상의 생성자
조상의 생성자를 호출할 때 사용
조상의 맴버는 조상의 생성자를 호출해서 초기화
그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입
패키지
서로 관련된 클래스의 묶음 java8 에서 4000개의 클래스가 있다. 그것을 나누기 위한 패키지
클래스는 클래스파일, 패키지는 폴더, 하위 패키지는 하위 폴더
클래스의 실제 이름은 패키지를 포함(java.lang.string)
rt.jar는 클래스들을 압축한 파일(JDK설치경로 \jre\lib에 위치하는데 너무 커서 java9부터 없어졌다.)
패키지 선언
패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
클래스 패스
클래스 파일의 위치를 알려주는 경로
환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용
classpath에 패키지의 루트를 등록해줘야 함.
import문
클래스를 사용할 때 패키지 이름을 생략할 수 있다.
컴파일러에게 클래스가 속한 패키지를 알려준다.
java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.
String, Object, System, Thread
import 선언
import문을 선언하는 방법은 다음과 같다.
import 패키지명.클래스명;
import 패키지명 *; 모든 클래스
import문은 패키지문과 클래스 선언의 사이에 선언한다.
import java.util.*;
import java.text.*;을 > import java.*;로 변경은 불가
이름이 같은 클래스가 속한 두 패키지를 import할 떄 는 클래스 앞에 패키지 명을 붙여줘야한다.
static import문
static 맴버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
제어자
클래스와 클래스의 맴버(맴버 변수, 메서드)에 부가적인 의미 부여
접근 제어자 public, protected, (default), private
그 외 static, final abstract, native, transient, synchronized, volatile, strictfp
하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만)
static- 클래스의 공통적인
맴버변수(클래스 변수), 메서드(인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다)에 사용가능
final - 마지막의, 변경될 수 없는
클래스(조상이 될 수 없다), 메서드(오버라이딩 할 수 없는 메서드), 멤버변수(상수), 지역변수(상수)
abstract - 추상의, 미완성의
클래스(추상 클래스), 매서드(추상 매서드)
추상클래스의 인스턴스 생성불가
사용하기 위해서는 추상클래스를 상속받아서 완전한 클래스를 만든 후에 객체 생성가능
public - 접근 제한이 전혀 없다.
protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다
(default) - 같은 패키지 내에서만 접근이 가능하다.
private - 같은 클래스 내에서만 접근이 가능하다
캡슐화와 접근 제어자
접근 제어자를 사용하는 이유
-외부로부터 데이터를 보호하기 위해서
-외부에는 불필요한, 내부족으로만 사용되는, 부분을 감추기 위해서
다형성
여러가지 형태를 가질 수 있는 능력
조사 타입 참조 변수로 자손 타입 객체를 다루는 것
Tv t = new SmartTv() //타입 불일치
SmartTv객체로 보면 맴버갯수가 Tv보다 많다.
Tv객체로 사용하면 맴버가 SmartTv보다 작다.
-자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.
SmartTV s = new TV(); 불가능하다.
리모콘 버튼보다 기능이 적으면 없는 것을 호출해서 에러가 나게된다.
참조변수의 형변한
사용할 수 있는 맴버의 갯수를 조절하는 것
조상 자손 관계의 참조변수는 서로 형변환 가능
형변환 할 때 중요한 점 : 실제 인스턴스가 무엇인지가 중요하다, 즉 실제 인스턴스의 멤버 갯수를 넘어서는 안된다
instance of 연산자: 참조변수의 형변환 가능여부 확인에 사용. 가능하면 true 반환
if (c instanceof FireEngine)
'코딩 > 자바' 카테고리의 다른 글
| 콜렉션과 제네릭 (0) | 2022.11.05 |
|---|---|
| 자바의 정석 ch7-2 (0) | 2022.10.27 |
| 자바의 정석 ch6-2 (0) | 2022.10.12 |
| 자바의 정석 ch6-1 (0) | 2022.10.12 |
| 자바의 정석 ch5 (0) | 2022.10.12 |