상속?
1. 상속
-기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것
-두 클래스를 조상과 자손으로 관계를 맺어주는 것
-자손은 조상의 모든 멤버를 상속받음 (생성자, 초기화블럭 제외)
-> 골라서 받을 수 없음
-각 클래스의 생성자에는 자신에 정의된 멤버변수만을 초기화하는 코드 + 조상의 생성자를 호출하는 코드를 넣음
-자손의 멤버 개수는 조상보다 무조건 같거나 많음
class 자손클래스 extends 조상클래스 {
// ...
}
2.
1)클래스간의 관계 - 상속관계
-공통부분은 조상에서 관리하고 개별부분은 자손에서 관리하는 것이 좋음
-조상의 변경은 자손에 영향을 미치지만 자손의 변경은 조상에 아무런 영향 안미침
2)클래스간의 관계 - 포함관계
-포함이란 한 클래스의 멤버변수로 다른 클래스를 선언하는 것
-작은 단위의 클래스를 먼저 만들고 이들을 조합해서 하나의 커다란 클래스를 만듦
class Circle {
Point c = new Point(); // 원점
int r; // 반지름
}
3. 클래스간의 관계 결정하기 - 상속 vs 포함
-관련된 클래스들은 최대한 관계를 많이 맺어줘야 재사용성을 높일 수 있음
상속관계: '~은 ~이다. (is-a)'
포함관계: '~은 ~을 가지고 있다. (has-a)'
-대부분의 경우는 포함관계임
4. 단일상속
-Java는 단일 상속만을 허용(C++은 다중상속 허용)
-상속계층도가 복잡해지고, 서로 다른 조상으로부터 같은 이름의 멤버를 상속받는 경우를 방지
-> 가장 비중이 높은 클래스만 상속관계로, 나머지는 포함관계로 정의한다
5. Object 클래스 - 모든 클래스의 최고조상
-조상이 없는 클래스는 자동적으로 Object 클래스를 상속받음
-상속계층도의 최상위에는 Object 클래스가 위치함
-모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받음
(toString(), equals(Object obj), hashCode(), ...)
오버라이딩?
1. 오버라이딩
: 조상클래스로부터 상속받은 메서드의 내용을 자손 클래스에 맞게 변경하는 것
2. 오버라이딩의 조건
(1) 선언부가 같아야 한다. (이름, 매개변수, 리턴타입)
(2) 접근제어자를 좁은 범위로 변경할 수 없다.
(조상의 메서드가 protected라면 범위가 넓거나 같은 protected, public으로만 변경할 수 있다)
(3) 조상클래스의 메서드에 선언되지 않은 예외를 선언할 없다.
3. 오버로딩 vs 오버라이딩
오버로딩 - 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩 - 상속받은 메서드의 내용을 변경하는 것(change, modify)
4. super - 참조변수
▶ this - 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있음
▶ super - this와 같음. 조상을 가리키며 조상의 멤버와 자신의 멤버를 구별하는 데 사용
5. super() - 조상의 생성자
-자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성됨
-조상의 멤버들도 초기화되어야 하기 때문에 자손 생성자의 첫 문장에서 조상 생성자를 호출해야 함
※Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자(같은 클래스의 다른 생성자 또는 조상의 생성자)를 호출해야 한다.
if not, 컴파일러가 자동적으로 'super();'를 생성자 첫 줄에 삽입한다.
그러니까 this() 아니면 super()를 명시적으로 삽입해주어야 에러를 예방할 수 있음
Package & Import?
1. 패키지
-서로 관련된 클래스와 인터페이스의 묶음
-클래스가 물리적으로 클래스파일(*.class)인 것처럼 패키지는 물리적으로 폴더임
-패키지는 서브패키지를 가질 수 있으며 '.'으로 구분함
-클래스의 실제 이름(full name)은 패키지명이 포함된 것
(e.g. String 클래스의 full name: java.lang.String)
2. 패키지의 선언
-패키지는 소스파일에 첫번째 문장으로 단 한번 선언
-하나의 소스파일에 둘 이상의 클래스가 포함된 경우 모두 같은 패키지에 속하게 됨
-모든 클래스는 하나의 패키지에 속하며 패키지가 선언되지 않은 클래스는 자동적으로 unnamed 패키지에 속함
3. import문
-사용할 클래스가 속한 패키지를 불러오는데 사용
-import문을 사용하면 클래스를 사용할 때 패키지명을 생략 가능
-java.lang 패키지의 클래스는 import하지 않고도 사용할 수 있음
(e.g. String, Object, System, Thread, ...)
import.패키지명.클래스명;
또는
import.패키지명.*;
import문은 컴파일 시에 처리되므로 별표를 사용한다고 해도 프로그램의 성능에 아무 영향을 미치지 않음
출처: 남궁성의 자바의정석 강의자료
'Web Development > Java' 카테고리의 다른 글
[Java] 객체지향개념5 (0) | 2024.01.17 |
---|---|
[Java] 캡슐화, TDA 원칙 (2) | 2024.01.13 |
[Java] 객체지향개념3 (1) | 2024.01.09 |
[Java] 객체지향개념2 (1) | 2024.01.09 |
[Java] 객체지향개념1 (1) | 2024.01.09 |