Tv t;
t.(메소드)
라고 가정해보자.
new()를 통해 인스턴스가 생성되고 heap Area에 정보가 저장된다.
t - (0x100) 라고 했을 때 0x100은 인스턴스화된 정보를 갖고 있는 Heap Area 주소. 이게 t 변수 내부에 저장된다.
메소드는 동일한 참조형의 instance들 끼리는 모두 같으므로 JVM Method Area에 위치해있다.
Tv[] tvArr = new Tv[3];
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
tvArr - 0x100
tvArr[0] - 0x650
tvArr[1] - 0x700
tvArr[2] - 0x750
tvArr 자체랑 tvArr[i] 각 요소 모두 객체가 들어있는게 아니라 인스턴스의 주소값이 들어있게 된다.
클래스 변수 : static 변수 - 모든 클래스끼리 상태를 공유한다.
인스턴스 변수 : 그냥 클래스 내부에 정의된 변수
지역 변수 : 메소드, 생성자, 초기화 블럭 내부에 있는 변수
public void myFunc(int num) {
}
기본형 매개변수는 값을 복사해서 넘기기 때문에 Read만 가능하다.
public void myFunc(Integer num) {
}
참조형 매개변수는 주소를 복사해서 넘기기 때문에 Read와 Write 모두 가능하다.
그리고 반환 타입이나 배열도 마찬가지다.
매개변수의 개수를 다르게 하는
가장 마지막에 놓아야한다.
그리고 호출할 때마다 내부적으로는 배열이 새로 생성되므로 비효율적이다. 따라서 꼭 필요한 경우에만 가변인자를 생성해야 한다.
String concatenate(String s1, String... args)
이런 식으로 사용한다.
구분되지 않을 수 있으므로 오버로딩 하지 않는 것이 좋다.
클래스 메소드 : static 붙은 메소드
인스턴스 메소드 : 그냥 늘 쓰던 메소드
class가 메모리에 올라갈 때 자동적으로 생성되니까 instance를 만들지 않고 바로 사용 가능한 것이다.
예를 들면
Stream.of()
Enum.of()
그리고 instance 변수, instance 메소드는 사용 불가능하다.
근데 대입 연산자 같은걸로 binding 같은거. 인스턴스가 생성되고는 활용가능하다.
인스턴스 메서드에서는 static 붙은거 메소드든 변수든 사용가능하다.
초기 상태 설정이 불가능하다.
new 연산자가 instance를 만드는 것이지, 생성자가 만드는 것이 아니다.
i) 매개변수가 있는 생성자가 1개 이상이라도 있을 때는 compiler가 안 만들어준다.
ii) 아예 아무것도 없을 때는 컴파일러가 디폴트 생성자는 만들어준다.
this( , , ) 이렇게 사용하면 되긴한다.
이 경우는 그냥 참조 변수다.
초기화 순서는 아래 순서대로 이루어진다.
(i) 명시적 초기화
(ii) 초기화 블럭
(iii) 생성자
int door = 4;
class InitBlock {
static {
s = 2; // 아예 처음부터 바인딩
}
{
x = 3; // 인스턴스가 생성될 때 바인딩
}
}
package : 클래스들의 묶음, 물리적으로 하나의 디렉토리를 의미
import문 : 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용하는 클래스 이름에서 패키지명은 생략할 수 있다. 그리고 * 사용해도 성능 상의 큰 차이는 없다.
static import : static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.
static / final / abstract
final : 변수 변경 불가, 메소드 오버라이딩 불가, 클래스 자손 클래스 못 만들
abstract : 클래스 or 메소드에서만 붙일 수 있음. 메소드 선언부에만 작성하고 실제 수행 내용은 아직 구현하지 않았음을 의미.
참조 변수가 참조하고 있는 인스턴스의 실제 타입을 알아볼 때 사용
if( c instance of FireEngine ) {
~~~
} else if ( c instance of Ambulonce ) {
~~~
}
(1) 이름 같고
(2) 매개변수 같고
(3) 반환타입 같을 때
(하지만 자손 클래스의 타입으로 변경하는 것은 같게 본다.)
주의사항
(1) 메소드 이름이 같고
(2) 매개변수의 개수나 타입이 달라야 한다.
반환 타입은 고려하지 않는다.
Super : 조상 클래스 참조변수
Super() : 조상 클래스 생성자 호출 시 사용. 자식 생성자에서 첫 줄이 super();가 아니면 생성자 첫줄에 자동으로 넣어준다. super(x, y) 이런 식으로 넣으면 컴파일러가 알아서 맞는걸 찾아서 넣어준다.
Java 10에서 부터 추가됐다.
1) 지역 변수에서만 사용
2) 선언과 동시에 초기화 필요
3) null로 초기화할 수 없음
4) 배열에 사용할 수 없음.
5) 람다에 사용할 수 없다.