[Java의 정석]Chapter7.객체지향 프로그래밍2(21~23)

Hello_Wendy·2022년 4월 27일
0

자바의 정석

목록 보기
55/61
post-thumbnail

Chapter 7. 객체지향 프로그래밍 2

21. 접근 제어자(access modifier)

  • 접근 제어자 : 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할
  • 접근 제어자가 default임을 알리기 위해 실제로 default를 붙이지는 않지만, 클래스나 멤버변수, 메서드, 생성자에 접근 제어자가 지정되어 있지 않다면, 접근 제어자가 default임을 뜻함

    접근 제어자가 사용될 수 있는 곳 = 클래스, 멤버변수, 메서드, 생성자
    private : 같은 클래스 내에서만 접근이 가능
    (default) : 같은 패키지 내에서만 접근이 가능
    접근 제어자가 default라는 것은 아무런 접근 제어자도 붙이지 않는 것을 의미
    protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
    public : 접근 제한 전혀 없음

🐣 접근 범위가 넓은 쪽에서 좁은 쪽의 순으로 왼쪽부터 나열
      public > protected > (default) > private

제어자같은 클래스같은 패키지자손클래스전체영역
publicOOOO
protectedOOO
(default)OO
privateO

22. 캡슐화와 접근 제어자

  • 클래스나 멤버, 주로 멤버에 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위함
  • 데이터가 유효한 값을 유지하도록, 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터의 접근을 제한하는 것이 필요함
  • 이것을 데이터 감추기(data hiding)라고 하며, 객체지향개념의 캡슐화(encapsulation)에 해당하는 내용
  • 또 다른 이유는 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버변수나 부분작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추기 위함
  • 외부에서 접근할 필요가 없는 멤버들을 private으로 지정하여 외부에 노출시키지 않음으로써 복잡성을 줄일 수 있음. 이것 역시 캡슐화에 해당

    접근 제어자를 사용하는 이유
    1.외부로부터 데이터를 보호하기 위함
    2.외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위함

public class Time {
	public int hour;
    public int minute;
    public int second;
}
: 시간을 표시하기 위한 클래스 Time이 위와 같이 정의되어 있을 때
이 클래스의 인스턴스를 생성한 다음, 멤버변수에 직접 접근하여 값을 변경할 수 있음 (아래와 같이)
Time t = new Time();
t.hour = 25; //멤버변수에 직접 접근

:멤버변수에 잘못된 값을 지정하는 것을 막기 위해, 멤버변수를 privateprotected로 제한하고
멤버변수의 값을 읽고 변경할 수 있는 public메서드를 제공함으로써 
간접적으로 멤버변수의 값을 다룰 수 있도록 하는 것이 바람직함

23. 다형성(polymorphism)

  • 다형성 : 여러 가지 형태를 가질 수 있는 능력
  • 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현
  • 즉, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 함
class Tv {
	boolean power; //전원상태(on/off)
    int channel; //채널
    
    void power() { power = ! power; }
    void channelUp() { ++channel; }
    void channerlDown() { --channel; }
}

class SmartTv extends Tv {
	String text; //캡션(자막)을 보여 주기 위한 문자열
    void caption() { /*내용생략*/ }
}
  • 인스턴스의 타입이 참조변수의 타입이 일치하는 것이 보통
ex) 
Tv t = new Tv();
SmartTv s = new SmartTv();
  • Tv와 SmartTv클래스가 서로 상속관계에 있을 경우, 다음과 같이 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는 것도 가능
Tv t = new SmartTv(); 
//타입 불일치. 조상 타입의 참조변수로 자손 인스턴스를 참조
  • 인스턴트를 같은 타입의 참조변수로 참조하는 것과 조상타입의 참조변수로 참조하는 것은 어떤 차이가 있는지 아래에서 확인해보자
SmartTv s = new SmartTv(); //참조변수와 인스턴스의 타입이 일치
Tv t = new SmartTv(); //조상타입 참조변수로 자손 타입 인스턴스를 참조
  • 위의 코드에서 SmartTv인스턴스 2개를 생성하고, 참조변수 s와 t가 생성된 인스턴스를 하나씩 참조. 이 경우 실제 인스턴스가 SmartTv타입이라 할지라도, 참조변수 t로는 SmartTv인스턴스의 모든 멤버를 사용할 수 없음

▶Tv타입의 참조변수로는 SmartTv인스턴스 중에서 Tv클래스의 멤버들(상속받은 멤버포함)만 사용가능
▶즉, Tv클래스에 정의되지 않은 멤버, text와 caption()은 참조변수 t로 사용 불가

둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라짐

  • 반대로, 자손타입의 참조변수로 조상타입의 인스턴스 참조는 가능할까?
ex)
SmartTv s = new Tv(); //에러!! 허용 안됨

▶ 실제 인스턴스인 Tv의 멤버 개수보다 참조변수 s가 사용할 수 있는 멤버 개수가 더 많기 때문에 허용불가

조상타입의 참조변수로 자손타입의 인스턴스를 참조 가능
반대로, 자손타입의 참조변수로 조상타입의 인스턴스 참조 불가

profile
안녕 나의 새로운 세상

1개의 댓글

comment-user-thumbnail
2022년 4월 30일

저는 자바의 정석 기초편으로 공부하는중인데 진도 많이 나가셨네요
자바의 정석 완강까지 화이팅입니다!

답글 달기