인스턴스, 객체
- 동물 객체는 어떻게 울어야 하지? / 실수로 동물 객체를 만들면 어쩌지?
- 동물 참조 변수 배열로 모든 동물을 울게하려면,
하위 클래스에서 오버라이딩 할 울어보세요() 메서드가 상위 클래스인 동물 클래스에 필요한데...오버라이딩 강제
- 개발자가 아무런 생성자도 만들지 않으면, 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다.
- 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어주지 않는다.
- 클래스 생성자는 존재하지 않는다.
그러나 클래스가 스태틱 영역에 배치될 때 실행되는 코드블록이 있다. static 블록이다.
- 스태틱 영역도 메모리이다. 메모리는 최대한 늦게 사용을 시작하고 빨리 반환하는 것이 정석이다.
- 물론 자바는 스태틱 영역에 한번 올라가면 프로그램이 종료되기 전까지는 해당 메모리를 반환할 수 없지만 그럼에도 최대한 늦게 로딩함으로써 메모리 사용을 최대한 늦추기 위함이다.
- 클래스 정보는 해당 클래스가 코드에서 맨 처음 사용될 때 T메모리의 스태틱 영역에 로딩되며, 이때 단 한번의 해당 클래스의 static블록이 실행된다.
- 클래스, 변수, 메서드
객체
추상, 정적 상수
169p - 출력값은?
20, 10
170p - this와 super의 개념을 설명하세요
- this가 객체 멤버 메서드 내부에서 객체 자신을 지칭하는 키워드
- super는 단일 상속만을 지원하는 자바에서, 바로 위 상위 클래스의 인스턴스를 지칭하는 키워드이다.
package abstractMethod02;
public abstract class 동물{
abstract void 울어보세요();
}


- 추상 클래스는 인스턴스, 즉 객체를 만들 수 없다. 즉, new를 사용할 수 없다.
- 추상 메서드는 하위 클래스에게 메서드의 구현을 강제한다.
오버라이딩 강제!- 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.
동물 뽀로로 = new 동물(); -> 동물() 클래스명()도 메서드이다.
반환값이 없고 클래스명과 같은 이름을 가진 메서드를 객체를 생성하는 메서드라고 해서
객체 생성자 메서드라 한다. => 생성자 라는 이름으로 더 많이 부른다.
클래스의 static 블록이 실행된다.
- 클래스의 정적 속성을 사용할 때
- 클래스의 정적 메서드를 사용할 때
- 클래스의 인스턴스를 최초로 만들 때
클래스, 변수, 메서드package OOP.finalVariable;
public class 고양이 {
final static int 정적상수1 = 1;
final static int 정적상수2;
final int 객체상수1 = 1;
final int 객체상수2;
static{
정적상수2 = 2;
// 상수는 한 번 초기화되면 값을 변경할 수 없다.
// 정적상수2 = 4;
}
고양이(){
객체상수2 = 2;
// 상수는 한 번 초기화되면 값을 변경할 수 없다.
// 객체상수2 = 4;
final int 지역상수1 = 1;
final int 지역상수2;
지역상수2 = 2;
}
}
정적상수는 선언 시에, 또는 정적 생성자에 해당하는 static 블록 내부에서 초기화가 가능하다. 객체 상수 역시 선언 시에, 또는 객체 생성자 또는 인스턴스 블록에서 초기화할 수 있다.지역 상수 역시 선언 시에, 또는 최초 한 번만 초기화가 가능하다. 객체참조변수 instanceof 클래스명
오라클에서는 빅데이터와 병렬성 지원을 강화한 자바 8 출시.
람다(Lambda)라는 기능을 언어적으로 추가했다.
정의: 함수를 의미하고, 변수에 할당할 수 있다. 함수는 로직이다. 람다는 변수에 저장할 수 있는 로직이다.
변수는 값을 저장할 수 있고, 메서드의 인자로 쓰일 수 있고, 메서드의 반환값으로 사용할 수 있다.
변수에 로직을 저장할 수 있고, 로직을 메서드의 인자로 쓸 수 있고, 로직을 메서드의 반환값으로 사용할 수 있다는 결론에 도달한다.
- 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우, 지역변수가 우선한다.
- 객체 변수와 이름이 같은 지역 변수가 있는 경우, 객체 변수를 사용하려면 this를 접두사로 사용한다.
- 정적 변수와 이름이 같은 지역 변수가 있는 경우, 정적 변수를 사용하려면 클래스명을 접두사로 한다.