본문 바로가기

java

자바강의 8일차

1. 제어자(modifier)

    1-1) 제어자란?

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

       - 제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있다.

 

        접근제어자     public, protected,(default),private

        그 외               static, final, abstract, transient, synchronized, volatile, strictfp...

      

       - 제어자는 클래스나 멤버변수와 메소드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다.

       - 단, 접근제어자는한 변에 4가지 중 하나만 선택해서 사용할 수 있다. 

              

       1-2) static - 클래스, 공통적인

         - static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다.

         - 인스턴스변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만 클래스변수는 인스턴스에 관계없이 같은 값을 같는다.

         - static이 붙은 멤버변수와 메소드, 그리고 초기화블록은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지않고도 사용할 수 있다.

          * static이 사용될 수 있는 곳 - 멤버변수, 메소드, 초기화블록

제어자 대상 의미
static 멤버변수 - 모든 인스턴스에 공톡적으로 사용되는 클래스 변수가 된다.
- 클래스변수는 인스턴스를 생성하지 않고도 사용가능하다.
- 클래스가 메모리에 로드 될 때 사용된다.
  메소드 - 인스턴스를 생성하지 않고도 호출이 가능한 static 메소드가 된다.
- static 메소드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

  

      1-3) final- 마지막의, 변경될 수 없는

          - final은 '마지막의' 또는 '변경될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다.

          - 변수에사용되면 값을 변경할 수 없는 상수가되며, 메소드에 사용되면 오버라이딩 할 수 없게 되고 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.

제어자 대상 의미
fianl 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수없다.
  메소드 변경될 수없는 메소드
final로 지정된 메소드는 오버라이딩을 통해 재정의 될 수 없다.
  멤버변수,지역변수 변수 앞에 final이 붙으면 값을 변경할 수없는 상수가 된다.

   

    1-4) abstract - 추상의, 미완성인

        - abstract는 '미완성'의 의미를 가지고 있다.

        - 메소드의 선언부만 작성하고 실제 수행내용은 구현하지 않는 추상메소드를 선언하는데 사용된다.

           * abstract가 사용될 수 있는 곳 - 클래스, 메소드

 

  제어자                     대상                        의미

abstract                   클래스                  클래스 내에 추상메소드가 선언되어 있음을 의미한다.

 

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

        - 접근제어자는 멤버 또는 클래스에 사용되며 해당하는 멤버 또는 클래스 외부에서 접근하지 못하도록 제한하는 역할을 한다.

        - 접근제어자가 default임을 알리기 위해 실제로 default를 붙이지는 않는다.

          * 접근제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메소드, 생성자

제어자 같은클래스 같은패키지 자손클래스 전체
public O O O O
protected O O O X
(default) O O X X
private O X X X

 

    public > protected > (default) > priate (접근범위가 넓은 쪽에서 좁은 쪽의 순으로 나열)

 

   ① 접근제어자를 이용한 캡슐화

     - 클래스나 멤버, 주로 멤버에 접근제어자를 사용하는 이유는 클래스의 내부에 선언되 데이터를 보호하기 위해서이다.

     - 데이터가 유효한 값을 유지하도록, 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서 외부로부터의 접근을 제한하는 것이 필요하다.

     - 이를 데이터 감추기 (data hiding)라고 하며, 객체지향개념의 캡슐화 (encapsulation)에 해당하는 내용이다.

     - 또 다른 이유는 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버변수나 부분작업을 처리하기 위해 메소드 등의 멤버들을 클래스 내부에 감추기 위함이다.

'    - 외부에서 접근할 필요하 없는 멤버들을 private으로 지정하여 외부에 노출시키지 않음으로써 복잡성을 줄일 수 있다.

 

    ② 생성자의 접근제어자

     -  생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.

     - 보통 생성자의 접근제어자는 클래스의 접근제어자와 같지만 다르게 지정할 수 있다.

     - 생성자의 접근 제어자를 private으로 지정하면 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 된다.

     - 그래도 클래스 내부에서는 인스턴스를 생성할 수 있다.

 

   1-6) 제어자 (modifier)의 조합

대상 사용가능한 제어자
클래스 public, (default), final, abstract
메소드 모든 접근제어자, final, abstract, static
멤버변수 모든 접근제어자, final, static
지역변수 final

 

  ① 메소드에 static과 abstract를 함께 사용할 수 없다.

        ==> static 메소드는 몸통이 있는 메소드에서만 사용할 수 있기 때문

  ② 클래스에 abstract와 final을 동시에 사용할 수 없다.

        ==> 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고 abstract는 상속을 통해서만 완성되어야 한다는 의미이므로 모순

  ③ abstract 메소드의 접근 제어자가 private일 수 없다.

        ==> abstract 메소드는 자손클래스에서 구현해주어야 하는데 접근제어자가 private이면 자손클래스에서 접근할 수 없기 때문

 

  ④ 메소드에 private 와 final을 같이 사용할 필요는 없다.

         ==> 접근제어자가 private인 메소드는 오버라이딩될 수 없기 때문에 이 둘 중 하나만 사용해도 의미가 충분하다. 

 

