import java.lang.* <- '*'은 모든클래스를 뜻한다.
import 패키지명.클래스명;
또는
import 패키지명.*;
- import문은 컴파일 시에 처리되므로 프로그램의 성능에 영향없음
import java.util.Calendar;
import java.util.Date;
import java.util.ArrayList;
▽
import java.util.*;
- 다음의 두 코드는 서로 의미가 다르다.
import java.util.;
import java.text.;
▽
import java.*; - java 패키지의 모든클래스(패키지는 포함안됨)
클래스와 클래스 멤버(멤버 변수,메서드)에 부가적인 의미 부여(형용사+명사)
접근제어자는 4개중에 1개만 붙혀야한다.
하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만)
public class ModifierTest {
public static final int WODTH = 200;
public static void main(String[] args) {
System.out.println("WODTH="+WODTH);
}
}
제어자 대상 의미
static 멤버변수 - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
- 클래스 변수는 인스턴스에 생성하지 않고도 사용 가능하다.
- 클래스가 메모리에 로드될 때 생성된다.
메서드 - 인스턴스를 생성하지 않고도 호출한 가능한 static 메서드가 된다.
- static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.
class StaticTest{
static int width = 200; //클래스 변수(static변수)
static int height = 120;//클래스 변수(static변수)
static { //클래스 초기화 블럭
// static변수의 복잡한 초기화 수행
}
static int max(int a, int b) { //클래스 메서드(static메서드)
return a > b ? a : b;
}
}
제어자 대상 의미
final 클래스 - 변경될수 없는 클래스. 확정될수 없는 클래스가 된다.
- 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다
메서드 - 변경될 수없는 메서드. final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수없다.
멤버변수 - 변수 앞에 final이 붙으면, 값이 변경할 수 없는 상수가 된다.
지역변수
final class FinalTest{ //조상이 될 수 없는 클래스
final int MAX_SIZE = 10; //값을 변경할 수 없는 멤버변수(상수)
final void getMaxSize() { // 오버라이딩할 수 없는 메서드(변경불가)
final int LV = MAX_SIZE; //값을 변경할 수 없는 지역변수(상수)
return MAX_SIZE;
}
}
제어자 대상 의미
abstract 클래스 - 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
메서드 - 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
abstract class AbstractTest { //추상클래스(추상메서드를 포함한 클래스,미완성설계도)
abstract void move(); // 추상메서드(구현부가 없는 메서드, 미완성메서드)
}
Abstract a = new Abstract() // 에러. 추상 클래스의 인스턴스 생성불가
private 같은 클래스 내에서만 접근 가능하다.
(default) 같은 패키지 내에서만 접근 가능하다.
protected 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
public 접근 제한이 전혀 없다.
public > protected > (default) > private
(접근제한없음) 같은패키지+자손 같은패키지 같은클래스
class AccessModifierTest{ // class에는 public,(default)
// public,protected,(default),private 멤버변수에 들어갈수있다.
int iv; // 멤버변수(인스턴스변수)
static int cv; // 멤버변수(클래스변수)
void method(){}
}
여러가지 형태를 가질 수 있는 능력
조상 타입 참조 변수로 자손 타입 객체를 다루는 것
Tv t = new SmartTv(); // 타입 불일치 ok
객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이?
SmartTv s = new SmartTv(); //참조변수와 인스턴스의 타입이 일치
Tv t = new SmartTv(); // 조상타입 참조변수로 자손타입 인스턴스 참조
자손 타입의 참조변수로 조상 타입의 객체를 가리킬수 없다 X
Tv t = new SmartTv(); // Ok 허용
SmartTv s = new Tv(); // 에러. 허용 안됨
정리
Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?
A. 아닙니다. 일치하는 것이 보통이지만 일치 하지 않을 수도 있습니다.
Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이?
A. 참조변수로 사용할 수 있는 멤버의 갯수가 달라집니다.
Q. 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 있나요?
A. 아니요. 허용되지 않습니다.