4 분 소요

제어자

제어자란?

  • 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여합니다.
  • 제어자는 크게 접근 제어자와 그외의 제어자로 나뉩니다.
  • 하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나, 접근제어자는 단 하나만 사용할 수 있습니다.

접근 제어자
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
  1. 메서드에 static 과 abstact를 함께 사용할 수 없습니다.
    • static메서드는 몸통(구현부)이 있는 메서드에서만 사용할 수 있기 때문입니다.
  2. 클래스에 abstract와 final을 동시에 사용할 수 없습니다.
    • 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문입니다.
  3. abstract메서드의 접근제어자가 private일 수 없습니다.
    • abstract메서드는 자손클래스에서 구현해주어야하는데 접근 제어자가 private이면, 자손클래스에서 접근할 수 ㅇ벗기 때문입니다.
  4. 메서드에 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이면, 해당 타입으로 형변환이 가능합니다.

참조변수와 인스턴스변수의 연결

  • 멤버변수가 중복정의된 경우. 참조변수의 타입에 따라 연결되는 멤버변수가 달라집니다.

    참조변수타입에 영향받음

  • 메서드가 중복정의된 경우, 참조변수의 타입에 관계없이 항상 실제 인스턴스의 타입에 정의된 메서드가호출됩니다.

    참조변수 차입에 영향받지 않음

매개변수의 다형성

  • 참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있습니다.

여러 종류의 객체를 하나의 배열로 다루기

  • 조상타입의 배열에 자손들이 객체를 담을 수 있습니다.

카테고리:

업데이트:

댓글남기기