제어자
- 클래스 , 변수 , 메서드의 선언부에 사용되어 부가적인 의미
- 접근제어자와 그외 제어자
- 접근제어자 - public protected default private
- 그외제어자 - static , final , abstract , native 등등
- 하나의 대상의 여러 개의 제어자 사용 가능 (단 접근 제어자는 하나만 가능)
static - 클래스 ,공통적인 - 멤버변수 메서드 초기화 블럭
- 멤버변수 - 클래스가 메모리에 로드될때 사용
- 메서드 - 인스턴스를 생성하지 않고 호출이 가능한 static메서드 ,인스턴스멤버들을 사용불가(static먼저 컴파일됨으로)
final - 클래스, 메서드, 멤버변수 , 지역변수
- 클래스 - 변경될수없는 클래스 , 조상 클래스가 될수 없다.
- 메서드 - 오버라이딩 불가
- 멤버변수, 지역변수 - 값을 변경할 수 없는 상수
- final은 선언과 동시에 초기화 하지만 인스턴스변수의 경우는 생성자에서 초기화 가능
Card c = new Card("HEART",10);
System.out.println(c.NUMBER);
System.out.println(c.KIND);
c.NUMBER =5 //에러
Card c2 = new Card("DIA",8);
System.out.println(c2.NUMBER);
System.out.println(c2.KIND);
}
}
class Card {
final int NUMBER; //상수지만 생성자에서 한번만 초기화 가능
final String KIND;
static int width = 100;
static int height = 250;
Card (String kind, int number) //인스턴스에서 초기화
this.KIND = kind;
this.NUMBER = number;
}
Card() {
this("HEART",1);
System.out.println("생성자");
}
public String toString() {
return KIND + " " + NUMBER;
}
}
- final도 생성자에서 인스턴스가 생성될때 한번만 초기화 가능
- 인스턴스가 생성될때 한번만 초기화 되기 때문에 다른 인스턴스를 만들어도 다르게 초기화 된다.
abstract - 추상,미완성 - 클래스, 메서드
- 클래스 - 클래스 내에 추상메서드가 선언
- 메서드 - 선언부만 있고 구현부는 없는 메서드.
접근 제어자
- 멤버 또는 클래스사용되며 외부로부터의 접근 제한
- private - 같은 클래스 내에서만 접근 가능
- default - 같은 패키지 내에서만 접근 가능
- protected 같은 패키지내 , 다른패키지의 자손클래스에서 접근 가능
- public - 접근 제한이 없음
생성자의 접근 제어자 - 클래스와 접근 제어자와 보통 같음.
다형성
다형성 - 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는것.
- 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것.
Tv가 조상 CaptionTv가 자식이라고한다면
CaptionTv c = new CaptionTv(); //1
Tv t = new CaptionTv(); //2
CaptionTv c = Tv t() // 3
1은 CaptionTv클래스의 모든 변수를 사용하고
2는 Tv의 변수만 사용 가능하다.
3은 불가능.
참조변수의 형변환
- 서로 상속관계에만 가능
- 자손 타입에서 조상타입 가능(생략가능) 자손-> 조상(up-casting)
사용법 : 조상 = 자손;
- 조상타입에서 자손타입 (생락불가) 자손 <- 조상(down-casting)
사용법 : 자손 = (자손클래스)조상;
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
fe.water();
car = fe; // 조상 <- 자손
//car.water();
fe2 = (FireEngine)car;
fe2.water();
}
}
class Car {
String color;
int door;
void drive() {
System.out.println("Drive");
}
void stop() {
System.out.println("Stop");
}
}
class FireEngine extends Car {
void water() {
System.out.println("water");
}
}
class Ambulance extends Car {
void siren() {
System.out.println("srien");
}
}
car.water(); 가 안되는 이유는 fe인스턴스를 참조하기는 하지만 조상클래스이기때문에 water()까지는 참조하지 못한다.
하지만 fe2는 fe인스턴스를 전체 다 참조하기 때문에 water()가 가능하다.
instanceof 연산자 - 참조변수가 참조하는 인스턴스의 실제 타입을 체크하는데 사용
- 연산결과가 true이면 해당타입으로 형변환 가능.
public static void main(String[] args){
FireEngine fe = new FireEngine();
if (fe instanceof FireEngine) {
System.out.println("FireEngine instance");
}
if ( fe instanceof Car) {
System.out.println("Car instance");
}
참조변수와 인스턴스변수의 연결
- 멤버변수가 중복정의된 경우는 참조변수타입에 영향을 받음
- 메서드가 중복정의된 경우는 참조변수 타입에 관계없이 실제 인스턴스 타입에 정의된 메서드가 호출
매개변수의 다형성
- 참조형 매개변수는 메서드 호출 시 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
'IT 관련 > JAVA' 카테고리의 다른 글
자바 예외처리 (0) | 2022.07.07 |
---|---|
자바 객체지향II (추상화, 인터페이스) (0) | 2022.06.30 |
자바 객체지향언어II(상속,오버라이딩,super (0) | 2022.06.28 |
자바 객체지향언어I (생성자 , 변수의 초기화) (0) | 2022.06.23 |
자바 객체지향언어I (재귀, 클래스메서드와 인스턴스메서드, 메서드 오버로딩) (0) | 2022.06.22 |