2022.03.19
자바가 확장한 객체 지향
abstract 키워드 - 추상 메서드와 추상 클래스
- 추상 메서드
- 선언부는 있는데 구현부가 없는 메서드
- 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스로 선언해야한다.
- 추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. new를 사용할 수 없다.
- 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다. 오버라이딩 강제
- 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.
package ex04.abstractMethod01;
public class 쥐 extends 동물{
@Override
void 울어보세요() {
System.out.println("찍찍");
}
}
package ex04.abstractMethod01;
public class 고양이 extends 동물{
@Override
void 울어보세요() {
System.out.println("야옹");
}
}
package ex04.abstractMethod01;
public class 병아리 extends 동물 {
@Override
void 울어보세요() {
System.out.println("삐약");
}
}
package ex04.abstractMethod01;
public abstract class 동물 {
abstract void 울어보세요();
}
package ex04.abstractMethod01;
public class Driver {
public static void main(String[] args) {
동물[] 동물들 = new 동물[5];
동물들[0] = new 쥐();
동물들[1] = new 고양이();
동물들[2] = new 병아리();
for(int i=0;i<동물들.length;i++) {
동물들[i].울어보세요();
}
}
}
생성자
- 클래스의 인스턴스, 즉 객체를 만들 때마다 new 키워드를 사용
- 클래스명( ) 도 메서드지만, 반환값이 없고 클래스명과 같은 이름을 가진 메서드를 객체를 생성하는 메서드, 즉 객체 생성자 메서드
- 개발자가 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다.
- 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지않는다.
package ex04.constructor;
public class Driver01 {
public static void main(String[] args) {
동물 뽀로로 = new 동물("뽀로로");
}
}
클래스 생성 시의 실행 블록,static 블록
- 클래스는 생성자는 존재하지 않지만, 클래스가 스태틱 영역에 배치될 때 실행되는 코드블록은 있다 => static 블록
- 해당 클래스를 사용하는 코드가 없으면 해당 클래스의 static블록을 실행하지 않는다.
- 해당 패키지 또는 클래스가 처음으로 사용될 때 T메모리의 스태틱 영역에 로딩
- 클래스의 정적 속성을 사용할 때
- 클래스의 정적 메서드를 사용할 때
- 클래스의 인스턴스를 최초로 만들 때
- static블록은 한 번만 실행
package ex04.staticBlock;
public class 동물 {
static {
System.out.println("동물 클래스 레디 온!!");
}
}
package ex04.staticBlock;
public class Driver {
public static void main(String[] args) {
System.out.println("main시작");
동물 뽀로로 = new 동물();
동물 사슴 = new 동물();
}
}
final 키워드
final과 클래스
public final class 고양이 {}
final과 변수
- 변경 불가능한 상수
- 정적상수
선언 시,또는 정적 생성자에 해당하는 static 블록 내부에서 초기화
- 객체 상수
선언 시,또는 객체 생성자 또는 인스턴스 블록에서 초기화
- 지역 상수
선언 시,또는 최초 한 번만 초기화
package ex04.finalVariable;
public class 고양이 {
final static int 정적상수1 = 1;
final static int 정적상수2;
final int 객체상수1 = 1;
final int 객체상수2;
static {
정적상수2 = 2;
}
public 고양이() {
객체상수2 = 2;
final int 지역상수1 = 1;
final int 지역상수2;
지역상수2 =2 ;
}
}
final과 메서드
package ex04.finalMethod;
public class 동물 {
final void 숨쉬다() {
System.out.println("호흡 중");
}
}
class 포우류 extends 동물 {
}