hrming

[Java/복습] 객체지향 프로그래밍 4 본문

Java/복습

[Java/복습] 객체지향 프로그래밍 4

hrming 2023. 6. 24. 14:17

1. 제어자 (modifier)

클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.  

1-1. 접근 제어자 : public, protected, default, private

1-2. 기타 제어자 : public, final, abstract, native, transient, synchronized, volatile, strictfp

 

: 제어자는 클래스나 멤버변수와 메서드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다. 단, 접근 제어자는 한 번에 네 가지 중 하나만 선택해서 사용할 수 있다.

 


1-1. 접근 제어자 (access modifier)

객체 지향에서 정보 은닉(data hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념이다.

그렇게 함으로써 사용자는 언제나 최소한의 정보만으로 프로그램을 손쉽게 사용할 수 있게 된다.

자바에서는 이러한 정보 은닉을 위해 접근 제어자(access modifier)라는 기능을 제공하고 있다.

접근 제어자를 사용하면 클래스 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보 은닉을 구체화할 수 있습니다. 

 

자바에서는 다음과 같은 네 가지의 접근 제어자가 있다. 

 

① private

 private 멤버는 해당 멤버를 선언한 클래스에서만 접근할 수 있다.

즉, 자바 프로그램은 private 멤버에 직접 접근할 수 없으며, 해당 객체의 public 메소드를 통해서만 접근할 수 있습니다.

따라서 private 멤버는 public 인터페이스를 직접 구성하지 않고, 클래스 내부의 세부적인 동작을 구현하는 데 사용됩니다.

 


public

자바에서 public 멤버는 프로그램 어디에서 누구나 접근할 수 있다.

자바 프로그램은 public 메소드를 통해서만 해당 객체의 private 멤버에 접근할 수 있습니다.

따라서 public 메소드는 private 멤버와 프로그램 사이의 인터페이스(interface) 역할을 수행한다고 할 수 있습니다.

 

 

default

자바에서는 클래스 및 클래스 멤버의 접근 제어의 기본값으로 default 접근 제어를 별도로 명시하고 있다.

이러한 default를 위한 접근 제어자는 따로 존재하지 않으며, 접근 제어자가 지정되지 않으면 자동적으로 default 접근 제어를 가지게 된다. 

default 접근 제어를 가지는 멤버는 같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근할 수 있다.

 

 

protected

protected 멤버는 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급된다.

 

클래스의 protected 멤버에 접근할 수 있는 영역은 다음과 같다.

  - 이 멤버를 선언한 클래스의 멤버

  - 이 멤버를 선언한 클래스가 속한 패키지의 멤버

  - 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버

 

1-1. 접근 제어자의 접근 범위 public > protected > default > private

 


1-2. 기타 제어자

final 제어자 - 클래스, 메서드, 필드*, 지역변수에 사용 가능

(클래스의 필드란 클래스에 포함된 변수를 의미하며, 선언된 위치에 따라 클래스 변수, 인스턴스 변수, 지역 변수)

 

: 자바에서 final 제어자는 '변경할 수 없다'는 의미로 사용된다.

: 즉, 필드나 지역 변수에 사용하면 값을 변경할 수 없는 상수(constant)가 된다. 

또한, 클래스에 사용하면 해당 클래스는 다른 클래스가 상속받을 수 없게 된다.

메소드에 사용하면 해당 메소드는 오버라이딩(overriding)을 통한 재정의를 할 수 없게 된다.

 

static 제어자 - 메소드, 필드, 초기화 블록에 사용 가능

(클래스의 필드란 클래스에 포함된 변수를 의미하며, 선언된 위치에 따라 클래스 변수, 인스턴스 변수, 지역 변수)

 

: 자바에서 static 제어자는 '공통적인'이라는 의미로 사용됩니다.

: 즉, static 제어자를 변수에 사용하면 해당 변수를 클래스 변수로 만들어 줍니다.

또한, 메소드에 사용하면 해당 메소드를 클래스 메소드로 만들어 줍니다.

이러한 static 제어자는 초기화 블록에도 사용할 수 있습니다.

static 제어자를 가지는 멤버가 가지는 특징
-  프로그램 시작시 최초에 단 한 번만 생성되고 초기화된다.
-  인스턴스를 생성하지 않고도 바로 사용할 수 있게 된다.
-  해당 클래스의 모든 인스턴스가 공유한다.

 

abstract 제어자 

자바에서 abstract 제어자는 '추상적인'이라는 의미로 사용된다.

 

선언부만 있고 구현부가 없는 메소드를 추상 메소드라 하며, 반드시 abstract 제어자를 붙여야 합니다.

또한, 하나 이상의 추상 메소드가 포함하고 있는 추상 클래스도 반드시 abstract 제어자를 붙여야 합니다.

 

1-3. 제어자의 조합

자바에서는 접근 제어자와 기타 제어자를 한 대상에 함께 사용할 수 있다. 다만, 모든 경우가 가능한 것은 아니며, 대상에 따라 사용할 수 있는 조합은 다음과 같다. 

또한, 자바에서는 제어자의 특성상 몇몇 제어자는 함께 사용할 수 없다. 

 

클래스에 final과 abstract는 함께 사용할 수 없다.

: final 제어자를 가지는 클래스는 다른 클래스가 상속받을 수 없게 되며, abstract 제어자를 가지는 클래스는 다른 클래스가 상속해서 오버라이딩해야만 사용할 수 있으므로, 이 두 제어자는 클래스에 함께 사용할 수 없다.

 

 메소드에 static과 abstract는 함께 사용할 수 없습니다.

: abstract 제어자를 가지는 메소드는 선언부만 있고 구현부가 없는 메소드인데, static 제어자를 가지는 메소드는 인스턴스를 생성하지 않고도 바로 사용할 수 있어야 하므로, 이 두 제어자는 메소드에 함께 사용할 수 없다.

 

메소드에 private과 abstract는 함께 사용할 수 없다.

: abstract 제어자를 가지는 메소드는 다른 클래스가 상속하여 오버라이딩해야만 사용할 수 있는데, private 제어자를 가지는 메소드는 자식 클래스에서 접근할 수 없게 되므로, 이 두 제어자는 메소드에 함께 사용할 수 없다.

 

④ 메소드에 private과 final은 함께 사용할 필요가 없다.

: 메소드에 사용된 final 제어자와 private 제어자는 모두 해당 메소드가 오버라이딩을 통한 재정의를 할 수 없다는 의미를 가지므로, 둘 중에 하나만 사용해도 의미가 충분히 전달될 수 있다.

 

 

 

참고 😎

1. 자바의 정석

2. http://www.tcpschool.com/java/java_modifier_accessModifier

3. http://www.tcpschool.com/java/java_member_field

 

Comments