//public class Date {
class DateClass { //주클래스가 하나의 문서에 들어있으므로,,,
// class 앞엔 접근지정자를 public or 생략 둘중 하나만 가능
// class :자료형을 만들기위한 예약어(소문자로쓴다)
// DateClass : class명 :사용자 정의명칭
// '{' = Date class의 시작 (set / get)
// int year,month,day; //원본 예제
// int 앞엔 접근지정자를 "public,private,protect,생략" + a
// =dataClass 맴버함수(=맴버변수=데이터 맴버)
// new 연산자로 객체 정의시 메모리 공간으로 만들어질 항목이다.
private int year,month,day; // "[a]예제"
public DateClass(){ // 생성자범위 |->
// = 생성자 =구성자
// = 생성자 = DateClass() 앞엔 접근지정자를 "public,private,protect,생략" 중 하나 사용가능
// "DateClass()=생성자명" = "class명"과 반드시 일치 시켜야한다.
// 생성자명 앞에는 절대, "결과형(void)"을 기재할 수없다.
// 외부에서 생성자를 임의로 호출할 수 없다.
// object가 정의 될 당시 자동적으로 호출되어 수행되는 함수로
// 정의된 객체를 초기화시켜주는 역할일 뿐이다. !!
// 생성자 안에는 return명령을 기재할 수 없다.
System.out.println("디폴트 생성자 수행");
year=2012;
month=02;
day=15;
}
public DateClass(int y, int m, int d){
// = 중복함수
// 생성자는 중복함수의 개념으로 여러개 기재가 가능하다.
// 자바에서는 소멸자가 존재하지 않는다.
// 만약, 동시에 두개 정의 되었을 때 초기 값을 정의한 생성자를 자동으로 우선 호출한다.
System.out.print("3개의 매개변수를 갖는 생성자 수행");
year=y;
month=m;
day=d;
}
// 여기까지가 "생성자범위" ->|
// 생성자가 하나도 존재하지않을 경우
// JVM이 디폴트 생성자를 만들어서 사용한다.
// (일례로,전역변수의 경우도 자동으로 초기화 시켜준다.)
// |-> "맴버 함수"(= "메소드") = 어떻게 처리할 것인가의 방법 기재!!!
// 추후 임의 접근을 위한 통로!!!
// getYear()도 받아서 넘겨줌으로 리턴타입을 써줘야!!!
public int getYear(){ // <- public getYear(){
// public = 접근지정자 (이 외에 3가지를 더쓸수있다.)
// int는 결과형!!!
// getYear = 맴버함수명
return year;
}
public int getMonth(){
return month;
}
public int getDay(){
return day;
}
//변경에 관련된 함수!!! : set
public void setYear(int y){ // 받기위해 int y
year=y;
//변경만할 것이기 때문에 return사용X
}
public void setMonth(int m){ // 받기위해 int m
month=m;
}
public void setDay(int d){ // 받기위해 int d
day=d;
}
public void setDate(int y,int m, int d){
year=y;
month=m;
day=d;
}
//객체에 있는 값 출력!!!
public void Display(){
System.out.print(year + "년" + month + "월" + day +"일");
}
}
public class Date {
public static void main(String str[]){
DateClass d1=null; //stack 메모리에 d1을 만들고 그 값은null로 지정하는 예제이다.
//d1.Display(); // d1. (+box = 내가 정의한 변수 +object 변수)
// NullPointerException 오류
// = null 상태인 변수를 접근(호출)하고자 하는 경우
//DateMain(); // DateMain=는 생성자일뿐이다.
// 먼저 객체를 정의해야한다.
d1 = new DateClass();
d1.Display(); // 여기서는 된다.(이제,null이 아니니까)
//Display();
// 객체정의 =>heap상에 메모리가 잡힌다.
// 객체정의순간 -> (생성자 없이도) object에 의해 먼저 만들어진다!!
// -> 그리고 Date 맴버가 있는 경우
// -> +함수포인터+배열형태=> 함수테이블 생성 및 공유
// = 이것이 하나의 처리 단위가 된다.
// -> 그리고나서 : d1에 "번지"값이 들어간다.
// DateMain()안에 ()가 비어있기 때문에
// ->자동적으로 public Date()생성자에 접근!!!
// -> 그리고 나서 DateMain()아래로 떨어진다.
//d1.DateMain() //생성자 자체에는 접근항수없다.
DateClass d2 = new DateClass(1991,5,16);
d2.Display(); // 생략된 this.로인해 d1.Display()와 다른 값을 뿌려준다.!!
// this : 1) 프로그렘작성자가 메모리를 정의하는것이 아니라 "컴파일러"가 내부적으로 만들어준다.
// 2) year, month, day 와 같이 맴버 함수안에 여러개가 있는 경우 그것을 구분하기 위해
// ( = 어느객체의 맴버인가를 명확히 해줄 목적으로 )
// 3) d2의 번지값을 알아서 this가 전달
// ( = 객체의 번지를 컴파일러가 알아서 자동생성된 this에게 전달해준다.)
// ( = 생성자 맴버함수안에서 맴버 변수를 지칭할 경우 컴파일러는 알아서 "this."가 생략된 형태로 인식한다.
//d2.year=2011; // 범위 밖임으로 접근할 수 없다.
//private 속성이기 때문에 "[a]예제"
// 그래도 변경을 원하는 경우 = "멤버 함수"의 근본적인 역할 = 방어하면서 원하는 것을 바꾸는 경우
d2.setYear(2011); // 이때도 자동적으로 this.year로 인식란다.
// System.out.println(d2.year); // year가 private 속성이라 꺼낼 수도 없다.
// 그래도 출력을 원하는 경우 = getYear()를 호출한다.!!!
System.out.println("d2의 년도이다. =" +d2.getYear());
}
}
'새로워지기 > 서른의 생활코딩' 카테고리의 다른 글
ex3) java_oop (0) | 2012.02.15 |
---|---|
ex2) java_oop (0) | 2012.02.15 |
ex16) java _ 문의 (0) | 2012.02.15 |
ex15) java (0) | 2012.02.15 |
ex14) java (0) | 2012.02.15 |
댓글