자바가 확장한 객체 지향
abstract 키워드 - 추상 메서드와 추상 클래스
- 추상 메서드 (abstract method): 선언부는 있는데 구현부가 없는 메서드
- 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스 (abstract class)로 선언해야 함
package abstractMethod01;
public class Driver {
public static void main(String[] args) {
동물[] 동물들 = new 동물[5];
동물들[0] = new 쥐();
동물들[1] = new 고양이();
동물들[2] = new 강아지();
동물들[3] = new 송아지();
동물들[4] = new 병아리();
for (int i = 0; i < 동물들.length; i++) {
동물들[i].울어보세요();
}
}
}
package abstractMethod01;
public class 쥐 extends 동물 {
void 울어보세요() {
System.out.println("나는 쥐! 찍! 찍!");
}
}
package abstractMethod01;
public class 동물 {
void 울어보세요() {
System.out.println("나는 동물! 어떻게 울어야 하나요?");
}
}
동물
타입의 참조 변수를 통해 하위 클래스의 인스턴스가 가진 울어보세요()
를 호출하고 있으므로 상위 클래스인 동물
의 울어보세요()
메서드는 반드시 존재해야 함- 이런 경우 추상 메서드를 사용하여 메서드 선언은 있으나 몸체가 없는 형태로 메서드를 구현
package abstractMethod02;
public abstract class 동물 {
abstract void 울어보세요();
}
- 추상 클래스는 인스턴스, 즉 객체를 만들수 없는 클래스
- 추상 클래스를 상속한 하위 클래스가 추상 메서드를 오버라이딩하지 않으면 컴파일 에러 발생
생성자
- 생성자: 반환값이 없고 클래스와 같은 이름을 가진 메서드, 객체 생성자 메서
- 아무런 생성자도 만들지 않으면 자바 컴파일러가 기본 생성자를 자동으로 생성
- 인자가 있는 생성자를 하나라도 만든다면 기본 생성자를 만들지 않음
클래스 생성 시의 실행 블록, static 블록
- Java에서 클래스 생성자는 별도로 존재하지 않으나
static
블록은 클래스가 스태틱 영역에 배치될 때 실행됨
package staticBlock;
public class 동물 {
static {
System.out.println("동물 클래스 레디 온!");
}
}
package staticBlock;
public class Driver01 {
public static void main(String[] args) {
동물 뽀로로 = new 동물(); // "동물 클래스 레디 온!"
}
}
package staticBlock;
public class Driver02 {
public static void main(String[] args) {
System.out.println("main 메서드 시작!") // "main 메서드 시작!"
}
}
동물
클래스를 사용하는 코드가 없으면 해당 클래스의 static
블록은 실행되지 않음static
블록에서 사용할 수 있는 속성과 메서드는 static
멤버로 제한됨- 객체 멤버는 클래스가 static 영역에 자리 잡은 후에 객체 생성자를 통해 힙 영역에 생성됨
- 클래스의
static
블록이 실행되는 시점- 클래스의 정적 속성을 사용
- 클래스의 정적 메서드를 사용
- 클래스의 인스턴스를 최초로 생성
final 키워드
final과 클래스
- 클래스에
final
키워드가 붙을 경우 상속을 허락하지 않음 → 하위 클래스를 만들 수 없음 final과 변수
- 변수에
final
키워드가 붙을 경우 변경 불가능한 상수로 취급됨 - Java에서는 혼동을 피하기 위해
const
를 키워드로 등록하고 사용하지 못하게 함 final과 메서드
- 메서드에
final
키워드가 붙을 경우 오버라이딩을 할 수 없음
instanceof 연산자
- 객체가 특정 클래스의 인스턴스인지 확인
- 객체 참조 변수의 타입이 아닌 실제 객체의 타입 확인
package 키워드
- 같은 이름의 클래스를 구분할 수 있는 네임스페이스를 제공하는 역할
interface 키워드와 implements 키워드
- 인터페이스는 추상 메서드와 정적 상수만 가질 수 있으므로
public
, abstract
, static
, final
등의 키워드를 붙이지 않아도 Java가 알아서 붙여줌 - Java 8부터는 디폴트 메서드와 정적 추상 메서드를 지원
this 키워드
- 객체가 자기 자신을 지정할 때 쓰는 키워드
- 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역 변수가 우선
- 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면
this
를 접두사로 사용 - 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려명 클래스명을 접두사로 사용
super 키워드
- 바로 위 상위 클래스의 인스턴스를 지칭하는 키워드
super.super
형태로 상위 클래스의 상위 클래스의 인스턴스에 접근하는 것은 불가능