2008. 8. 7. 14:39

Part 3. static

1. 정적 멤버변수
class staticTest {
  static int a=10; // 정적 멤버변수(클래스 단위 멤버변수)
  int b=20;         // 
}
static으로 선언한 멤버는 램 상에 힙 영역이 아닌 메모리에 기억공간이 할당되며 메모리 영역에 할당된 static 멤버변수는 몇 개의 객체를 생성하던지 상관없이 프로그램이 끝날 동안 클래스 단위당 한번만 메모리 할당을 합니다.

2. 정적 메소드
static 속성이  private로 선언되어 있다면 정적 멤버변수를 사용하기 위한 메서드 정의가 필요합니다.
이런 메소드는 인스턴스 차원이 아닌 클래스 차원에서 사용 가능하도록 설계해야 합니다.
이건 곧 인스턴스의 생성 없이 클래스명으로 호출이 가능하다는 의미와 같습니다.
정적 메소드 사용시 유의사항
1. this 레퍼런스를 사용할 수 없다.
2. 인스턴스 변수를 사용할 수 없다.
3. 오버라이딩 되지 않는다.

package training;
class staticTest{
 // 멤버는 2가지로 나뉨 : 클래스 단위로 동작/인스턴스 단위로 동작
 // static int a=10;
 private static int a=10; // 클래스(static 추가) 단위로 동작
 // 필드 a에 대해서 segger/getter : 클래스명으로 접근하는 정적 메소드
 // 정적 메소드는 setter/getter에 static만 붙여주면 된다.
 public static int getA() {
  return a;
 }
 public static void setA(int a) {
  staticTest.a = a; // 정적 메소드는 this를 쓸 수 없다.
 }
 // int b=20;
 private int b=20; // 인스턴스 단위로 동작
 public int getB() { // 인스턴스 메서드는
  return b;       // 레퍼런스 변수로 접근해야 한다.
 }
 public void setB(int b) {
  this.b = b;
 }
}
public class Ex04 {
 public static void main(String[] args) {
  // 클래스에 대한 정보로 메모리에 올라가면서 이때
  // static 멤버도 함께 메모리 할당하고 끝나서 a는 한개만 존재
  // System.out.println(staticTest.a); // 클래스명으로 a의 소속을 밝힌다.
  System.out.println(staticTest.getA());
  staticTest s1=new staticTest();
  staticTest s2=new staticTest();
  staticTest s3=new staticTest();
  staticTest s4=new staticTest();
  // 인스턴스 필드는 인스턴스 개수만큼 존재
  // 인스턴스 필드는 반드시 레퍼런스 변수로 접근해야 한다.(클래스명은 접근불가)
  // System.out.println(s1.b);
  System.out.println(s1.getB());
  // 정적필드는 클래스명 뿐만 아니라, 레퍼런스 변수로도 접근 가능
  System.out.println(s1.getA());
  s1.setA(100); s1.setB(200);
  System.out.println(s1.getA() + ":" + s1.getB());
  System.out.println(s2.getA() + ":" + s2.getB());
 }
}
2008. 8. 7. 14:35

Part 3. 생성자

1. 생성자
생성자란 객체 생성 시, 초기화를 위한 메서드로 생성자가 제공된다.
객체가 생성될 때 멤버변수를 초기화하는 일은 생성자가 한다.

생성자는 메서드의 일종이지만 이름은 반드시 클래스명과 동일해야 한다.
메서드의 앞에 리턴형을 기술하지 않고 자료형도 없다.
ex : 접근_지정자 클래스_명 (인수1, 인수2, ...) {
}

package training;
class MyDate {
 int year, month, day;
 // 객체가 생성되자마자 오늘 날짜로 초기화 -> 생성자
 public MyDate() {
  year=2008;
  month=8;
  day=7;
 }
 // 형식매개변수가 3개 있는 생성자가 d2로 호출 된다.
 public MyDate(int new_year, int new_month, int new_day) {
  year=new_year;
  month=new_month;
  day=new_day; // day : 필드, new_day : 전달인자
  System.out.println("전달인자 3개짜리 생성자");
 }
 public MyDate(int new_year, int new_month) {
  // 생성자 this() : 생성자 내애서 첫문장에 위치 하여야 한다.
  this(new_year,new_month,1);
  System.out.println("전달인자 2개짜리 생성자");
 }
 public void print(){
  System.out.println(year+"/"+month+"/"+day);
 }
 public void setDay(int day){
  // 필드에 형식매개변수 값을 저장해야 한다.
  this.day=day;
  print();
 }
 
}
public class Ex02 {
 public static void main(String[] args) {
  MyDate d=new MyDate(); // 객체 생성 시 자동으로 생성자 호출
  d.print();
  // 객체 생성하는 형식
  // new 클래스명 (생성자에 전달해줄 실매개변수 리스트);
  MyDate d2=new MyDate(2008,9,1);
  d2.print();
  d2.setDay(13);
  d2.print();
  MyDate d3=new MyDate(2008,9);
 }
}

디폴트 생성자 : 컴파일러에서 기본적으로 제공되는 되는 생성자
사용자가 생성자를 하나라도 만들게 되면 디폴트 생성자를 사용할 수 없는 점을 유의

2. 레퍼런스 this
this를 사용하는 경우
메소드의 전달인자가 객체 속성과 이름이 동일할 때,

3. 생성자 this()
같은 클래스 내의 다른 생성자를 호출할때 사용