[Java]07-2. 제어자, 다형성
제어자
제어자란?
- 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여합니다.
- 제어자는 크게 접근 제어자와 그외의 제어자로 나뉩니다.
- 하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나, 접근제어자는 단 하나만 사용할 수 있습니다.
접근 제어자
public, protected, default, private
그 외
statice, final, abstract, native, transient, synchronized, volatile, strictfp
static - 클래스의 , 공통적인
static이 사용될 수 있는 곳 - 멤버변수, 메서드 , 초기화 블럭
제어자 | 대상 | 의미 |
---|---|---|
static | 멤버변수 | - 모든 인스턴스에 공통적으로 사용되는 클래스변수가 됩니다. - 클래스변수는 인스턴스를 생성하지 않고도 사용 가능합니다. - 클래스가 메모리에 로드될 때 생성됩니다. |
static | 메서드 | - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 됩니다. - static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없습니다. |
class staticTest {
static int width = 200;
static int height = 120;
static { //클래스 초기화 블럭
//static변수의 복잡한 초기화 수행
}
static int max(int a, int, b) {
return a > b > a : b;
}
}
final - 마지막의 변경될 수 없는
final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수
제어자 | 대상 | 의미 |
---|---|---|
final | 클래스 | 변경될 수 없는 클래스, 확장될 수 없는 클래스가 됩니다. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될수 없습니다. |
final | 메서드 | 변경 될 수 없는 메서드, fianl로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없습니다. |
final | 멤버변수 | 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 됩니다. |
final | 지역변수 | 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 됩니다. |
**[참고]** 대표적인 final클래스로는 String과 Math가 있습니다.
생성자를 이용한 final 멤버변수 초기화
-
final이 붙은 변수는 상수이므로 보통은 선언과 초기화를 동시에 하지만 인스턴스마다 고정값을 갖는 인스턴스 변수의 경우 생성자에서 초기화합니다.
(카드의 무늬와 숫자는 한번 결정되면 바뀌지 않아야하는 경우)
abstract - 추상의, 미완성의
abstrct가 사용될 수 있는 곳 - 클래스, 메서드
제어자 | 대상 | 의미 |
---|---|---|
abstract | 클래스 | 클래스 내에 추상 메서드가 선어되어 있음을 의미합니다. |
abstract | 메서드 | 선어부만 작성하고 구현부는 작성하지 않은 추상메서드임을 알립니다. |
abstract class AbstractTest {//추상클래스
abstract void move(); // 추상메서드
}
접근 제어자
-
멤버 또는 클래스에 사용되어 외부로부터의 접근을 제어합니다.
접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
parivete
- 같은 클래스 내에서만 접근이 가능
default
- 같은 패키지 내에서만 접근이 가능
protected
- 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
public
- 접근 제한이 전혀 없음.제어자 같은 클래스 같은 패키지 자손 클래스 전체 public ptotected default private
접근 제어자를 이용한 캡슐화 ⭐
접근 제어자를 사용하는 이유
- 외부로부터 데이터를 보호하기 위해
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해
class Time {
private int hour;
private int minute;
private int second;
Time(int hour, int minute, int second) {
setHour(hour);
setMinute(minute);
setSecond(second);
}
public int getHour() {
return hour;
}
public int setHour(int hour) {
if (hour < 0 || hhour >23) return;
}
public static void main(String[] args) {
Time t = new Time(12, 35, 30);
//System.out.println(t.toString());
System.out.println(t);
//현재시간보다 1시간 후로 변경한다.
t.setHour(t.getHour()+1);
System.out.println(t);
}
public String toString() {
return hour + ":" +minute + ":" + second;
}
}
생성자의 접근 제어자
-
일반적으로 생성자의 접근 제어자는 클래스의 접근 제어자와 일치합니다.
-
생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있습니다.
제어자의 조합
대상 | 사용가능한 제어자 |
---|---|
클래스 | public, (default), final, abstract |
메서드 | 모든 접근 제어자, final, abstract, static |
멤버변수 | 모든 접근 제어자, final, static |
지역변수 | final |
- 메서드에 static 과 abstact를 함께 사용할 수 없습니다.
- static메서드는 몸통(구현부)이 있는 메서드에서만 사용할 수 있기 때문입니다.
- 클래스에 abstract와 final을 동시에 사용할 수 없습니다.
- 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문입니다.
- abstract메서드의 접근제어자가 private일 수 없습니다.
- abstract메서드는 자손클래스에서 구현해주어야하는데 접근 제어자가 private이면, 자손클래스에서 접근할 수 ㅇ벗기 때문입니다.
- 메서드에 private과 final을 같이 사용할 필요는 없습니다.
- 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문입니다. 이 둘 중 하나만 사용해도 의미가 충분합니다.
다형성
다형성이란?
여러 가지 형태를 가질 수 있는 능력을 말합니다.
하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것으로 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것이 다형성입니다.
class TV {
boolean power;
int channel;
void power() {
power =! power;
}
void channelUp() {
++channel;
}
void channelDown() {
--channel;
}
class CaptionTV extends TV {
String text; //캡션 내용
void caption() { /* 내용 생략 */
}
}
}
조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있지만, 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없습니다.
참조변수의 형변환
-
서로 상속관계에 있는 타입간의 형변환만 가능합니다.
-
자손 타입에서 조상타입으로 형변환하는 경우, 형변환 생략가능합니다.
자손타입 -> 조상타입(Up-casting) : 형변환 생략가능
자손타입 <- 조상타입(Down-casting) : 형변환 생략불가
instanceof 연산자
- 참조변수가 참조하는 이스턴스의 실제 타입을 체크하는데 사용
- 이항연산자이며 피연산자는 판조형 변수와 타입. 연산결과는 true, false
- instanceof의 연산결과가 true이면, 해당 타입으로 형변환이 가능합니다.
참조변수와 인스턴스변수의 연결
-
멤버변수가 중복정의된 경우. 참조변수의 타입에 따라 연결되는 멤버변수가 달라집니다.
참조변수타입에 영향받음
-
메서드가 중복정의된 경우, 참조변수의 타입에 관계없이 항상 실제 인스턴스의 타입에 정의된 메서드가호출됩니다.
참조변수 차입에 영향받지 않음
매개변수의 다형성
- 참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있습니다.
여러 종류의 객체를 하나의 배열로 다루기
- 조상타입의 배열에 자손들이 객체를 담을 수 있습니다.
댓글남기기