static 멤버: 객체 내부에 존재하지 않고 메소드영역에 생성
클래스객체 : 참조변수는 스택에 생성, 실제 객체는 힙에 생성
Calcular.pi 이렇게 static 멤버사용
블록 내부에 해당 클래스의 인스턴스 필드나 인스턴스 메소드 사용 불가
일반 인스턴스 필드와 메소드는 반드시 객체를 만들어야지 사용가능.
당연히 객체 자신의 참조인 this 도 사용불가능
non-static = 인스턴스 멤버
static
=> static 메소드는 non-static 멤버를 사용할 수 없다.
반대로 ,non-stati 메소드는 static 멤버 사용 가능
static 이 전역변수 처럼 보일 수 있지만 다른 것이다.
지역변수 : 범위가 제한적 / 생명력이 한시적
전역변수 : 범위에 제한x / 생명력이 영생임(계속 살아있음)
전역변수는 가급적 사용하지 말것(어디에서나 접근할 수 있기때문) 그러나 값이 유지된다는 점은 큰 장점임.
staic : 전역변수 처럼 값을 유지할수 있는 장점만 가져온 것, 그리고 로컬에서만 안전하게 접근 가능한 특성
모든 필드와 메소드가 public static 으로 선언 :
예제 17
해결법1 : run(), speed 를 모두 static 으로 만든다.
해결법2 : 코드에서 처럼 main 메소드 안에 객체를 생성해서 static 멤버에 접근
final 필드 : 말그대로 최종, 끝. 가져자 사용하는 것은 가능해도 값을 변경하는 것은 불가능 (상수와 같은 개념)
static final : 객체 내부에 존재하지 않고, 모든 객체가 공유해서 사용하는 고유한 값(변경 불가능하며 공유 가능한 값이다)
public class Person{
final String nation = "Korea";
Person()
{
}
클래스를 기능별로 묶어서 그룹 이름을 붙여 놓은 것 (어떤 한 기능 단위의 분류)
폴더와 비슷한 개념. 하나의 목적을 가진 애들을 폴더에 넣듯이.
컴파일러가 클래스를 인식시 => 상위패키지.하위패키지.클래스
이렇게 패키지 경로까지 쭉 붙여줘서 상세하게 인식한다
(그냥 클래스 이름만 붙여주면 중복되는 이름을 가진 클래스가 등장해서 충돌이 발생할 수도 있기 때문에 이렇게 인식)
다른 패키지에 있는 클래스를 내가 가져다 사용하고 싶을 때 사용
별표 * 는 이 패키지에 있는 모든 클래스를 가져다사용하곘다는 의미로, 이름만 가져다가 쓸수있다.
패키지가 다른 클래스를 사용해야 할 경우
package com.mycompany;
public class Car{
com.hankook.Tire tire = new.com.hankook.Tire();
}
package com.mycompany;
import com.hankook.Tire; => 내 코드에서 com 패키지의 하위 패키지인 hankook 패키지 안에있는 Tire 클래스를 import
public class Car{
Tire tire = new Tire();
}
public 멤버 : 동일한 패키지이든, 다른 패키지이든간에 어디서든 다 사용가능한 멤버
protected 멤버 : 동일한 패키지 내에서 다 사용가능 + 상속관계에서 상속받았을 경우 다른 패키지에서도 다 사용가능한 멤버
default 멤버 : 동일한 패키지내에서 다 사용가능한 멤버
private 멤버 : 같은 클래스 내에서만 사용가능한 멤버
종류