Programming Lang/Java

[Java] Package, Modifier

haema_dev 2022. 9. 10. 02:45

제어자란?

package (패키지)
related group of things when they are offered together as a single unit
단일 단위로 함께 제공될 때 관련된 사물 그룹
modifier (수식어, 제어자)
a word or phrase that is used with another word or phrase to limit or add to its meaning
그 의미를 제한하거나 더하기 위해 다른 단어나 구와 함께 사용되는 단어나 구

 

패키지

package com.practice;

소스의 가장 첫 줄에 있어야만 한다.

파일 하나에 반드시 하나만 존재해야 한다.

파일이 위치한 폴더명과 같아야 한다.

예약어를 사용할 수 없다.

 

import

import java.util.*; // * 은 모두(all)를 의미한다.
import static org.assertj.core.api.Assertions.*; // static 변수나 메소드를 호출할 수도 있다.

패키지 아래에 적어준다.

여러 개를 사용할 수 있다.

 

접근 제어자

  • public :  누구나 접근 가능
  • protected :  같은 패키지 내에 있거나 상속받은 경우 접근 가능
  • default (= package-private) :  같은 패키지 내에 있을 때만 접근 가능. 아무것도 적어주지 않으면 default.
  • private 해당 클래스 내에서만 접근 가능

 

그 외의 자주 사용하는 것들

  • static
  • final
  • abstract
  • synchronized
  • transient

 

 

Q. 여러 개는 사용할 수 없는 건가?

A. 그렇지 않다.

 

접근제어자를 제외한 나머지는 조합하여 사용할 수 있고 순서 또한 상관이 없다.

static final double PIE1 = 3.14;
final static double PIE2 = 3.14;

 

그 밖의 것들

native, volatile, strictfp ……

 

 

static (클래스의, 공통적인)

static 멤버변수

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

 

static 메서드

  • 인스턴스 생성하지 않고 호출 가능
  • static 내에서는 인스턴스 멤버 직접 사용 불가능

 

static 이 사용될 수 있는 곳

  • 멤버변수
  • 메서드
  • 초기화블럭
class Main {
    public static void main(String[] args) {
        /** new 연산자를 사용하지 않고 메소드를 호출하려고 했을 때 */
        //MySum.add(num1, num2); // Non-static method 'add()' cannot be referenced from a static context
        MySum.addStatic();

        /** new 연산자를 사용해서 객체 생성 후, 메소드를 호출하려고 했을 때 */
        MySum ms = new MySum();
        ms.add();
        ms.addStatic();
    }
}
class MySum{
    void add() {  }
    static void addStatic() {  }
}

static 은 객체 생성 없이 사용하기 위한 목적으로 쓴다.

객체를 생성하기 위해서는 생성자가 필요하고, 생성자는 new 연산자에 의해 호출된다.

ststic 으로 선언 된 addStatic() 은 객체 생성 없이 사용할 수 있는 것을 확인할 수 있다.

 

 

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

final 클래스

  • 변경 및 확장 불가능한 클래스
  • 상속 불가능

 

final 메서드

  • 변경 불가능한 메서드
  • 오버라이딩 불가능

 

final 멤버변수, final 지역변수

  • 변경 불가능한 상수

 

final 이 사용될 수 있는 곳

  • 클래스
  • 메서드
  • 멤버변수
  • 지역변수
// String class
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    		.
		.

final 이 붙는 변수는 상수라고 부른다.

고정 값을 쓰기 위함이며, 위와 같이 String 을 상속 받을 수 없도록 막아둔 것을 확인할 수 있다.

 

 

abstract (추상적인)

abstract 클래스

  • 추상 메서드를 포함하고 있다. (선언부 o, 구현부 x)
  • 일반클래스와 똑같이 생성자, 멤버변수, 메서드를 가질 수 있다. (선언부 o, 구현부 o)
  • 추상클래스는 반드시 일반클래스에서 상속받아 구현해주어야 한다.

 

abstract 메서드

  • 선언부만 존재하고, 구현부는 없다.

 

abstract 이 사용될 수 있는 곳

  • 클래스
  • 메서드

 

 

synchronized (동기화 된)

synchronized 메서드

  • 메서드 전체가 임계영역으로 설정된다.
  • 한 쓰레드가 작업이 끝나기 전까지 다른 쓰레드의 방해를 받지 않도록 lock을 건다.

 

synchronized 가 사용될 수 있는 곳

  • 참조변수
  • 메서드

 

 

더보기

참고자료 : 자바의 정석, 자바의 신
(+개인 생각)