# 04. 자바가 확장한 객체지향

# abstract

public abstract class 동물 {
	abstract void 울어보세요();
}
1
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
  • 동물 클래스를 사용하는 코드가 없기에 동물 클래스의 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
  • 자바 8 이전 까지의 인터페이스 : 정적 상수와 객체 추상 메서드만 가질 수 있음
  • 자바 8 부터 : 람다의 등장으로 디폴트 메서드라고 하는 객체 구상 메서드와 정적 추상 메서드를 지원.

# this키워드

  • this : 자기 자신 지칭
  • 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역 변수가 우선한다.
  • 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면 this를 접두사로 사용한다.
  • 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명을 접두사로 사용한다.

# super키워드

  • 단일 상속만을 지원하는 자바에서 super는 바로 위 상위 클래스의 인스턴스를 지칭
  • super.super 형태로 상위의 상위 클래스의 인스턴스에는 접근이 불가능