[Java] 객체 지향 - 3

2024. 8. 9. 16:22Java/객체지향

정적 멤버

자바는 클래스 로더를 이용해서 클래스를 메소드 영역에 저장하고 사용한다. 정적 멤버란 메소드 영역의 클래스에 고정적으로 위치하는 멤버를 말한다. 정적 멤버는 객체를 생성할 필요가 없이 클래스를 통해 사용이 가능하다. 

필드와 메소드는 모두 정적 멤버가 될 수 있다. 이를 선언하려면 static만 붙이면 된다. 공용적인 필드는 정적으로 선언하는 것이 좋다. 인스턴트 필드를 이용하지 않는 메소드는 정적 메소드로 선언하는 것이 좋다. 

public class 클래스{
	static 타입 필드[=초기값];
    
    static 리턴타입 메서드(매개변수 ...) {}
}

 

클래스가 메모리로 로딩되면 정적 멤버는 바로 사용할 수 있다. 클래스 이름과 도트(.) 연산자로 접근할 수 있다. 정적 필드와 메서드는 객체 참조 변수로도 접근이 가능하지만 클래스 이름으로 접근하면 경고 표시가 나온다. 

 

정적 블록

정적 필드는 생성자 없이 필드 선언과 동시에 초기값을 주는 것이 일반적이다. 

static double pi = 3.141592;

 

인스턴트 멤버 사용 불가

정적 메서드와 정적 블록은 객체가 없어도 실행되어 인스턴트 필드나 인스턴트 메서드를 사용할 수 없다. this도 사용할 수 없다. 정적 메서드를 사용하고 싶으면 객체를 먼저 생성해야 한다. 

static void Method(){
	ClassName obj = new ClassName();
    obj.field = 10;
    obj.method();
}

main()도 정적 메서드이므로 객체 생성 없이 인스턴트 필드와 메서드를 바로 사용할 수 없다. 

 

final 필드와 상수

인스턴트 필드값은 언제든지 변경할 수 있는데 이를 막기 위해서 final을 사용 가능하다. final로 선언되면 초기값이 최종적인 값이 된다. 필드 선언 시에 초기값을 대입하거나 생성자에서 초기값을 무조건 대입해야한다. 

final 타입 필드[=초기값];

 

상수선언

불변의 값을 저장하는 필드를 상수라고 한다. 상수는 객체마다 저장할 필요가 없고 여러 개의 값도 가질 수 없기 때문에 static이면서 final인 특성을 가진다. 

static final 타입 상수[=초기값];

 

초기값은 선언 시에 주는 것이 일반적이지만, 정적 블록에서 초기화할 수 있다. 상수 이름은 모두 대문자로 작성하고 _를 사용할 수 있다. 상수는 정적 필드라 '클래스명.상수'로 접근해서 읽는다. 

 

접근제한자

중요한 필드와 메소드가 외부로 노출되지 않도록 해 객체의 무결성을 유지하기 위해서 접근 제한자를 사용한다. 클래스의 접근 제한자에 따라 사용 가능 여부가 결정된다. 

 

 

Getter와 Setter

메서드를 통해 필드에 접근하여 데이터를 검증하여 유효한 값만 필드에 저장하도록 할 수 있다. 참고로 boolean은 get이 아니라 is로 시작하는 것이 관례이다. 

 

싱글톤 패턴

애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶으면 싱글톤 패턴을 적용할 수 있다. 싱글톤 패턴의 핵심은 private 접근 제한하여 외부에서 new 연산자로 생성자를 호출할 수 없도록 막는다. 

 

싱글톤 패턴은 싱글톤 패턴이 제공하는 정적 메서드를 통해 간접적으로 객체를 얻을 수 있다. 

외부에서 객체를 얻을 방법은 getInstance 메서드를 호출하는 것 뿐이다. 따라서 변수를 달리해서 참조하는 객체는 동일한 객체가 된다. 

'Java > 객체지향' 카테고리의 다른 글

[Java] 인터페이스  (0) 2024.08.15
[Java] 상속 2  (0) 2024.08.14
[Java] 객체 지향 연습 정답  (0) 2024.08.13
[Java] 객체 지향 연습 문제  (0) 2024.08.13
[Java] 객체 지향 - 1  (0) 2024.08.05