: 선언부 존재, 구현부 없는 메서드
추상 메서드를 하나라도 갖고 있는 클래스라면 Abstract Class로 선언해야 함
클래스의 인스턴스(객체)를 만들 때 마다 new 키워드를 사용
판다 푸바오 = new 판다();
'객체 생성자 메서드'를 줄여서 '생성자'라는 이름으로 더 많이 씀
public class 판다 {
public 판다(String name) {
System.out.println(name);
}
}
main문 {
판다 푸바오 = new 판다();
}
// 에러 발생
클래스 생성 시의 실행 블록
클래스가 스태틱 영역에 배치될 때 실행되는 코드 블록
public class 판다 {
static {
System.out.println("판다는 멍멍");
}
}
main문 {
System.out.println("실행");
판다 푸바오 = new 판다();
}
위의 예시 코드를 실행시키면 "실행", "판다는 멍멍"이 출력된다.
모든 패키지와 클래스가 메모리의 스태틱 영역에 로딩되는 시점
: 해당 패키지 또는 클래스가 처음으로 사용될 때(이 때, 해당 클래스의 static 블록이 단 한번만 실행)
⬇️ 클래스가 처음으로 사용될 때
객체 지향 언어의 구성 요소인 클래스, 변수, 메서드에 사용 가능
하위 클래스를 만들 수 없다.
▪️ final 변수 -> 객체상수
▪️ final static 변수 -> 정적상수
▪️ { final 변수 } -> 지역상수
public class 판다 {
final void 구른다() {
...
}
}
class 푸바오 extends 판다 {
// 에러 발생 : Cannot override the final method from 판다
void 구른다() {
...
}
}
인스턴스는 클래스를 통해 만들어진 객체
instanceof는 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자 (true or false를 반환)
(인터페이스의 구현 관계에서도 동일하게 적용됨)
객체_참조_변수 instanceof 클래스명
객체 참조 변수의 타입이 아닌 실제 객체의 타입에 따라 결과값을 반환함
class 동물
class 포유류 extends 동물
class 판다 extends 포유류
동물 푸바오 new 판다();
푸바오 instanceof 동물 // true
푸바오 instanceof 포유류 //true
푸바오 instanceof 판다 //true
네임스페이스를 만들어주는 역할
package 푸바오
package 아이바오
푸바오.대나무 <--> 아이바오.대나무 => 둘은 다름
인터페이스는 public 추상 메서드와 public 정적 상수만 가질 수 있음
메서드에 public, abstract / 속성에 public, static, final을 붙이지 않아도 자바가 알아서 붙여줌
그러나 lambda로 인해 디폴트 메서드라 하는 객체 구상 메서드와 정적 추상 메서드를 지원 가능
자바8부터는 lambda를 통해서만 코드블록을 가질 수 있음, 코드블럭을 변수처럼 사용 가능
(기존에는 코드블록은 반드시 메서드 내에 존재해야만 했음)
표현식
(매개변수) -> {함수로직 (+리턴)}
- 단순한 람다 구문의 경우에는 중괄호 없을 수 있음
- return 없을 수 있음
- 매개변수에 타입 명시 안해도 됨
- 람다식 문법을 컴파일러가 익명 클래스로 변환
인터페이스가 구현체를 가질 수 있음
-> 기본적인 기능을 탑재한 인터페이스 만들 수 있음
-> 디폴트 메서드를 갖는 인터페이스를 어떤 클래스가 구현하면, 그 클래스에서 인터페이스의 디폴트 메서드를 오버라이딩하지 않아도 기능을 사용할 수 있음
추상 메서드가 오직 하나만 존재하는 인터페이스
(default 메서드나 static 메서드가 있어도 상관 없음)
@FunctionalInterfcae 어노테이션을 붙임
함수형 인터페이스 등의 도입으로 인터페이스에 body까지 가진 디폴트 메서드와 정적 메서드를 넣을 수 있게 됨
디폴트 메서드와 정적 메서드는 오버라이딩 할 필요 없이 implements해주면 그냥 사용 할 수 있음
//default method
public default 반환형 메서드명(parameter) {
// ...
}
//static method
public static 반환형 메서드명(parameter) {
//...
}
객체가 자기 자신을 지칭할 때 쓰는 키워드
한 단계 위 상위 클래스의 인스턴스를 지칭하는 키워드
super.super.메소드는 사용 불가
public class 판다 {
void 구른다() {
...
}
}
class 푸바오 extends 판다 {
super.구른다();
}
김종민, '스프링 입문을 위한 자바 객체 지향의 원리와 이해', 위키북스 참고