자바-제어자(modifier)

Chan Young Jeong·2023년 1월 18일
0

All About JAVA

목록 보기
1/10
post-thumbnail

제어자

클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
접근 제어자: public, protected , (default) , private
그 외: static, final, abstract, native, transient, synchronized, volatile, strictfp

  • 하나의 대상에 여러 제어자를 같이 사용가능!(접근 제어자는 하나만, 순서는 상관 없음)
public class Test{
	public static final int WIDTH = 200;
    public static void main(String[] args){
    	System.out.println(WIDTH);
    
    }
}

static - 클래스의, 공통적인

멤버변수

  • 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
  • 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
  • 클래스가 메모리에 로드될 때 생성된다.

메서드

  • 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
  • static 메서드 내에서는 인스턴스 멤버, 인스턴스 메소드들을 직접 사용할 수 없다.
    (인스턴스 멤버, 메서드들은 객체가 만들어져야 사용할 수 있기 때문에)
class StaticTest{

	static int width = 100;
    static int height = 120;
    
    static {
    	// static 변수의 복잡한 초기화 수행
    }
    
    static int max(int a, int b){
    	return a>b ? a : b; 
    }



}

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

클래스

  • 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
    예)
    String-> 보안 문제 때문에. 패스워드가 String일 때 상속 받으면 조상 멤버 변수에 접근할 수 있기 때문,
    Math 클래스 -> static 메서드 집합이라서 굳이 상속받을 필요 없기 때문.

메서드

  • 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.

멤버변수, 지역변수

  • 변수 앞에 final이 붙으면 값을 변경할 수 없는 상수가 된다.
final class FinalTest{ // 조상이 될 수 없는 클래스
	
    final int MAX_WIDTH = 100; // 값을 변경할 수 없는 멤버변수
    
    final void getMaxSize(){ // 오버라이딩이 불가능한 메서드
    
    	final int PIE = 3.14; // 값을 변경할 수 없는 지역변수
        
    }

}

abstract - 추상의, 미완성의

클래스

  • 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.

  • 추상 클래스의 인스턴스 생성 불가! -> 추상 클래스를 상속 받아서 완전한 클래스를 만든 후에 객체를 생성할 수 있다!

  • 추상 클래스 : 추상 메서드를 하나라도 가지고 있는 클래스
    cf) 인터페이스 : 추상 메서드만 존재하는 클래스

추상 클래스 vs 인터 페이스

추상 클래스와 인터 페이스는 상속 받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메서드를 구현하도록 강제한다!

의문점? 결국 추상 메서드를 구현하는 건데 굳이 인터페이스가 있어야 하나?
-> 링크로 이동!

메서드

  • 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
abstract class AbstractTest{ // 추상 클래스(추상 메서드를 포함한 클래스)

    abstract void move(); // 추상 메서드(구현부가 없는 메서드)

}

AbstractTest a = new AbstractTest(); // 에러. 추상 클래스의 인스턴스 생성불가

접근 제어자

private

: 같은 클래스 내에서만 접근이 가능하다

(defalut) 아무것도 붙이지 않음

: 같은 패키지 내에서만 접근이 가능하다.

protected

: 같은 패키지 내에서. 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다.

public

: 접근 제힌이 없다.

<범위에 따라>

<대상에 따라>

참고) public class 이름이랑 소스 파일 이름은 같아야함. 그리고 public class는 한 소스 코드에 한 개만 존재해야함. 가독성 때문.

패키지 : pkg1

// MyParent.java

package pkg1

public class MyParent{

	private int prv;
    		int dft;
    protected int prt;
    public int pub;
    
    public void printMembers(){
    	System.out.println(prv);  // ok , 같은 클래스
        System.out.println(dft);  // ok , 같은 패키지
        System.out.println(prt);  // ok , 같은 패키지 + 자손
        System.out.println(pub);  // ok , 접근제한 없음. 
    }

}

class MyParentTest{

	public static void main(String[] args){
    
    	MyParent p = new MyParent();
        
        System.out.println(p.prv);  // 에러 같은 클래스 내에서만 사용가능
        System.out.println(p.dft);  // ok
        System.out.println(p.prt);  // ok
        System.out.println(p.pub);  // ok
        
    }

}

패키지 : pkg2

// MyParentTest2.java

package pkg2

class MyChild extends pkg1.MyParent{ 
    
    public void printMembers(){
    	System.out.println(prv);  // 에러 , 같은 클래스에서만
        System.out.println(dft);  // 에러 , 같은 패키지에서만
        System.out.println(prt);  // ok , 같은 패키지 + 자손(다른 패키지)
        System.out.println(pub);  // ok , 접근제한 없음.
    }

}

public class MyParentTest2{

	public static void main(String[] args){
    
    	MyParent p = new MyParent();
        
        System.out.println(p.prv);  // 에러 
        System.out.println(p.dft);  // 에러
        System.out.println(p.prt);  // 에러, 다른 패키지에다가 자손도 아니기 때문.
        System.out.println(p.pub);  // ok
        
    }

}

출처

자바의 정석 - 남궁성의 정석코딩(유튜브)
https://brunch.co.kr/@kd4/6
https://all-record.tistory.com/53 - 이미지 출처

0개의 댓글