Power Java 제 9 장생성자와접근제어
이번장에서학습할내용 생성자 정적변수 정적메소드 접근제어 this 클래스간의관계 객체가생성될때초기화를담당하는생성자에대하여살펴봅니다.
생성자 생성자 (contructor): 객체가생성될때에필드에게초기값을제공하고필요한초기화절차를실행하는메소드
생성자의예 class Car { private String color; // 색상 private int speed; // 속도 private int gear; // 기어 // 첫번째생성자 public Car(String c, int s, int g) { color = c; speed = s; gear = g; // 두번째생성자 public Car() { color = "red"; speed = 0; gear = 1;
예제 public class CarTest { public static void main(string args[]) { Car c1 = new Car("blue", 100, 0); // 첫번째생성자호출 Car c2 = new Car(); // 두번째생성자호출
디폴트생성자 만약클래스작성시에생성자를하나도만들지않는경우에는자동적으로메소드의몸체부분이비어있는생성자가만들어진다.
주의할점 생성자가하나라도정의되어있으면디폴트생성자는만들어지지않는다.
생성자에서메소드호출 this() 는생성자를호출한다.
예제 #1 class Date { private int year; private String month; private int day; public Date() { month = "1월"; day = 1; year = 2009; public Date(int year, String month, int day) { setdate(year, month, day); public Date(int year) { setdate(year, "1월", 1); // 디폴트생성자 // 생성자 // 생성자
예제 #1 public void setdate(int year, String month, int day) { this.month = month; // this 는현재객체를가리킨다. this.day = day; this.year = year; public class DateTest { public static void main(string[] args) { Date date1=new Date(2009,"3월 ", 2); // 2009.3.2 Date date2=new Date(2010); // 2010.1.1 Date date3=new Date(); // 2009.1.1
예제 #2 class Time { private int hour; // 0-23 private int minute; // 0-59 private int second; // 0-59 // 첫번째생성자 public Time() { this(0, 0, 0); // 두번째생성자 public Time(int h, int m, int s) { settime(h, m, s); // 시간설정함수 public void settime(int h, int m, int s) { hour = ((h >= 0 && h < 24)? h : 0); // 시간검증 minute = ((m >= 0 && m < 60)? m : 0); // 분검증 second = ((s >= 0 && s < 60)? s : 0); // 초검증
예제 #2 // 시 : 분 : 초 의형식으로출력 public String tostring() { return String.format("%02d:%02d:%02d", hour, minute, second); public class TimeTest { public static void main(string args[]) { // Time 객체를생성하고초기화한다. Time time = new Time(); System.out.print(" 기본생성자호출후시간 : "); System.out.println(time.toString()); // 두번째생성자호출 Time time2 = new Time(13, 27, 6); System.out.print(" 두번째생성자호출후시간 : "); System.out.println(time2.toString());
예제 // 올바르지않은시간으로설정해본다. Time time3 = new Time(99, 66, 77); System.out.print(" 올바르지않은시간설정후시간 : "); System.out.println(time3.toString()); 1 부터 10 까지의정수의합 = 55 기본생성자호출후시간 : 00:00:00 두번째생성자호출후시간 : 13:27:06 올바르지않은시간설정후시간 : 00:00:00
예제 #3 class Point { private int x, y; // 생성자 public Point(int a, int b) x = a; y = b; class Circle { private int radius = 0; private Point center; // Point 참조변수가필드로선언되어있다. // 생성자 public Circle(Point p, int r) { center = p; radius = r;
예제 #3 public class CircleTest { public static void main(string args[]) { // Circle 객체를생성하고초기화한다. Point p = new Point(25, 78); Circle c = new Circle(p, 10);
정적변수 인스턴스변수 (instance variable): 객체마다하나씩있는변수 정적변수 (static variable): 모든객체를통틀어서하나만있는변수
정적변수의예 public class Car { private String color; private int speed; private int gear; private int id; private static int numberofcars = 0; public Car(String c, int s, int g) { color = c; speed = s; gear = g; // 자동차의개수를증가하고 id 번호를할당한다. id = ++numberofcars;
정적변수를외부에서사용할때 클래스이름. 정적변수 형식을사용한다. int n = Car.numberOfCars ;
정적메소드 정적메소드 (static method): 객체를생성하지않고사용할수있는메소드 ( 예 ) Math 클래스에들어있는각종수학메소드들 double value = Math.sqrt(9.0);
정적변수의예 public class Car { private String color; private int speed; private int gear; private int id; private static int numberofcars = 0; public Car(String c, int s, int g) { color = c; speed = s; gear = g; // 자동차의개수를증가하고 id 번호를할당한다. id = ++numberofcars;
예제 // 정적메소드 public static int getnumberofcars() { return numberofcars; // OK! public class CarTest3 { public static void main(string args[]) { Car c1 = new Car("blue", 100, 1); // 첫번째생성자호출 Car c2 = new Car("white", 0, 1); // 첫번째생성자호출 int n = Car.getNumberOfCars(); // 정적메소드호출 System.out.println(" 지금까지생성된자동차수 = " + n); 1 부터 10 까지의정수의합 = 55 지금까지생성된자동차수 = 2
주의할점 public class Test { public static void main(string args[]) { add(10,20); // 오류!! Why? int add(int x, int y) { return x + y; 정적메소스에서인스턴스메소드를호출할수없음. Why?
상수 상수는공간을절약하기위하여정적변수로선언된다. ( 예 ) public class Car {... static final int MAX_SPEED = 350;...
정적변수의예 import java.util.*; class Employee { private String name; private double salary; private static int count = 0; // 정적변수 // 생성자 public Employee(String n, double s) { name = n; salary = s; count++; // 정적변수인 count 를증가 // 객체가소멸될때호출된다. protected void finalize() { count--; // 직원이하나줄어드는것이므로 count 를하나감소
예제 // 정적메소드 public static int getcount() { return count; public class EmployeeTest { public static void main(string[] args) { Employee e1,e2,e3; e1 = new Employee(" 김철수 ", 35000); e2 = new Employee(" 최수철 ", 50000); e3 = new Employee(" 김철호 ", 20000); int n = Employee.getCount(); System.out.println(" 현재의직원수 =" + n); 1 부터 10 까지의정수의합 = 55 현재의직원수 =3
중간점검문제 1. 정적변수는어떤경우에사용하면좋은가? 2. 정적변수나정적메소드를사용할때, 클래스이름을통하여접근하는이유는무엇인가? 3. main() 안에서인스턴스메소드를호출할수없는이유는무엇인가?
접근제어 접근제어 (access control): 다른클래스가특정한필드나메소드에접근하는것을제어하는것
접근제어의종류 클래스수준에서의접근제어 멤버수준에서의접근제어
클래스수준에서의접근제어 public: 다른모든클래스가사용할수있는공용클래스 package: 수식자가없으면 : 같은패키지안에있는클래스들만이사용 패키지 (package) 는관련된클래스를모아둔것 public class myclass { class myclass {
멤버수준에서의접근제어 분류 접근 지정자 클래스 내부 같은 패키지내의 클래스 다른모든 클래스 전용멤버 private O X X 패키지멤 버 없음 O O X 공용멤버 public O O O
예제 import java.util.*; class Employee { private String name; private int salary; int age; // private 로선언 // private 로선언 // package 로선언 // 생성자 public Employee(String n, int a, double s) { name = n; age = a; salary = s; // 직원의이름을반환 public String getname() { return name; private int getsalary() { // private 로선언 return salary;
int getage() { return age; 예제 // package 로선언 public class EmployeeTest { public static void main(string[] args) { Employee e; e = new Employee(" 홍길동 ", 0, 3000); e.salary = 300; // 오류! private 변수 e.age = 26; // 같은패키지이므로 OK int sa = e.getsalary(); // 오류! private 메소드 String s = e.getname(); // OK! int a = e.getage(); // 같은패키지이므로 OK 1 부터 10 까지의정수의합 = 55 Exception in thread "main" java.lang.error: Unresolved compilation problems: The field Employee.salary is not visible The method getsalary() from the type Employee is not visible at EmployeeTest.main(EmployeeTest.java:8)
중간점검문제 1. 필드의경우, private 로만드는것이바람직한이유는무엇인가? 2. 필드를정의할때아무런접근제어수식자를붙이지않으면어떻게되는가?
this 자기자신을참조하는키워드 this.member = 10; 생성자를호출할때도사용된다. this(10, 20);
예제 class Person { private String lastname; private String firstname; String getlastname() { return lastname; String getfirstname() { return firstname; public Person(String lastname, String firstname) { this.lastname = lastname; // this는현재객체를가리킨다. this.firstname = firstname; // this는현재객체를가리킨다.
예제 public String buildname() { return String.format("%s %s\n", this.getlastname(), getfirstname()); public class PersonTest { public static void main(string args[]) { Person person = new Person(" 홍 ", " 길동 "); System.out.println(person.buildName());
중간점검문제 1. this 의주된용도는무엇인가? 2. this() 와같이표기하면무엇을의미하는가??
클래스와클래스간의관계 사용 (use): 하나의클래스가다른클래스를사용한다. 집합 (has-a): 하나의클래스가다른클래스를포함한다. 상속 (is-a): 하나의클래스가다른클래스를상속한다.
사용관계 클래스 A 의메소드에서클래스 B 의메소드들을호출한다. public class Complex { private double real; private double imag; public Complex(double r, double i) { real = r; imag = i;... double getreal() { return real; double getimag() { return imag; public Complex add(complex c) { double resultreal = real + c.getreal(); double resultimag = real + c.getimag(); return new Complex(resultReal, resultimag); 자기자신을사용하는경우
집합관계 하나의객체안에다른객체들이포함 class Time { private int time; private int minute; private int second; public Time(int t, int m, int s) { time = t; minute = m; second = s; public class AlarmClock { private Time currenttime; private Time alarmtime; 다른객체포함 publicalarmclock(time a, Time c) { alarmtime = a; currenttime = c;
Q & A