상세 컨텐츠

본문 제목

[JAVA] 접근제어자 및 Protected에 대한 고찰

Spring/JAVA

by Chan.94 2023. 3. 14. 22:32

본문

반응형

접근제어자

클래스의 멤버인 변수와 메서드들의 접근 권한을 지정한다.

 

public > protected > default > private (허용 : O, 제한 : X)
접근자 클래스 내부 패키지 상속받은 클래스 이외의 영역
private O X X X
default O O X X
protected O O O X
public O O O O

 

접근제어자 사용이유

  • 1) 의도치 않은 실수를 줄이기 위함
    객체를 사용하는 입장에서 객체 내부적으로 사용하는 변수나 메서드에 접근함으로써 개발자가 의도하지 못한 오동작을 일으키기도 한다. 이러한 문제로부터 객체의 로직을 보호하기 위해서는 멤버에 따라서 외부의 접근을 허용하거나 차단해야 할 필요가 생긴다.

  • 2) 개발자들의 커뮤니케이션 
    개발은 협업이기 때문에 다른 개발자와의 커뮤니케이션이 중요하다. 코드로서 개발자 간의 커뮤니케이션이 일어나는 것이다.
    A라는 변수를 private로 선언하였다면 다른 개발자는 A라는 변수는 해당 객체를 사용할 때 중요한 변수라는 것을 개치 할 수 있을 것이다. 만약 모든 변수와 메서드를 public으로 개발한다면 다른 개발자가 내가 만든 중요한 변수나 메서드를 무분별하게 사용하여 값을 변경할 수 있게 된다. 이러한 경우 프로그램의 오동작을 발생시킨다. 이렇게 중요한 변수와 메서드에 접근 제어자를 이용해 사용 범위를 지정해 주면 완성도가 높은 프로그램을 완성할 수 있다.

  • 3) 정보 은닉
    사용자에게 객체를 조작할 수 있는 수단만을 제공함으로써 결과적으로 객체의 사용에 집중할 수 있도록 돕기 위함이다.

Protected

위에서 설명한 개발자들의 커뮤니케이션에 대해 더 깊게 생각해보려 한다.

 

메서드에 정의된 접근 제어자를 생각해 보자.

private 메서드는 객체 내에서만 사용할 수 있다. 다른 메서드에서 호출되어 사용되는 메서드라는 메시지를 준다.

public 메서드는 어떤 곳에서도 사용할 수 있다. 개발이 완료되어 다른 곳에서 사용할 수 있다는 메시지를 준다.

 

private와 public은 용도가 명확하여 접근제어자에 대한 개념만 있다면 느낌적으로 위의 내용을 알고 있었을 것이다.

그렇다면 protected는 다른 개발자에게 어떤 메시지를 주는 것일까

 

protected는 상속받은 클래스에서 사용할 수 있다. 상속을 받은 객체에서 Override 해야 하는 가능성을 열어둔 것이라는 메시지를 주는 것이다.

잠재적으로 자식 클래스가 Override 해서 바꾸어야 할 경우를 고려한 modifier이다. 
즉, '완성되지 못한 혹은 완성될 수 없다'라는 메시지를 주는 것이다.
클래스를 디자인한 개발자가 이 메서드에 대해서 앞으로 더 구현할 것이 남았다거나 혹은 디자인 콘셉트로서 일부러 완성시키지 않은 경우 둘 다를 의미할 수 있다. 

 

Example

public class Bird {
	public void move() {
		System.out.println("running");
	}
	protected void moveFast() {
		System.out.println("flying");
	}
}

/**
 * 타조
 */
public class Ostrich extends Bird{
	@Override
	protected void moveFast() {
		//super.moveFast();
		System.out.println("fast running");
	}
}

대부분의 새는 빠르게 이동할 때 날아서 이동한다. 타조는 새의 한 종류이지만 날 수가 없다. 빠르게 이동할 때는 빠르게 뛸 것이다. 타조의 경우는 moveFast() 메서드를 수정해야 한다는 뜻이다. 

Bird클래스의 moveFast() 메서드의 protected 키워드를 통해서, 이 함수가 바뀔 경우가 존재할 수 있음을 짐작할 수 있는 것이다.

 

Abstract와 protected의 용도상 차이점

abstract 메서드는 abstract로 선언된 클래스의 구현부를 일부러 비워놓아서, 그것을 상속하는 클래스는 반드시 해당 메서드를 구현해주어야 하는 방식이다. 부모클래스는 그 자체로는 존재할 수 없고, 단지 추상적인 개념일 뿐이다. 실제 세상에 태어나는(instance)것은  자식 클래스에 의해서 이루어지기 때문에,  자식 클래스는 반드시 abstract를 구현해야만 한다.

  • abstract
    abstract로 선언된 클래스의 구현부를 일부러 비워놓아서, 그것을 상속하는 클래스는 반드시 해당 메서드를 구현해주어야 하는 방식이다. 부모클래스는 그 자체로는 존재할 수 없고, 단지 추상적인 개념일 뿐이다. 실제 세상에 태어나는(instance)것은  자식 클래스에 의해서 이루어지기 때문에,  자식 클래스는 반드시 abstract를 구현해야만 한다.

  • protected
    구현된 메서드는 반드시 자식클래스가 Override를 해야 할 필요가 없다. 대부분의 경우에는 상속하는 클래스가 직접 구현할 필요는 없지만, 그래도 특수한 상황에서는 protected로 선언된 메서드는 Override 해서 처리해야 할 수도 있음을 개발자에게 알려주는 것이다.

 

Reflection을 사용한 protected 메서드 실행

Reflection을 사용하여 protected 필드와 메서드에 접근할 수 있다. 

  • getDeclaredMethod() 메서드를 사용하여 해당 메서드에 대한 Method 객체를 가져온다.
  • setAccessible() 메서드를 호출하여 접근 가능하도록 설정한다.
  • invoke() 메서드를 호출하여 해당 메서드를 실행한다.

Reflection을 사용하여 protected 메서드에 접근할 수 있지만 보안에 취약한 코드를 만들 수 있으므로, 주의해서 사용해야 한다.

반응형

관련글 더보기

댓글 영역

>