위의 Book 클래스는 없무 로직(business logic)을 가지지 않는다. 단지 생성자를 선언하고 입력받은 값을 저장하거나 반환하는 메소드만을 가지고 있다. 이처럼 데이터를 전송하기 위해 만든 클래스를 DTO(Data Transfer Object) 또는 VO(Value Object)라고 부른다. 이러한 클래스는 값을 담을 변수와 생성자를 선언하고 getter와 setter만을 가진다. 이러한 클래스에서 변수들은 private 접근 지정자를 갖는 것이 일반적이고, 메소드들은 public으로 선언한다. 이는 해당 객체를 사용하는 사용자가, 객체가 제공하는 기능은 사용할 수 있지만 객체가 가지고 있는 변수에 직접 접근할 수는 없도록 하는 것이다.
StaticTest
static(정적) 멤버는 클래스에 소속되어 있으며 메소드 영역에 존재한다. static이 붙은 변수 혹은 메소드는 해당 클래스가 메모리에 로드될 때 같이 로드되지만, 그렇지 않는 변수나 메소드들은 new 명령어를 통해 생성될때 메모리에 로드된다.
=>
Static Block1
Static Block2
3.14
instance block1
instance block2
instance block1
instance block2
3.141592
3.141592
3.141592
redblue
__________________________
인스턴스 메소드 호출: 30
static 메소드 호출: -10
위 코드를 실행한 결과이다. static block은 클래스가 메모리에 로드될 때, 딱 한번 실행되며 인스턴스 블록은 new()시에 자동으로 실행된다. 생성자와 마찬가지로 순서대로 실행된다.
static으로 선언된 변수 pi는 main메소드에서 Calculator 객체가 생성되기 전에도 이미 메모리에 로드되어있기 때문에 바로 사용이 가능하다. 반면 non-static 변수인 color는 객체를 생성한 후에야 접근할 수 있다.
싱글톤(Singleton)
가끔 전체 프로그램에서 단 하나의 객체로만 만들도록 보장해야 하는 경우가 있다. 단 하나만 생성된다고 해서 이 객체를 싱글톤이라고 한다. 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다. 생성자를 호출한 만큼 객체가 생성되기 때문이다. 생성자를 외부에서 호출할 수 없도록 하려면 생성자 앞에 private 접근 제한자를 붙여주면 된다.
그리고 자신의 타입인 정적 필드(Static Field)를 하나 선언하고, 자신의 객체를 생성해 초기화한다. 참고로 클래스 내부에서는 new 연산자로 생성자 호출이 가능하다. 정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 제한한다. 대신 외부에서 호출할 수 있는 정적 메소드인 getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다.
싱글톤 객체를 생성하는 간단한 코드이다. 외부에서 이 객체를 얻는 유일한 방법은 getInstance()메소드를 호출하는 방법이다. 그리고 getInstance()메소드는 단 하나의 객체만을 리턴하기 때문에 s1와 s2는 동일한 객체를 참조한다.
위의 코드는 교재에서 제공된 Singleton 예제 코드이다.
클래스의 접근 제한
1. default
클래스를 선언할 때 public을 생략했다면 클래스는 default 접근 제한을 가진다. 클래스가 default 접근 제한을 가지게 되면 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없도록 제한한다.
2. public
클래스를 선언할 때 public 접근 제한자를 붙였다면 클래스는 public 접근 제한을 가진다 . 클래스가 public 접근 제한을 가지게 되면 같은 패키지 뿐 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다.
생성자의 접근 제한
객체를 생성하기 위해서는 new 연산자로 생성자를 호출해야 한다. 하지만 생성자를 어디에서나 호출할 수 있는 것은 아니다. 생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다.
1. public
public 접근 제한은 모든 패키지에서 아무런 제한 없이 생성자를 호출할 수 있도록 한다. 생성자가 public 접근 제한을 가진다면 클래스도 public 접근 제한을 가지는 것이 정상적이다. 클래스가 default 접근 제한을 가진다면 클래스 사용이 같은 패키지로 한정되므로, 비록 생성자가 public 접근 제한을 가지더라도 같은 패키지에서만 생성자를 호출할 수 있다.
2. protected
protecte 접근 제한은 default 접근 제한과 마찬가지로 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있도록 한다. 차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식클래스라면 생성자를 호출할 수 있다.
3. default
생성자를 선언할 때 public 또는 private를 생략했다면 생성자는 default 접근 제한을 가진다. default 접근 제한은 같은 패키지에서는 제한 없이 생성자를 호출할 수 있으나 다른 패키지에서는 생성자를 호출할 수 없도록 한다.
4. private
private 접근 제한은 동일 패키지이건 다른 패키지이건 상관없이 생성자를 호출하지 못하도록 제한한다. 따라서 클래스 외부에서 new 연산자로 객체를 만들 수 없다. 오로지 클래스 내부에서만 생성자를 호출하고 객체로 만들 수 있다.
필드와 메소드의 접근 제한자
1. default
default는 현재 패키지에서만 사용가능하다. 필드와 메소드를 선언할 때 public 또는 private를 생략했다면 자동으로 default 접근 제한을 가진다. 같은 패키지 내에서는 아무런 제한 없이 필드와 메소드를 사용할 수 있으나, 다른 패키지에서는 필드와 메소드를 사용할 수 없도록 한다.
2. protected
protected 접근 제한은 default 접근 제한과 마찬가지로 같은 패키지에 속하는 클래스에서 필드와 메소드를 사용할 수 있도록 한다. 차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 필드와 메소드를 사용할 수 있다. 즉 다른 패키지에서 접근하려면 해당 패키지를 상속받아야 한다.
3. public
public접근 제한은 모든 패키지에서 아무런 제한 없이 필드와 메소드를 사용할 수 있도록 한다. 필드와 메소드가 public 접근 제한을 가질 경우 클래스도 public 접근 제한을 가져야 한다. 클래스가 default 접근 제한을 가지게 되면 같은 패키지 안에서만 클래스가 사용되기 때문이다.
4. private
private 접근 제한은 동일 패키지이건, 다른 패키지이건 상관없이 필드와 메소드를 사용하지 못하도록 제한한다. 오로지 클래스 내부에서만 사용할 수 있다.
'JAVA' 카테고리의 다른 글
Java - If 문의 사용 (0) | 2021.03.29 |
---|---|
클래스와 메소드 예제 1 (0) | 2021.03.18 |
자바로 숫자야구(Bulls and Cows)게임 만들기 (0) | 2021.03.17 |
자바- 조건문과 반복문 (0) | 2021.03.13 |
자바의 기초 (1) | 2021.03.13 |