패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여
패키지와 접근 제어 01. 패키지 패키지란? • 패키지(package) : 클래스와 인터페이스를 묶는 단위
패키지와 접근 제어 01. 패키지 패키지 이름 정하기 • 자바 식별자를 가지고 만들어야 함 [올바른 예] [잘못된 예]
01. 패키지 패키지와 접근 제어 패키지 이름을 정하는 방법 • 계층적인 패키지 이름 [예] • 인터넷 도메인 이름을 활용한 계층적인 패키지 이름
01. 패키지 패키지와 접근 제어 패키지 선언문 • 패키지를 만드는 방법 • 패키지 선언문의 문법 - 패키지는 프로그래머가 직접 만드는 것이 아니라; - 클래스나 인터페이스에 패키지 선언문을 쓰면 자바 컴파일러가 만들어 줌 • 패키지 선언문의 문법 - package라는 키워드를 가지고 선언할 수 있음
01. 패키지 패키지와 접근 제어 패키지 선언문 [예제 8-1] 패키지 선언문을 포함하는 클래스 1 2 3 4 5 6 7 8 9 10 package geometry; class Circle { int radius; Circle(int radius) { this.radius = radius; } double getArea() { return radius * radius * 3.14; 패키지 선언문 컴파일이 끝나면 패키지 이름과 똑같은 이름의 디렉토리가 생기고 그 디렉토리에 컴파일의 결과가 생깁니다.
패키지와 접근 제어 01. 패키지 패키지 선언문 • 인터페이스에 패키지를 선언하는 방법 - 클래스의 경우와 동일
01. 패키지 패키지와 접근 제어 계층적인 이름을 갖는 패키지 [예제 8-2] 계층적인 이름의 패키지 선언문을 포함하는 클래스 3 4 5 6 7 8 9 10 11 package geometry.polygon; class Rectangle { int width, height; Rectangle(int width, int height) { this.width = width; this.height = height; } int getArea() { return width * height; 패키지 선언문 컴파일이 끝나면 패키지 이름과 똑같은 계층 구조의 디렉토리가 생기고 계층 구조의 제일 아래쪽 디렉토리에 컴파일의 결과가 생깁니다.
01. 패키지 패키지와 접근 제어 같은 패키지에 속하는 클래스의 사용 [예제 8-3] 같은 패키지의 클래스를 사용하는 프로그램 2 3 4 5 6 7 8 package geometry; class PackageExample1 { public static void main(String args[]) { Circle obj = new Circle(5); System.out.println("반지름 = " + obj.radius); System.out.println("면적 = " + obj.getArea()); } 패키지가 있는 디렉토리에서 프로그램을 실행해야 합니다. 패키지 이름 클래스 이름
01. 패키지 패키지와 접근 제어 다른 패키지에 속하는 클래스의 사용 [예제 8-4] 다른 패키지의 클래스를 사용하는 프로그램 – 잘못된 예 1 2 3 4 5 6 7 8 9 package math; class PackageExample2 { public static void main(String args[]) { Rectangle obj = new Rectangle(2, 3); System.out.println("넓이 = " + obj.width); System.out.println("높이 = " + obj.height); System.out.println("면적 = " + obj.getArea()); }
패키지와 접근 제어 01. 패키지 다른 패키지에 속하는 클래스의 사용 • 다른 패키지에서 사용할 클래스의 선언 방법
01. 패키지 패키지와 접근 제어 다른 패키지에 속하는 클래스의 사용 [예제 8-5] 다른 패키지에서 사용할 수 있도록 공개된 Rectangle 클래스 1 2 3 4 5 6 7 8 9 10 11 package geometry.polygon; public class Rectangle { public int width, height; public Rectangle(int width, int height) { this.width = width; this.height = height; } public int getArea() { return width * height;
01. 패키지 패키지와 접근 제어 다른 패키지에 속하는 클래스의 사용 [예제 8-6] 다른 패키지의 클래스를 사용하는 프로그램 – 올바른 예 1 2 3 4 5 6 7 8 9 package math; class PackageExample3 { public static void main(String args[]) { geometry.polygon.Rectangle obj = new geometry.polygon.Rectangle(2, 3); System.out.println("넓이 = " + obj.width); System.out.println("높이 = " + obj.height); System.out.println("면적 = " + obj.getArea()); }
01. 패키지 패키지와 접근 제어 import 선언문 • import 선언문 • import 선언문의 작성 방법 다른 패키지에 속하는 클래스나 인터페이스를 패키지 이름 없이 사용할 수 있도록 만드는 명령문 • import 선언문의 작성 방법
01. 패키지 패키지와 접근 제어 import 선언문 [예제 8-7] import 선언문의 사용 예 1 2 3 4 5 6 7 9 10 package math; import geometry.polygon.Rectangle; // import 선언문 class PackageExample4 { public static void main(String args[]) { Rectangle obj = new Rectangle(2, 3); System.out.println("넓이 = " + obj.width); System.out.println("높이 = " + obj.height); System.out.println("면적 = " + obj.getArea()); } 패키지 이름 없이 클래스 이름만 가지고 사용합니다. [예제 8-5]
01. 패키지 패키지와 접근 제어 import 선언문 [예제 8-8] 여러 개의 import 선언문을 포함하는 클래스의 예 원 클래스 원 클래스와 직사각형 클래스를 사용하는 프로그램 package geometry; public class Circle { public int radius; public Circle(int radius) { this.radius = radius; } public double getArea() { return radius * radius * 3.14; package math; import geometry.Circle; import geometry.polygon.Rectangle; class PackageExample5 { public static void main(String args[]) { Circle obj1 = new Circle(5); Rectangle obj2 = new Rectangle(8, 9); if (obj1.getArea() > obj2.getArea()) System.out.println("원의 면적이 더 넓습니다."); else System.out.println("원의 면적은 직사각형의 면적보다 작거나 같습니다."); } 두 개의 import 선언문 직사각형 클래스 package geometry.polygon; public class Rectangle { public int width, height; public Rectangle(int width, int height) { this.width = width; this.height = height; } public int getArea() { return width * height;
패키지와 접근 제어 01. 패키지 import 선언문 • 특수문자 *를 사용한 import 선언문
01. 패키지 패키지와 접근 제어 import 선언문 [예제 8-9] 특수문자 *를 이용한 import 선언문의 예 정사각형 클래스 정사각형 클래스와 직사각형 클래스를 사용하는 프로그램 package geometry.polygon; public class Square { public int sideLength; public Square(int sideLength) { this. sideLength = sideLength; } public double getArea() { return sideLength * sideLength; package math; import geometry.polygon.*; class PackageExample6 { public static void main(String args[]) { Square obj1 = new Square(7); Rectangle obj2 = new Rectangle(5, 10); if (obj1.getArea() > obj2.getArea()) System.out.println(“정사각형의 면적이 더 넓습니다."); else System.out.println( "정사각형의 면적은 직사각형의 면적보다 작거나 같습니다."); } geometry.polygon 패키지의 모든 클래스와 인터페이스를 import 직사각형 클래스 package geometry.polygon; public class Rectangle { public int width, height; public Rectangle(int width, int height) { this.width = width; this.height = height; } public int getArea() { return width * height;
02. 접근 제어 패키지와 접근 제어 접근 제어 수식어란? • 접근 제어 수식어(access control modifier) - 클래스, 인터페이스와 구성요소들의 접근 방근을 제어하는 자바 키워드 - public, protected, private이 있음 • 접근 제어 수식어에 의해 정해지는 클래스 구성 요소의 접근 가능 범위 클래스의 구성요소에만 사용 가능
02. 접근 제어 패키지와 접근 제어 private 키워드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Fraction { private int numerator; // 분자 private int denominator; // 분모 Fraction(int numerator, int denominator) { this.numerator = numerator; this.denominator = denominator; } private double getDouble() { return (double) numerator / denominator; int getInt() { return (int) getDouble();
02. 접근 제어 패키지와 접근 제어 private 키워드 1 2 3 4 5 6 class AccessControlExample1 { public static void main(String args[]) { Fraction obj = new Fraction(100, 3); System.out.println("100/3 = " + obj.getDouble()); } 잘못된 호출
02. 접근 제어 패키지와 접근 제어 private 키워드 [예제 8-12] private 생성자를 포함하는 클래스의 예 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class PersonalInfo { String name; int age; char gender; // 남, 여 String bloodType; // A, B, AB, O private PersonalInfo(String name, int age) { this.name = name; this.age = age; } PersonalInfo(String name, int age, char gender) { this(name, age); this.gender = gender; PersonalInfo(String name, int age, char gender, String bloodType) { this.bloodType = bloodType; 호출 호출
02. 접근 제어 패키지와 접근 제어 protected 키워드 1 2 3 4 5 6 7 8 9 10 11 12 13 package geometry.common; public class Polygon { protected int x[]; // 꼭지점의 X 좌표 protected int y[]; // 꼭지점의 Y 좌표 protected Polygon(int vertexNum) { x = new int[vertexNum]; y = new int[vertexNum]; } protected void setPoint(int index, int x, int y) { this.x[index] = x; this.y[index] = y;
02. 접근 제어 패키지와 접근 제어 protected 키워드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package geometry.shape; public class Square extends geometry.common.Polygon { public Square(int x, int y, int sideLength) { super(4); setPoint(0, x, y); setPoint(1, x + sideLength, y); setPoint(2, x + sideLength, y + sideLength); setPoint(3, x, y + sideLength); } public int getX(int index) { return x[index]; public int getY(int index) { return y[index]; 슈퍼클래스의 protected 생성자 호출 슈퍼클래스의 protected 메소드 호출 슈퍼클래스의 protected 필드 사용
02. 접근 제어 패키지와 접근 제어 메소드 오버라이딩과 접근 제어 ≥ 서브클래스 메소드의 접근 허용 범위 슈퍼클래스 메소드의 • 오버라이드하는 메소드와 오버라이드되는 메소드의 접근 제어 관련 규칙 “오버라이드하는 메소드는 상속받은 메소드의 접근 허용 범위보다 같거나 더 넓은 범위의 접근을 허용해야 한다” 서브클래스 메소드의 접근 허용 범위 슈퍼클래스 메소드의 ≥
02. 접근 제어 패키지와 접근 제어 메소드 오버라이딩과 접근 제어 [예제 8-15] protected 메소드를 갖는 Point 클래스 1 2 3 4 5 6 7 8 9 10 11 12 13 class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } protected int getX() { return x; protected int getY() { return y;
02. 접근 제어 패키지와 접근 제어 protected 키워드 [예제 8-16] protected 메소드를 잘못 오버라이드하는 Point3D 클래스 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class Point3D extends Point { int z; Point3D(int x, int y, int z) { super(x, y); this.z = z; } int getX() { // 잘못된 메소드 return x; int getY() { // 잘못된 메소드 return y; int getZ() {
02. 접근 제어 패키지와 접근 제어 인터페이스의 메소드와 접근 제어 [예제 8-17] Movable 인터페이스 1 2 3 interface Movable { void moveTo(int x, int y); } 이 메소드에는 컴파일할 때 자동으로 public 키워드가 붙습니다
02. 접근 제어 패키지와 접근 제어 인터페이스의 메소드와 접근 제어 [예제 8-18] Movable 인터페이스를 구현하는 클래스 – 잘못된 예 1 2 3 4 5 6 7 8 9 10 11 12 13 class PlaneLabel implements Movable { int x, y; String str; PlaneLabel(int x, int y, String str) { this.x = x; this.y = y; this.str = str; } void moveTo(int x, int y) { // 잘못된 메소드