# 04. 자바가 확장한 객체지향
# abstract
public abstract class 동물 {
abstract void 울어보세요();
}
1
2
3
2
3
- 추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. 즉, new를 사용할 수 없다.
- 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다. 오버라이딩 강제.
- 추상 메서드를 포함하는 클래스는 반드시 추상클래스여야 한다.
# 생성자(=객체 생성자 메서드)
- 클래스의 인스턴스, 즉 객체를 만들 때 마다 new 키워드를 사용한다.
- 개발자가 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어 준다
- 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지 않는다.
- 생성자는 개발자가 필요한 만큼 오버로딩해서 만들 수 있다.
# 클래스 생성시의 실행 블록, static 블록
- 클래스가 스태틱 영역에 배치될 때 실행되는 static 블록
public class 동물{
static {
System.out.println("동물 클래스 레디 온!");
}
}
public class Driver02{
public static void main(String[] args) {
System.out.println("main메서드 시작");
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 동물 클래스를 사용하는 코드가 없기에 동물 클래스의 static 블록을 실행햐지 않는다.
- 심지어 main()메서드 실행하면 동물 클래스는 T 메모리 스태틱 영역에 자리 잡지도 않음.
- 클래스 정보는 해당 클래스가 코드에서 맨 처음에 사용될때 T메모리의 스태틱 영역에 로딩되며, 이때 단 한번 해당 클래스의 static 블록이 실행된다.
- 클래스가 제일 처음 사용될 때
- 클래스의 정적 속성을 사용할 때
- 클래스의 정적 메서드를 사용할 때
- 클래스의 인스턴스를 최초로 만들 때
- 스태틱 영역도 메모리 이기 때문에 프로그램이 실행될때 바로 로딩하지 않고 해당 클래스가 처음 사용될 때 로딩. 메모리는 최대한 늦게 사용을 시작하고 최대한 빨리 반환하는것이 정석.
인스턴스 블록 {}
인스턴스가 생성될 때 마다 {} 블록이 실행된다. {} 블록은 객체 생성자가 실행되기 전에 먼저 실행됨.
# final 키워드
- final 키워드가 나타날 수 있는 곳 : 객체 지향 언어의 구성요소인 클래스, 변수, 메서드
- 클래스에 final 이 붙어 있다면? -> 상속을 허락하지 않겠다. = 하위 클래스를 만들 수 없다.
- 변수에 fianl 이 붙어 있다면? -> 변경 불가능한 상수. 최초 한번 초기화 가능
- 메서드가 final 이라면? -> 오버라이딩 금지.
# instanceof 연산자
- instanceof : 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자
- 인터페이스 구현 관계 에서도 사용 가능
- 객체_참조_변수 instanceof 클래스명
# package 키워드
- package : 네임스페이스(이름공간)을 만들어주는 역할.
- 똑같은 이름을 쓰지만 패키지가 다르면 충돌이 발생하지 않음.
# interface 키워드와 implements 키워드
- interface는 public 추상 메서드와 public 정적 상수만 가질 수 있다
- 메서드에 public 과 abstract, 속성에 public, static, final 붙이지 않아도 자동으로 자바가 알아서 붙여준다
interface Speakable {
double PI = 3.14159;
final double absoluteZeroPoint = -275.15;
void sayYes();
}
// 둘은 동일한 코드다. 하지만 명확하게 키워드를 적는 코드가 더 좋음.
interface Speakable {
public static final double PI = 3.14159;
public static final double absoluteZeroPoint = -275.15;
public abstract void sayYes();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- 자바 8 이전 까지의 인터페이스 : 정적 상수와 객체 추상 메서드만 가질 수 있음
- 자바 8 부터 : 람다의 등장으로 디폴트 메서드라고 하는 객체 구상 메서드와 정적 추상 메서드를 지원.
# this키워드
- this : 자기 자신 지칭
- 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역 변수가 우선한다.
- 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면 this를 접두사로 사용한다.
- 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명을 접두사로 사용한다.
# super키워드
- 단일 상속만을 지원하는 자바에서 super는 바로 위 상위 클래스의 인스턴스를 지칭
- super.super 형태로 상위의 상위 클래스의 인스턴스에는 접근이 불가능