Dev/Java

[Java] 자바의 정석 기초편 ch7-17~20 제어자, static, final, abstract

코딩삐약 2022. 6. 15. 10:22

ch7-17 제어자(modifier)

- 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여

접근제어자  public, protected, (default), private
그          외   static, final, abstract, native, transient, synchronized, volatile, strictfp

 

- 하나의 대상에 여러 제어자를 같이 사용가능 ( 접근제어자는 4개 중에 1개만 붙임 )

public class ModifierTest {
	public static final int WIDTH = 200;
    
	public static void main(String[] args) {
    	System.out.println("WIDTH=" + WIDTH);
    }
}

 

ch7-18 static - 클래스의, 공통적인

제어자 대상 의미
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;
        // iv 사용 x, 인스턴스 메서드 사용 x
    }
}

 

 - 인스턴스 멤버들은 객체 생성 후 사용할 수 있기 때문에 static메서드 내에서는 사용 불가

 

ch7-19 final - 마지막의, 변경될 수 없는

제어자 대상 의미
final 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
ex) String (보안 문제때문에), Math (Static메서드 집합이라서)
메서드 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의될 수 없다.
멤버변수 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
지역변수

- 상속계층도에 제일 마지막 클래스가 될 수 있다 ( = 자식 클래스가 없다)

final class FinalTest {				// 조상이 될 수 없는 클래스
	final int MAX_SIZE = 10;		// 값을 변경할 수 없는 멤버변수(상수)
    
    final void getMaxSize() {		// 오버라이딩(= 조상메서드를 덮어쓰는것)할 수 없는 메서드(변경불가) 
    	final int LV = MAX_SIZE;	// 값을 변경할 수 없는 지역변수(상수)
        return MAX_SIZE;
    }
}

 

ch7-20 abstract - 추상의, 미완성의

제어자 대상 의미
abstract 클래스 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
메서드 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.

- 추상 클래스의 객체 생성불가

- 추상 클래스를 상속받아서 완전한 클래스(구상 클래스)로 만든 후에 객체 생성가능

- 추상 클래스 <-> 구상 클래스

abstract class AbstractTest {		// 추상 클래스(추상메서드를 포함한 클래스)
	abstract void move();			// 추상 메서드(구현부가 없는 메서드)
    // 선언부만 있고 {} 몸통이 없다 - 미완성 메서드
}   // 미완성 메서드를 갖고 있으므로 클래스도 미완성 클래스
    // -> 미완성 설계도 -> 제품 생성불가 = 객체 생성불가
    
    AbstractTest a = new AbstractTest(); // 에러. 추상 클래스의 인스턴스 생성불가