제어자, static, final, abstract
제어자 (modifier)
- 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
제어자는, 클래스와 클래스멤버 앞에 붙여서 부가적인 의미를 부여한다.
영어로 따지면, 형용사와 같은 느낌이다. 명사 앞에 붙어서 명사를 꾸며준다.
제어자도 마찬가지로 클래스나 클래스멤버 앞에 붙어서 부가적인 의미를 부여한다.
제어자의 종료
제어자의 종류에는 크게 2부류로 나뉘는데,
- 접근 제어자 - public, protected, (default), private
- 그 외 - static, final, abstract, native, transient, synchronized, volatile, strictfp
접근제어자는 4개이다.
접근제어자는 하나의 대상에 이 4개 중에 1개만 붙일 수 있다.
예를 들어, iv앞에 public과 protected를 같이 붙일 수 없다는 이야기다.
그리고 default는 쓰는게 아니라 아무것도 안붙인 것을 의미한다.
그 외는, static, final, abstract 등이 있고 추가로 native, trasient등이 있는데, 나중에 공부하다보면 나올테니 너무 신경쓰지는 말자.
- 하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만)
하나의 대상에 여러 제어자를 같이 사용할 수 있다.
WIDTH앞에는 제어자가 public, static, final 3개나 붙었다.
각각 의미하는게 다르다.
작성 순서는 상관없지만. 관례적으로 접근 제어자를 맨 앞에 쓴다.
메인메서드도 보면, public, static 2개의 제어자를 썻다.
이런 식으로, 하나의 대상에 여러 제어자를 같이 사용할 수 있다. 단, 접근 제어자는 하나만 사용해야한다.
static - 클래스의, 공통적인
static이 붙을 수 있는 곳은, 멤벼변수 혹은 메서드이다.
코드를 보면, static을 잘 사용한 예시를 볼 수 있는데,
static을 iv앞에 붙이면 static + iv = cv가 되고,
static에 {}를 붙이면, 복잡한 초기화를 수행하는 클래스 초기화 블럭이 된다.
final - 마지막의, 변경될 수 없는
제어자 final는 마지막의, 변경될 수 없는 이라는 의미를 가지고 있다.
final이 붙을 수 있는 대상은 전부 다이다.
final이 클래스 앞에 붙으면, 마지막 클래스, 변경될 수 없는 클래스 라는 뜻이다.
즉, 확장될 수 없는 클래스가 된다는 뜻이다. 이 말은, 다른 클래스의 조상이 될 수 없는 클래스 라는 뜻이다.
상속계층도가 있으면, 제일 마지막인 것이다.
대표적인 final클래스는, String, Math 클래스이다. String클래스는 보안 문제때문에 final클래스로 한 것 이다.(PW등)
그리고 Math같은 경우에는, 전부 static메서드 집합이므로 굳이 이 클래스를 상속받아서 쓸 일이 없는 것이다.
변수 앞에 final이 붙으면, 해당 변수는 상수가 된다.
메서드 앞에 final이 붙으면, 해당 메서드는 변경불가한 메서드가 된다.
즉, 오버라이딩 할 수 없는 메서드가 된다. (조상 메서드를 바꿔쓸 수 없는 메서드)
abstract - 추상의, 미완성의
abstract의 의미는, 추상의 또는 미완성의 라는 의미이다.
abstract는 클래스나 메서드 앞에만 붙을 수 있다.
뒤에서 추상화에 대해서 공부할 것인데, 그전에 미리 이 개념을 통해 다루고 가는 것이다.
일단, 메서드 중에, { }몸통이 없는 메서드가 있다. 몸통이 없이 세미콜론(;)로 끝난다.
이런 메서드를 "추상 메서드"라고 한다. (선언부는 있는데, { }구현부가 없는 메서드)
추상 메서드 앞에는 abstract를 붙인다.
추상 메서드를 포함하고 있는 클래스를 "추상 클래스"라고 한다.
추상 메서드는 "미완성 메서드"다.
미완성 메서드를 포함하고 있는 추상 클래스 또한 "미완성 클래스"이다.
추상 메서드를 포함하고 있으면 무조건 추상클래스다.
그래서 추상클래스도 앞에, abstract를 붙여야 한다.
추상 클래스는 미완성 클래스이고, 미완성 클래스 이므로 미완성 설계도 이다.
미완성 설계도로는 제품을 만들 수가 없다. (제품 생성 불가)
따라서 위의 AbstractTest클래스는 추상 클래스, 즉 미완성 클래스이므로
AbstractTest클래스의 객체를 생성할 수 없다.
설계도가 미완성 이기 때문에 추상 클래스의 인스턴스(객체)는 생성이 불가하다.
추상는 추상 클래스를 상속받아서 완전한 클래스(구상 클래스)를 만든 후에 객체를 생성할 수 있다. [추상 클래스의 반대말은 구상 클래스]
'JAVA' 카테고리의 다른 글
캡슐화 (0) | 2022.04.01 |
---|---|
접근 제어자 (0) | 2022.04.01 |
import문, static import문 (0) | 2022.03.31 |
패키지, 클래스 패스 (0) | 2022.03.31 |
참조변수 super, 생성자 super() (0) | 2022.03.31 |
댓글
이 글 공유하기
다른 글
-
캡슐화
캡슐화
2022.04.01 -
접근 제어자
접근 제어자
2022.04.01 -
import문, static import문
import문, static import문
2022.03.31 -
패키지, 클래스 패스
패키지, 클래스 패스
2022.03.31