추상 클래스는 추상 메소드가 하나 이상 존재하는 클래스를 뜻한다. 추상 메소드는 내용이 구현되지 않고, 선언만 된 메소드를 의미한다. 따라서 추상 클래스는 추상 클래스에 추상 메소드를 선언만 해놓고, 해당 클래스를 상속받은 자식 클래스들이 추상 메소드를 오버라이딩하여 구현하게 하는 방식으로 사용한다.
따라서 추상 클래스는 인스턴스화(객체화)가 불가능하며, 상속을 염두에 두고 만들어진다. 추상 클래스를 상속받은 자식 클래스들은 추상 메소드를 반드시 재구현해야 한다. (일반 메소드는 재구현하지 않아도 괜찮음)
추상 클래스에는 일반 메소드와 추상 메소드 모두 정의 가능하다.
1) 일반 메소드 : 선언 후 내용이 구현된 메소드. 상속받을 경우 오버라이딩 하지 않아도 괜찮다.
2) 추상 메소드 : 내용이 미구현되고 선언되지 않은 메소드. 상속받을 경우 반드시 오버라이딩(재구현)해야 한다.
인터페이스는 추상 클래스와 동일하게 인스턴스화가 불가능하며, 다른 클래스들을 위한 라이브러리 개념이라고 생각하면 쉽다.
그러나 추상 클래스와 다르게 인터페이스 추가 시 명령어로 extends
가 아닌 implements
를 사용하고, 추상 메소드만 정의 가능하다(일반 메소드 정의 불가).
또한 인터페이스는 클래스에게 다중 상속이 가능하다(메소드들이 선언만 되어있으므로 다이아몬드 상속 문제가 일어나지 않음).
// Interface 1
public interface CProgramming {
public void procedure();
// 모든 메소드가 선언만 가능(only declare)
}
// Interface 2
public interface JavaProgramming {
public void objectOriented();
}
// 인터페이스 1, 2를 implements하는 JobAplicant 클래스 (다중 상속)
public class JobAplicant implements CProgramming, JavaProgramming{
// fields
private int toeic;
private double grade;
private String[] licenses;
// method
// implements한 두 인터페이스의 추상 메소드들을 모두 override해야 한다.
@Override
public void objectOriented() {
System.out.println("객체지향은..객체지향이다");
}
@Override
public void procedure() {
System.out.println("절차지향은 . . . 어쩌구저쩌구");
}
public String writeLetter() {
String letter = ".............자소서.............";
return letter;
}
public class Kakao {
public void recruitJavaProgrammer(JavaProgramming java) {
// 인터페이스를 파라미터로 받는 자바프로그래머 채용 메소드
// 해당 인터페이스(JavaProgrmming interface)를 구현한 객체만이 메소드를 사용할 수 있음 .
java.objectOriented();
}
}
public class JobAplicantTest {
public static void main(String[] args) {
JobAplicant soir = new JobAplicant();
System.out.println("자기소개서 내용 : " + soir.writeLetter());
Kakao kakao = new Kakao();
kakao.recruitJavaProgrammer(soir);
// JobAplicant 객체를 넣으면 recruitJavaProgrammer()메소드에서는 해당 객체의 JavaProgramming 인터페이스 내용을 읽어온다(objectOriented() 메소드).
// 만약 JobAplicant 객체가 JavaProgramming 인터페이스를 implements하지 않을 경우 Error.
}
}
기본 자료형(Primitive type)들은 객체들과 다르게 해당 데이터 값을 메모리의 Stack
영역에 바로 저장하는데, 이러한 기본 자료형들을 객체로 만든 것이 Wrapper Class이다. 래퍼 클래스는 Object
클래스를 상속한다.
Java의 래퍼 클래스로는 Integer
, Float
, Double
, Character
가 존재한다.
이 중 Character
를 제외한 클래스는 모두 숫자를 데이터 값으로 가지는 객체들인데, 이 경우에는 다른 객체처럼 Heap
영역에 객체 메모리를 따로 가지지 않고, 이미 Heap영역에 구현된 상수 Pool에 들어있는 숫자를 참조한다. 따라서 객체 주소가 아닌 상수 pool을 참조한다.