Link Search Menu Expand Document

자바가 확장한 객체 지향

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 형태로 상위 클래스의 상위 클래스의 인스턴스에 접근하는 것은 불가능