HeYStRanGeR
article thumbnail

(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 인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미가 충분하다.

 

 

 

 

 

 

 

 

728x90
profile

HeYStRanGeR

@HeYStRanGeR

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!