[Java] OOP_제어자(Modifier)[static, final, abstract], 접근제어자(access modifier)
제어자(Modifier)
클래스와 클래스의 멤버(멤버 변수, 메소드)에 부가적인 의미 부여한다.(영어 : 형용사와 비슷)
크게 접근 제어자와 그 외 제어자로 나눌 수 있다.
접근 제어자(Access Modifier) 외 제어자(Modifier)
하나의 대상에 제어자를 여러개 사용할 수 있으나 접근 제어자는 한번만 사용 가능하다.
public class Modifier {
public static final int WIDTH = 200;
//public : 접근제어자 - 제일 앞에 붙임
//static, final : 제어자들
public static void main(String[] args) {
System.out.println("WIDTH = "+WIDTH);
}
}
static
- 멤버변수와 메소드, 초기화 블럭에 사용 가능
클래스와 클래스의 멤버(멤버 변수, 메소드)에 부가적인 의미 부여한다.(영어 : 형용사와 비슷)
크게 접근 제어자와 그 외 제어자로 나눌 수 있다.
하나의 대상에 제어자를 여러개 사용할 수 있으나 접근 제어자는 한번만 사용 가능하다.
public class Modifier {
public static final int WIDTH = 200;
//public : 접근제어자 - 제일 앞에 붙임
//static, final : 제어자들
public static void main(String[] args) {
System.out.println("WIDTH = "+WIDTH);
}
}
1) static - 대상 : 멤버변수
모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다,
클래스 변수는 인스턴스 생성하지 않고 사용 가능하다,
클래스가 메모리에 로드될 때 생성된다.
2) static - 대상 : 메소드
인스턴스를 생성하지 않고 호출이 가능한 static 메소드가 된다,
static 메소드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
class StaticTest {
staic int width = 200; //클래스 변수(static 변수)
static int height = 120; //클래스 변수(static 변수)
static { //클래스 초기화 블럭
//static변수의 복잡한 초기화 수행
}
static int max(int a, int b) { //클래스 메소드(static 메소드) - iv 사용불가
return a>b ? a:b;
}
}
final
- 클래스 메소드, 멤버변수, 지역변수에 사용 가능
1) final - 대상 : 클래스
변경될 수 없는 클래스, 확장될 수 없는 클래스.
final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
//대표적으로 String, Math 있음
2) final - 대상 : 메소드
변경될 수 없는 메소드.
final로 지정된 메소드는 오버라이딩을 통해 재정의될 수 없다.
3) final - 대상 : 멤버변수/지역변수
변수 앞에 final이 붙으면 더이상 값을 변경할 수 없는 상수가 된다.
final class FinalTest { // 조상이 될 수 없는 클래스
final int MAX_SIZE = 10; // 값을 변경할 수 없는 멤버변수(상수)
final void getMaxSize() { // 오버라이딩 할 수 없는 메소드(변경불가)
final int LV = MAX_SIZE; //값을 변경할 수 없는 지역변수(상수)
return MAX_SIZE;
}
}
class Child extends FinalTest {
void getMaxSize() {} // 에러 : 오버라이딩 불가
}
- 생성자를 이용한 final 멤버변수 초기화
:final이 붙은 변수는 상수로 보통은 선언과 초기화를 동시에 한다.
그러나 인스턴스마다 고정값을 갖는 인스턴스 변수의 경우 생성자에서 초기화된다.
abstract
- 추상화 파트에서 더 자세히 배울 예정
- 클래스와 메소드에 사용 가능
1) abstract - 대상 : 클래스
클래스 내 추상메소드가 선언되어 있음을 의미한다.
2) abstract - 대상 : 메소드
선언부만 작성하고 구현부는 작성하지 않은 추상메소드라는 사실을 알린다. (구현부=몸통={})
abstract class AbstractTest { // 추상클래스 - 추상 메소드를 포함한 클래스
abstract void move(); // 추상메소드 - 구현부가 없는 메소드
}
AbstractTest a = new AbstractTest(); //에러 : 추상 클래스의 인스턴스 생성 불가 (추상클래스=미완성설계도, 인스턴스=제품, 미완성 설계도로는 제품을 못 만든다!)
접근 제어자(access modifier)
멤버 또는 클래스에 사용되어, 외부로부터 접근을 제한한다.
- 멤버변수와 클래스, 메소드, 생성자에 사용 가능
- (default) - 아무것도 붙이지 않는 것을 뜻한다
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전 체 |
---|---|---|---|---|
public | o | o | o | o |
protected | o | o | o | |
default | o | o | ||
private | o |
public - 접근 제한이 전혀 없다.
protected - 같은 패키지 내, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
(default) - 같은 패키지 내에서만 접근이 가능하다.
private - 같은 클래스 내에서만 접근이 가능하다.
접근 가능한 범위 : public > protected > (default) > private
public class AcessModifier { // public이나 (default) 둘 중 하나 붙일 수 있음
int iv; // 멤버변수(인스턴스 변수)
static int iv; // 멤버변수(클래스 변수)
void method() {}
//위 3 멤버들에는 4가지를 붙일 수 있음 public, (default), protected, private
}
접근 제어자를 이용한 캡슐화
접근 제어자를 사용하는 이유
: 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인 메소드는 오버라이딩이 불가능하다. 둘 중 하나만 사용해도 충분
Author And Source
이 문제에 관하여([Java] OOP_제어자(Modifier)[static, final, abstract], 접근제어자(access modifier)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jeong11/Java-OOP-modifier-acessmodifier저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)