2. 다형성 (polymorphism)

    2-1) 다형성이란?

        - 객체지향개념에서 다형성이란 여러가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다.

        - 좀 더 구체적으로 말하자면 조상 클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다는 것이다.

- 지금까지 우리는 Tv t = new Tv();    CaptionTv c = new CaptionTv(); 형식으로만 사용해 왔다.

        - 이처럼 인스턴스의 타입과 참조변수의 타입이 일치하는 것이 보통이지만, Tv와 CaptionTv처럼 클래스가 서로 상속관계에 있을 경우 다음과 같이 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조하도록 하는것도 가능하다.

       Tv t = new CaptiontTv();          // 조상타입의 참조변수로 자손 인스턴스를 참조

 

        - 그렇다면

            CaptionTv c = new CaptionTv();

            Tv t = new CaptionTv();        이 둘의 차이는 무엇일까?

 

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

        - 그럼 여기서 반대로

           CaptionTv c = new Tv();    는 가능할까에 대한 답변은 불가능하다는 점이다.

           실제 인스턴스인 Tv멤버개수보다 참조변수 c가 사용할 수 있는 멤버 개수가 더 많기 때문이다.

        - CaptionTv클래스에서는 text와 caption(){}이 정의되어 있으므로 참조변수 c로는 c.text, c.caption()과 같은 방식으로 c가 참조하고 있는 인스턴스에서 text와 caption()을 사용하려고 시도할 수 있다. 하지만, c가 참조하고 있는 인스턴스는 Tv타입이고, Tv타입의 인스턴스에는 text와 caption()이 존재하지 않기 때문에 이를 사용하려 하면 문제가 발생한다.

         - 그래서 자손타입의 참조변수로 조상타입의 인스턴스를 참조하는 것은 존재하지 않는 멤버를 사용하고자 할 가능성이 있으므로 허용하지 않는 것이다.

         - 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다.

           * 조상타입의참조변수로 자손타입의 인스턴스를 참조할 수 있다.

           * 반대로 자손타입의 참조변수는 조상타입의 인스턴스를 참조할 수 없다.

     

- 기본형변수와 같이 참조변수도 형변환이 가능하다.

      - 단, 서로 상속관계에 있는 클래스에서만 가능하기 때문에 자손타입의 참조변수를 조상타입의 참조변수로,

           자손타입 -> 조상타입 (Up-casting)   : 형변환 생략 가능

           조상타입 -> 자손타입 (Down-casting)  : 형변환 생략 불가

      - 어떠한 클래스 Car가 있을 때 Car타입의 참조변수 c를 Car타입의 조상인 Object타입의 참조변수로 형변환하는 것은 참조변수가 다룰 수있는 멤버의 개수가 실제 인스턴스가 갖고 있는 멤버의 개수보다 적을 것이 분명하므로 문제가 되지 않는다. 형변환을 생략할 수 있는 것이다.

       - 형변환은 참조변수의  타입을 변환하는 것이지 인스턴스를 변환하는 것이 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.

       - 단지, 참조변수의 형변환을 통해서 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위 (개수)를 조절하는 것 뿐이다.

 

 

   2-3) instanceof 연산자

       - 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.

       - 주로 조건문에 사용되며 instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.

       - 그리고 연산의 결과로 boolean값인 true와 false중 하나를 반환한다.

       - instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.

   

 

  2-4) 참조변수와 인스턴스의 연결

        - 조상클래스에 선언된 멤버변수와 같은 이름의 인스턴스 변수를 자손 클래스에서 중복으로 정의했을 때 조상타입의 참조변수로  자손 인스턴스를 참조하는 경우와 자손타입의 참조변수로 자손인스턴스를 참조하는 경우는 서로 다른 결과를 얻는다.

        - 메소드의 경우 조상클래스의 메소드를 자손의 클래스에서 오버라이딩한 경우에는 참조변수의 타입에 관계없이 항상 실제 인스턴스 메소드가 호출되지만, 멤버변수의 타입에 따라 달라진다.

        - 멤버변수가 조상클래스와 자손클래스에 중복으로 정의된 경우, 조상타입의 참조변수를 사용했을 때는 조상 클래스에 선언된 멤버변수가 사용되고, 자손타입의 참조변수를 사용했을 때는 자손 클래스에 선언된 멤버변수가 사용된다.

        - 하지만 중복 정의되지 않은 경우 조상타입의 참조변수를 사용했을 떄와 자손타입의 참조변수를 사용했을 때의 차이는 없다.

        

'java' 카테고리의 다른 글

자바강의 10일차  (0) 2024.01.23
자바강의 9일차  (0) 2024.01.19
자바강의 7일차  (0) 2024.01.14
자바강의 6일차  (1) 2024.01.13
자바강의 5일차  (0) 2024.01.10