(2021.02.06)
지난주 스터디랑 순서를 헷갈려서 뒤죽박죽이다...
상속이 이번준데.. 상속을 저번주에 해버렸다.. 접근 제어자와 제어자의 개념을 공부해보니 지난주에 풀었던 자바 문제가 떠오른다. static 을 써주니까 오류가 해결되었던게 생각이 난다..
| 제어자
: 클래스, 변수 또는 메서드의 선언부에 사용하여 부가적인 의미를 부여함
접근 제어자: public, protected, default, private
그 외: static, final, abstract, native, transient, synchronized, volatile, strictfp
접근 제어자는 한번에 하나만 선택해서 사용할 수 있음
1. static - 클래스의 , 공통적인
클래스 변수는 인스턴스에 관계없이 같은 값을 가짐
--> 하나의 변수를 모든 인스턴스가 공유하기 때문
static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭
제어자 | 대상 | 의미 |
static | 멤버변수 | - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 됨 - 클래스변수는 인스턴스를 생성하지 않고도 사용가능함 - 클래스가 메모리에 로드될 때 생성됨 |
메서드 | - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 됨 - static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없음 |
class StaticTest{
static int width = 200; // 클래스 변수
static int height =120; // 클래스 변수
static{ // 클래스 초기화 블럭
}
static int max(int a, int b){ // 클래스 메서드
return a>b ? a:b;
}
}
2. final - 마지막의, 변경될 수 없는
final 은 마지막의 또는 변경될 수 없는 의 의미를 가지고 있고, 거의 모든 대상에 사용될 수 있음
--> 변수에 사용되면 값을 변경할 수 없는 상수가 됨
--> 메서드에 사용되면 오버라이딩을 할 수 없게 됨
--> 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 됨
final 이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수
제어자 | 대상 | 의미 |
final | 클래스 | - 변경될 수 없는 클래스, 확장될 수 없는 클래스가 됨 - final 로 지정된 클래스는 다른 클래스의 조상이 될 수 없음 |
메서드 | 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없음 | |
멤버변수 | 변수 앞에 final 이 붙으면, 값을 변경할 수 없는 상수가 됨 | |
지역변수 |
final class FinalTest { // 조상이 될 수 없는 클래스
final int MAX_SIZE = 10; // 값을 변경할 수 없는 멤버변수 (상수)
final void getMaxSize(){ // 오버라이딩할 수 없는 메서드 (변경불가)
final int LV = MAX_SIZE; // 값을 변경할 수 없는 지역변수 (상수)
return MAX_SIZE;
}
}
3. abstract - 추상의, 미완성의
abstract 가 사용될 수 있는 곳 - 클래스, 메서드
제어자 | 대상 | 의미 |
abstract | 클래스 | 클래스 내에 추상 메서드가 선언되어 있음을 의미함 |
메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림 |
abstract class AbstractTest { // 추상 클래스 (추상 메서드를 포함한 클래스)
abstract void move(); // 추상 메서드 (구현부가 없는 메서드)
}
| 접근 제어자 (access modifier)
접근 제어자는 멤버 또는 클래스에 사용되어,
해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제어하는 역할을 함
접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버벼수, 메서드, 생성자 private 같은 클래스 내에서만 접근이 가능함 default 같은 패키지 내에서만 접근이 가능함 protected 같은 패키지 내에서 그리고 다른 패키지의 자손클래스에서 접근이 가능함 public 접근 제한이 전혀 없음 |
public > protected > (default) > private
순으로 접근 범위가 넓다.
클래스, 멤버변수, 메서드, 생성자에 접근 제어자가 지정되어있지 않다면, 접근 제어자가 default 임
접근 제어자를 이용한 캡슐화
접근 제어자를 사용하는 이유
1. 외부로부터 데이터를 보호하기 위해서
2. 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서
생성자에 접근 제어자를 사용하여 인스턴스의 생성을 제한할 수 있음
| 제어자의 조합
대상 | 사용가능한 제어자 |
클래스 | public, (default), final, abstract |
메서드 | 모든 접근 제어자, final, abstract, static |
멤버변수 | 모든 접근 제어자, final, static |
지역변수 | final |
제어자를 조합해서 사용할 때 주의해야할 사항 1. 메서드에 static 과 abstract 를 함께 사용할 수 없다. static 메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문이다. 2. 클래스에 abstract와 final을 동시에 사용할 수 없다. 클래스에 사용되는 final 은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야한다는 의미이므로 서로 모순되기 때문이다. 3. abstract 메서드의 접근 제어자가 private 일 수 없다. abstract 메서드는 자손클래스에서 구현해주어야하는데 접근 제어자가 private 이면, 자손클래스에서 접근할 수 없기 때문이다. 4. 메서드에 private 과 final을 같이 사용할 필요는 없다. 접근 제어자가 private 인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미가 충분하다. |
'Coding > Java' 카테고리의 다른 글
[Java] char 형 입력받기 (0) | 2021.03.22 |
---|---|
[Java] 인터페이스(interface) (0) | 2021.02.27 |
[Java] 자바 클래스 만들기 문제 풀이 (2) | 2021.02.01 |
[Java] 객체지향언어 - (5) package & import (2) | 2021.02.01 |
[Java] 객체지향언어 (4) - 오버라이딩 (2) | 2021.01.31 |