출처 : 자바의 정석
http://www.yes24.com/Product/Goods/24259565
https://cafe.naver.com/javachobostudy/20665
아래의 내용은 '자바의 정석'이라는 책의 내용을 간략하게 정리한 글입니다.
상속(inheritance)
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 좋음
키워드 : extends (확장한다)
class Child extends Parent {
...
}
상속 받는 클래스 : 자손 클래스
상속해주는 클래스 : 부모 클래스
조상 클래스를 확장(extends)한다는 의미
클래스의 맴버변수로 다른 클래스 타입의 참조변수를 선언하는 것(포함관계 Composite)
class test{
test1 t = new test1();
int a = 0;
}
클래스를 가지고 문장을 만들때
상속관계 : ~은 ~이다
포함관계 : ~은 ~을 가지고 있다
단일 상속
자바는 오직 단일 상속만 허용한다.
서로 다른 클래스로부터 상속받은 맴버간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점이 존재하기 때문.
클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 만들어 준다는 점에서 다중상속보다 유리하다.
다중상속과 비슷한 기능을 원할 땐 포함관계를 사용해볼 수 있다.
오버라이딩(overriding)
조상 클래스로부터 상속받은 매서드의 내용을 변경하는 것
오버로딩 : 새로운 메서드 추가
오버라이딩 : 상속받은 메서드 수정
super
자손 클래스에서 부모 클래스의 맴버를 참조할 때 사용
super = 부모 클래스
this = 자신 클래스
super와 this는 static메서드에는 사용할 수 없고 인스턴스 메서드에서만 사용 가능
Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 this(), super()을 호출해야한다.
없으면 컴파일러가 만들어준다.
제어자
접근제어자 : public > protected > default > private
나머지 : static, final, abstract, native, transient, synchronized, volatile, strictfp
public : 접근 제한 없음
protected : 같은 패키지 내, 다른 패키지의 자손클래스까지
default : 같은 패키지 내
private : 같은 클래스 내
인스턴스 변수일 경우 final 맴버변수를 생성자를 이용하여 초기화할 수 있다.
클래스에는 public, default만 메서드, 맴버변수에는 public, protected, default, priavate를 붙일 수 있다.
'미완성'이라는 의미를 가지고 있으며, 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용
추상 메서드는 미완성 메서드를 가지고 있으므로 인스턴스를 생성할 수 없다.
다형성(polymorphism)
객체지향적 개념 : 여러 가지 형태를 가질 수 있는 능력
자바 개념 : 참조변수로 여러 타입의 객체를 참조할 수 있도록 한다.
ex) 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조
Tv tv = new LGTv(); //가능
LGTv tv = new Tv(); //불가능
같은 타입의 인스턴스일지라도 참조변수의 타입에 따라 맴버의 개수가 달라진다.
참조변수가 사용할 수 있는 맴버 개수 <= 인스턴스 맴버 개수
서로 상속관계에 있는 클래스 사이에서만 형변환 가능
up-casting : 자손 -> 조상 //형변환 생략가능
down-casting : 조상 -> 자손 //형변환 생략불가
참조변수 형변환은 참조변수의 타입만 변화시키 것이기 때문에 인스턴스에 영향을 주지 않는다.
형변환을 통해 참조변수의 맴버를 조절하는 것이다.
참조변수가 참조하고 있는 인스턴스 타입을 알 수 있고 연산의 결과로 boolean 값을 리턴한다.
또한 instanceof의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 의미한다.
조상과 자손이 중복된 맴버변수를 사용할 때 참조변수 타입 클래의 맴버변수가 사용된다.
배열의 크기를 알아서 관리해주는 클래스
Vector itme = new Vector();
item.add(Object o);
item.remove(Object o);
item.isEmpty();
item.get(int index);
item.size();
추상클래스(abstract class)
클래스 : 설계도 / 추상클래스 : 미완성 설계도
미완성 메서도를 포함하고 있는 클래스
추상클래스는 인스턴스를 생성할 수 없고 추상클래스를 상속 받은 자손클래스만 인스턴스를 생성할 수 있다.
아무런 내용 없이 {}만 있어도 일반메서드로 간주된다.
인터페이스(interface)
일종의 추상클래스
추상화 정도가 높아 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 맴버변수를 구성원으로 가질 수 없다.
다른 클래스를 작성하는데 도움을 줄 목적으로 작성.
class 대신 interface를 사용
interface interfaceName {
public static final int a = 0;
public abstract test(int a);
}
인터페이스는 인터페이스로만 상속 받을 수 있다.
클래스와 달리 다중 상속이 가능하다.
키워드 implements (구현한다)
메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야한다는 의미
매서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 의미
인터페이스에 추상메서드만 선언할 수 있었는데 JDK 1.8부터 default 메서드와 static 메서드도 추가할 수 있다.
static 메서드는 기존에도 인터페이스에 못 넣을 이유가 없었고 default 메서드는 필요에 의해 생기게 되었다.
인터페이스의 메서드를 수정하게 될 경우 인터페이스 구현부 부분을 전부 수정해야하는 작업이 필요했다. 하지만 인터페이스 메서드를 default 메서드로 만들면 인터페이스 구현부를 전부 수정해야하는 작업이 필요 없게 된다.
default 메서드는 일반 메서드처럼 몸통이 있어야한다.
interface testInterface{
void method();
default void method(){};
}
내부 클래스(inner class)
내부 클래스는 클래스 내에 선언된다는 점을 제외하고는 일반적인 클래스와 다르지 않다.
내부 클래스는 외부 클래스에서만 주로 사용되고 다른 클래스에서 잘 사용되지 않는 것이여야 한다.
익명 클래스(anonymous class)
단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스.
이름이 없기에 생성자도 가질 수 없다.
단 하나의 클래스를 상속 받거나 단 하나의 인터페이스만 구현할 수 있다.
class InnerClass{
Object o1 = new Object(){ void method(){} };
static Object o2 = new Object(){ void method(){} };
}