본문 바로가기
Java

Java_접근제어자, 내부클래스(oop)

by 유서담 2023. 11. 13.

접근제어자

 

접근제어자는 클래스 내에서 멤버의 접근을 제한하는 역할을 수행

 

 

접근제어자 종류 및  범위

 

종류 객체 내부 같은 패키지 서로 다른 패키지
public 접근가능 접근가능 접근가능
protected 접근가능 접근가능 하위 클래스만 접근가능
(default) 접근가능 접근가능 접근 불가
private 접근가능 접근 불가 접근 불가

 

 

 

접근제어자의 사용

 

구분 사용가능한 접근제어자
클래스 public, (default)
인스턴스 변수 public, protected, (default), private
클래스 변수 public, protected, (default), private
생성자 public, protected, (default), private
인스턴스 메소드 public, protected, (default), private
클래스 메소드 public, protected, (default), private
매개변수, 지역변수 사용불가

 

 

사용예시

 

  // public 접근제한이 적용된 클래스
  public class Sample {

  }
  // default 접근제한이 적용된 클래스
  class Sample {

  }
  // 필드, 생성자, 메소드 접근제어
  public class Sample {
    // 필드의 접근제어
    private String a;
    protected String b;
    String c;
    public String d;

    // 생성자의 접근제어
    private Sample() {}
    public Sample(String a, String b, String c, String d) {
      this.a = a;
      this.b = b;
      this.c = c;
      this.d = d;
    }

    // 메소드의 접근제어
    private void test1() { ... }
    protected void test2() { ... }
    void test3() { ... }
    public void test4() { ... }
  }

 

 

 

접근제어자의 일반적인 사용

 

  • 클래스에는 public 접근제어자를 붙인다
  • 클래스의 인스턴스 변수는 private 접근제어자를 붙여서 은닉화시킨다
  • 클래스의 상수는 public 접근제어자를 붙여서 공개한다
  • 클래스의 생성자와 메소드는 public 접근제어자를 붙여서 공개한다
  • 클래스의 생성자와 메소드도 private 접근제어자를 붙여서 은닉화할 수도 있다
    • 생성자의 은닉화는 new 연산자를 사용해서 임의로 객체생성을 하지 못하게 한다
    • 메소드의 은닉화는 클래스 내부에서만 사용되고, 외부에 공개할 필요가 없는 메소드인 경우에 사용한다

 

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

 

  • 캡슐화는 접근제어자를 이용한 은닉화를 전제로 한다
  • 캡슐화는 사용자에게 공개할 필요가 없는 속성과 기능을 은닉화시키고, 사용자가 실제로 사용할 속성과 기능만을 공개하는 것이다
  • 캡슐화를 통해서 사용자는 클래스 내부의 복잡한 구현을 모르더라도, 공개된 기능을 사용해서 클래스의 기능을 온전히 사용할 수 있게 된다

 

캡슐화의 장점

  • 객체의 데이터를 보호할 수 있다
  • 사용자의 편의성이 좋아진다
  • 유지보수성이 좋아진다

 

 

내부클래스

 

  • 클래스내부에 정의된 클래스다
  • 내부클래스를 정의하는 이유
    • 클래스가 특정 클래스와 밀접한 관계를 맺고 있을 때, 클래스의 내부에 선언하는 것이 유리
    • 클래스의 구성요소들을 서로 쉽게 사용할 수 있다
  • 내부클래스를 포함하고 있는 클래스를 컴파일하면 내부클래스의 갯수만큼 컴파일된 클래스파일이 추가로 생성된다
    • 내부클래스의 컴파일된 클래스의 파일명 : 외부클래스명$내부클래스.class

 

 

내부클래스의 종류

 

 

인스턴스 내부 클래스(Instance Inner Class)

  • 외부의 멤버변수와 멤버메소드의 접근할 수 있다
  • 주로 외부 클래스의 멤버변수와 밀접하게 결합된 작업을 수행할 때 사용하는 내부 클래스다.

 

  public class Outer {
    int x;
    int y;
    public void test1{} {
      수행문;
    }
    // 인스턴스 내부 클래스
    class Inner {
      int a;
      int b;
      public void test2() {
        수행문;
      }
    }      
  }

 

 

 

정적 내부 클래스(Static Inner Class)

  • 외부 클래스와 객체와 독립적으로 동작하는 내부클래스다
  • 외부 클래스의 정적변수와 정적메소드만 접근할 수 있다
  • 주로 외부 클래스와 느슨하게 결합된 유틸리티 클래스를 작성할 때 사용하는 내부 클래스다

 

  public class Outer {
    int x;
    int y;
    static int z;
    public void test1() {
      수행문
    }
    public static void test2() {
      수행문
    }
    // static 내부 클래스
    static class Inner {
      int a;
      int b;
      public void test3() {
        수행문
      }
    }
  }

 

 

 

로컬 내부 클래스(Local Inner Class)

  • 메소드 내부에서 정의되고 사용되는 내부클래스다
  • 메소드의 지역변수와 파라미터에 접근할 수 있다
  • 주로 메소드 내에서 필요한 작업을 수행하기 위해서 임시로 사용되는 내부클래스다

 

  public class Outer {
    int x;
    int y;
    public void test1() {
      수행문;
    }
    public void test2() {
       int x1 = 100;
       int y1 = 200;
      // 지역내부 클래스
      class Inner {
        int a;
        int b;
        public void test2() {
          수행문;
        }
      }
      y1 = 20;
    }
  }

 

 

 

익명 내부 클래스(Annonymous Inner Class)

  • 이름이 없는 내부클래스다
  • 인터페이스나 추상클래스의 구현객체를 생성할 때 사용되는 내부클래스다
  • 클래스를 정의하면서 동시에 객체를 생성한다
  • 주로 콜백함수, 이벤트처리에 사용되는 일회용 객체를 생성할 때 사용된다

 

  //인터페이스
  public interface Pen {
    void draw();
  }
  //익명객체 
  Pen p = new Pen() {
    public void draw() {
      // 구현코드
    }
  };
  
  
    //인터페이스
  public inteface MouseListener {
    void mouseClicked(MouseEvent e);
    void mouseMoved(MouseEvent e);
  }
  //익명객체
  MouseListener listener = new MouseListener() {
    public void mouseClicked(MouseEvent e) {
      // 구현코드
    }
    public void mouseMoved(MouseEvent e) {
      // 구현코드
    }
  };

 

 

 

인터페이스의 구현객체 생성하기
1. 구현클래스를 정의하고, 객체 생성하기
	public class BarChart implements Chart {
		public void draw() {
			// 막대그래프 그리기
		}
	}

	BarChart c1 = new BarChart();
	Chart 	 c2 = new BarChart();
    
    
    2. 구현클래스를 정의하면서 동시에 객체 생성하기
	Chart c1 = new Chart() {
		public void draw() {
			// 파이차트 그리기
		}
	};

	Chart c2 = new Chart() {
		public void draw() {
			// 꺽은선 그래프 그리기
		}
	};

	Chart c3 = new Chart() {
		public void draw() {
			// 지도차트 그리기
		}
	};

 

 

 

'Java' 카테고리의 다른 글

Java_String 클래스  (0) 2023.11.14
Java_Object 클래스, Java API  (0) 2023.11.14
Java_인터페이스(oop)  (1) 2023.11.10
Java_오버라이딩, 추상화, 다형성(oop)  (0) 2023.11.09
Java_상속, Object, 클래스 형변환(oop)  (0) 2023.11.08