변수의 종류
1. 지역변수
2. 멤버변수
3. 정적변수

지역변수
- 메소드 안에서 정의되고 안에서 사용되는 변수
- 기본자료형일때 메소드 호출시에 스택메모리에 할당되고, 메소드 실행이 종료되면 자동으로 메모리가 해제됨

멤버변수 (= 필드 = 전역변수)
- 메소드 바깥쪽에 정의되는 변수
- 기본자료형 멤버변수는 heap 메모리 영역에 저장됨.
- 그 클래스(생성자,메소드)안에서 모두 사용이 가능함 = 전역변수
- 자동으로 초기화 됨
- 참조형을 이용해서 new 연산자로 객체를 생성시 heap 메모리 영역에 새로운 공간을 할당받는데, 그 공간이 멤버변수를 위한 공간
- 가비지 콜렉터가 필요없는 힙메모리상의 변수들을 지워줌

변수와 메모리
- 기본자료형 && 지역변수 -> 스택 메모리
- 기본자료형 && 멤버변수 -> 힙 메모리
- 참조형 && 지역변수 -> 힙 메모리에 값, 스택 메모리에 주소값
- 참조형 && 멤버변수 -> (아직 모름)

클래스 형태의 자료형
ex) Animal클래스는 클래스 형태의 자료형이다.
- 사용자가 만들어쓰는 자료형이다

클래스
- 필드
- 생성자
- 메소드

접근제어자를 사용하는 곳
- 클래스
(클래스를 구성하는)
- 필드
- 생성자
- 메소드

접근제어자 역할
- 외부 클래스에서의 접근을 막을지 허용할지 설정

생성자의 역할
- 객체를 생성할때 호출되면서 이 필드값을 원하는 값으로 초기화 시키는 역할

생성자 종류
- 매개변수가 없는 생성자 = 기본생성자
- 매개변수가 있는 생성자

생성자와 메소드의 구분
1. 생성자 앞에는 접근제어자만 온다! 
2. 생성자는 클래스명과 동일한 이름

필드의 역할
- 변수기 때문에 값을 저장하는 역할만 함

메소드
- 기능이 가장 많음
- 동적인걸 표현함

필드의 초기화
- 배열처럼 필드는 자동 초기화가 된다. (int는 0으로 초기화)

사용자정의 클래스 예시

Animal a1 = new Animal();


- Animal은 클래스 자료형
- a1은 레퍼런스 변수
- new는 연산자
- Animal() 은 생성자를 호출함

생성자 안만들면
- 컴파일러가 자동으로 기본생성자 만들고 호출

+ 생성자 만들었을땐
- 매개변수가 있는 생성자를 만들면 기본생성자는 자동으로 만들어지지않음
- 만들어진 생성자들만 사용가능

생성자 호출하는 방법
1. 객체를 생성할때 호출됨
2. this()를 통해 호출할 수도 있음

필드 접근
- 객체.필드 로 접근
ex) a1.age 처럼 .으로 접근 가능하다
ex) age만으로 접근 불가능하다
- 힙메모리의 필드에 접근하기 위해서는 반드시 주솟값을 가지고 있는 a1으로 참조해서만 접근 가능

파일과 클래스
- 한개의 소스파일안에 클래스 여러개 작성해도 나중에 바이트 코드는 따로 만들어짐
ex) 한개의 파일안에 클래스가 2개들어가는 예제 CarEx

파일명
- public 접근 제어자는 메인 메소드를 가진 클래스만 쓸 수 있고 그 클래스와 파일명이 같아야함
- 하나의 소스파일에는 public class 가 하나만 올 수 있고 public class명과 파일명이 같아야함

 

예제

 

class Car {
	// 필드(field)
	String company = "현대 자동차"; //주어진 초기값
	String model = "그랜저";
	String color = "검정";
	int maxSpeed = 350;
	int speed;

	// 생성자(Constructor)
	public Car() {// 기본 생성자

		System.out.println("생성자 호출 성공");
	}
}

public class CarEx {
	public static void main(String[] args) {

		// 객체 생성
		Car mycar = new Car();
		System.out.println("제작회사 : " + mycar.company);
		System.out.println("모델명 : " + mycar.model);
		System.out.println("색깔 : " + mycar.color);
		System.out.println("최고속도 : " + mycar.maxSpeed);
		System.out.println("현재속도 : " + mycar.speed);

		// 필드값 변경
		mycar.speed = 60;
		System.out.println("수정된 속도 : " + mycar.speed); // 60

	}

}

- 선언과동시에 초기화가 되지 않은 speed는 , 객체가 생성되어 힙메모리상에 speed 공간이 생성될때
0으로 초기화 된다
- Car()은 생성자가 아니라 생성자를 호출하는 거임

그림

 

의미있는 객체 vs 의미없는 객체

- main 메소드를 가진 CarEx 클래스로 객체를 만들면? -> 만들어지지만 의미 없는 객체
- 멤버(필드,생성자,메소드) 가 있는 클래스로 객체를 만들어야 의미있는 클래스이다.

 

생성자 호출하는 방법
1. 객체를 생성할때 호출됨
2. this()를 통해 호출할 수도 있음
-  99%는 클래스로 객체를 생성할때 생성자가 호출됨

 

ex)

		// 객체 생성
		Car mycar = new Car(); //객체를 생성할때 생성자가 호출된다.
		CarEx car = new CarEx(); // 의미 없는 객체

필드 수정하기

 

		// 필드값 변경
		mycar.speed = 60;

- 필드는 객체를 통해서 접근해야한다.

 

지역변수와 필드의 생성과 소멸
- 지역변수는 메서드 호출시 생성, 메소드 종료시 삭제
- 필드는 클래스로 객체를 생성할때 new 연산자를 통해 힙공간에 공간 할당받고, 나중에 이 공간을
참조할 수 있는 주소가 더이상 없을때 가비지 콜렉터가 이걸 쓰레기로 인식하고
힙메모리상의 그 공간을 지워버림

필드 = 멤버변수
- 기본자료형들은 자동으로 초기값이 설정됨 ex) boolean 은 false로
- 클래스,배열, 인터페이스들은 참조할 주소가 없다는 의미인 null 로 초기화됨. 
- 필드는 힙메모리상에 저장됨

 

//p303
class FieldInitValue{
	//필드
	byte byteField;
	short shortField;
	int intField;
	long longField;
	
	float floatField;
	float doubleField;
	
	char charField;
	boolean booleanField;
	
	int[] arrField;
	String referenceField;
}
public class FieldEx {

	public static void main(String[] args) {

		FieldInitValue f = new FieldInitValue();
		
		System.out.println("byteField : " + f.byteField);
		System.out.println("shortField : " + f.shortField);
		System.out.println("intField : " + f.intField);
		System.out.println("longField : " + f.longField);
		
		System.out.println("floatField : " + f.floatField);
		System.out.println("doubleField : " + f.doubleField);
		
		System.out.println("charField : " + f.charField);
		System.out.println("booleanField : " + f.booleanField);
		
		System.out.println("intField : " + f.arrField);
		System.out.println("stringField : " + f.referenceField);
		
		
	}

}

출력값

byteField : 0
shortField : 0
intField : 0
longField : 0
floatField : 0.0
doubleField : 0.0
charField :

 

초기화 값
- 정수형은 0으로 초기화
- 실수형은 0.0으로 초기화
- char 필드는 은 초기화 안된다
- 논리형 필드는 false로 초기화
- 배열과 클래스 필드는 null로 초기화 된다
* null : 참조할 주소가 없다는 의미

Q. 참조형이 필드일때 즉 String 클래스가 필드로서 있을때 이걸 어떻게 할당하나?
A. f.referenceField = "자바" 

해제시점
- f처럼 그 객체 공간을 힙메모리상에 있는 그 개게 공간을 가리키고 있는 참조 변수가 있으면 괜찮다.
- f처럼 그 공간을 가리키고있는 참조 변수가 없으면 가비지 콜렉터가 자동으로 그 힙메모리의 공간을 지움
- 그때가 해제되는 시점임 

생성자
- 생성자 앞에는 접근제어자만 온다
- 생성자를 통해서 내가 원하는 초기값을 그 객체의 필드로 초기화 시킬 수 있다
- 매개변수가 있는 필드 만들어서 할 수 있다
- 객체가 생성될때 호출되어 필드들을 초기화 시키는 역할만 함
- 기본생성자는 객체가 생성될때 컴파일러가 자동으로 생성해준다

클래스명 주의
- 동일한 패키지 안에 같은 이름의 클래스가 있을땐 오류 발생
- 동일한 패키지 = 동일한 폴더 내
- .class 라는 바이트코드는 따로 만들어지는데 같은 이름인 파일이 이미 있으므로 
- 메인메소드를 가진 클래스명으로 파일명을 일치시켜야함 = 메인메소드를 가진 클래스만 public class 일 수 있어서
- 메인메소드가 없다면 public을 가진 class 명과 일치시켜야함

 

클래스 예시 (MyDate Class)

package p2022_06_28;

class MyDate {
	private int year; // 필드
	private int month;
	private int day;

	public MyDate() { // 기본생성자(Default Constructor)
		System.out.println("[생성자] : 객체가 생성될 때 자동 호출됩니다.");
	}

	public void print() {
		System.out.println(year + "/" + month + "/" + day);
	}
}// MyDate end

public class ConstructorTest02 {
	public static void main(String[] args) {
		MyDate d = new MyDate();
		d.print();
// 접근제어자가 private 이기 때문에 외부 클래스에서 직접 접근할 수 없다.
//	System.out.println(d.year);
//	MyDate dd =  new MyDate();
	}
}

 

1. MyDate Class 필드
- MyDate Class의 필드들 접근제어자가 private이다.
2. MyDate Class 생성자
- 생성자가 1개 있다. 생성자 이름은 클래스명과 같고 앞엔 접근제어자만 있다
- 매개변수가 없는 생성자 = 기본생성자
3. MyDate Class 메소드
- static이 없다 
- 대부분의 메소드는 static 안쓴다
- 나중에 싱클톤 만들땐 정적 메소드 형태로 만듬
- void가 있으므로 return;필요없음

메소드가 하는일 3가지
- 필드값을 출력하는 일
- 필드값을 수정하는 일
- 메소드앞엔 자료값이 오기때문에 호출했을때 값을 돌려주는 역할도 가능

클래스의 실행 정리
- 메인메소드가 없는 MyDate 클래스는 main메소드가 안에 없기때문에 독립적인 실행은 불가능하고
컴파일까지만 가능
- 실행하려면 메인메소드를 추가하든지 메인메소드를 가진 클래스에서 실행을 해줘야한다.
- 클래스 내에서 자기 자신의 클래스로 객체를 만드는거 -> 의미없다
- 필드/생성자/메소드 가진 클래스로 객체 만들어야 의미있다.

 

MyDate d = new MyDate();

- new는 myDate 의 필드들을 저장할 공간을 힙메모리에 생성함
- 그리고 그 공간을 자동으로 0으로 초기화함
- 즉 year month day 의 값을 힙에 저장하기 위한 공간을 생성
- 그림

 

객체 생성시점 벌어지는 일
- 접근제어자와 상관없이 year month day는 초기값 0으로 설정
- myDate() 생성자를 호출하라는 코드로 인해 생성자 호출됨, 그 생성자로 가서 실행을 함(여기선 출력)

필드값 접근(출력)방법1
- d.year d.month d.day 로 접근시 여기선 오류가 발생한다
- private을 필드 앞에 붙이면 외부 클래스의 접근을 허용하지 않기때문에 d.year 처럼 필드에 접근이 불가능하다

필드값 접근(출력)방법2
- 메소드를 활용하는 방법을 사용해야함!
- 메소드 앞의 접근 제어자가 public인 print() 메소드를 이용하면 필드값을 출력 가능하다 d.print(); 로 필드값을 출력한다.

접근제어자와 클래스
- 필드는 private이지만 private은 같은 클래스내에서는 접근이 된다
- 그래서 MyDate안 클래스 안의 print() 메소드는 필드들에 접근이 가능한것이다.
- 가장 좁은 접근 private 가장 넓은 접근 public 이다
- public은 모두 접근 가능, 클래스나 패키지 달라도, 같은 파일이든 다른 파일이든 다 접근 가능
- private 같은 클래스 내에서만 접근 허용

생성자
- 생성자는 필드를 초기화하는 역할
- 0 대신 원하는값으로 초기화시켜야할때 생성자에서 초기화해준다

메소드
- 값을 돌려주기도 하고 수정하기도 하고 출력하기도 함

 

접근제어자
- public : 다른 패키지에서도 접근 가능
- default : 동일 패키지 내에서만 접근 가능
- protected : 상속 받은 클래스에서 접근 가능
- private : 자기 클래스에서만 접근 가능(정보은닉)

 

클래스 예시(기본생성자로 초기화)

package p2022_06_28;

class MyDate03 {
	// 필드
	private int year;
	private int month;
	private int day;

	// 생성자 : 객체를 생성할때 생성자가 호출되고, 필드값을 초기화 시켜주는 역할
	public MyDate03() { // 기본 생성자
		year = 2016;
		month = 4;
		day = 1;
	}

	public void print() { // 메소드
		System.out.println(year + "/" + month + "/" + day);
	}
}// MyDate end

public class ConstructorTest03 {
	public static void main(String[] args) {
		MyDate03 d = new MyDate03();
//    				생성자호출
		d.print();
	}
}

- 필드값이 생성자가 호출되기 전에는 0으로 모두 초기화 되었었지만
- 생성자를 호출하면서 2016 4 1 로 바뀜
- 원하는 값으로 초기값을 설정하고 싶으면 생성자를 씀

 

매개변수를 가진 생성자 예시
- 기본생성자가 아니라 매개변수를 가진 생성자
- 생성자는 기본생성자든 매개변수를 가지든 필드값을 초기화시키는 역할임 

 

클래스 예시(매개변수가 있는 생성자로 초기화)

package p2022_06_28;

class MyDate05 {
	private int year; // 필드
	private int month;
	private int day;

	public MyDate05() { // 기본생성자
	}

	public MyDate05(int new_year, int new_month, int new_day) { // 매개변수가진 생성자
		year = new_year;
		month = new_month;
		day = new_day;
	}

	public void print() { // 메소드
		System.out.println(year + "/" + month + "/" + day);
	}
}

public class ConstructorTest05 {
	public static void main(String[] args) {
		MyDate05 d = new MyDate05();
		d.print();

		MyDate05 d2 = new MyDate05(2017, 7, 19);
		// 매개변수가 있는 생성자 호출
		d2.print();
	}
}

- 기본생성자를 주석처리하면 아래에 있는  MyDate05 d=new MyDate05();  가 오류생김
- 매개변수를 가진 생성자를 만들땐 컴파일러가 기본생성자 만들어주지 않기때문에!
- 내가 아무 생성자도 안썼을떄만 기본생성자 생성해줌

 

기본생성자 자동생성 정리
- 기본생성자는 객체 생성할때 컴파일러가 자동으로 만들어 주지만,
- 예외적으로, 매개변수를 가진 생성자가 있을 경우에는 더이상 기본 생성자를 만들어 주지 않는다.
-> 원하면 내가 기본생성자도 써야함!

매개변수를 가진 생성자
- 매개변수가 있는 생성자를 쓸때 매개변수에 원하는 값 써서 초기화 
- 객체 생성할때마다 그 객체의 필드를 초기화
- 매개변수를 가진 생성자를 호출

    MyDate05 d2=new MyDate05(2017, 7, 19);
    d2.print();

- 생성자가 호출될때 생성자의 매개변수는 지역변수다.

	  public MyDate05(int new_year, int new_month, int new_day){	//매개변수가진 생성자
   			 year=new_year;
   			 month=new_month;
  			  day=new_day;
  		}
		MyDate05 d = new MyDate05();
		d.print();

    		MyDate05 d2=new MyDate05(2017, 7, 19);
    		//매개변수가 있는 생성자 호출
    		d2.print();

- 필드값을 초기화 하고 있다
- 이렇게 필드랑 이름이 다를때는 상관없지만 필드와 이 생성자의 매개변수가 이름이 같을때는  this 연산자사용(곧 공부)
- print()메소드는 필드값을 출력하는용도로 사용되고 있다.public 메소드라서 다른 메소드에서 접근 가능하다
- 2017이 new_year로, 7이 new_month로, 19가 new_day로 가서 이걸 생성자에서 year= new_year; 필드값을 원하는 값으로 초기값 설정 가능

 

호출과정
1. 한 파일 내 두개의 클래스는 이미 컴파일이 된 상태
2. JVM은 가장 먼저 main을 실행함
3. 이때 MyDate05 의 객체인 d 생성함.
4. 기본생성자를 호출함
5. 힙에 필드위한 기억공간/필드값 자동 초기화

+ 매개변수 있는 생성자 있는경우엔 기본생성자 만들어둬야함 
+ 안에 아무 내용없어도 형식이라도 만들어둬야함

 

그림



매개변수와 필드의 이름이 같은 경우
- 매개변수의 값이 필드를 초기화 할 수 없음
- 오류가 생기진 않는다.
- 필드(멤버변수) 쪽에 this. 라고 붙여야함, this. 가 있으면 이름이 같아도 값 대입 가능

 

this. 예제

 

package p2022_06_28;

class MyDate04{   
  int year;    
  int month;    
  int day;  

  public MyDate04(){
    year=2016;    month=4;    day=1;
  }
 
  public MyDate04(int year,int month,int day){
   this.year=year;
   this.month=month;
   this.day=day;
  }
  public void print(){
	System.out.println(year+ "/" +month+ "/" +day); 
  }
}// MyDate end

public class ConstructorTest04 {     
  public static void main(String[] args) {
    MyDate04 d=new MyDate04();	//1생성자호출
    System.out.println(d.year); //바로 접근해서 출력
    System.out.println(d.month);
    System.out.println(d.day);
    d.print(); //메소드통해 출력

    MyDate04 d2=new MyDate04(2017, 7, 19);
    System.out.println(d2.year); //바로 접근해서 출력
    System.out.println(d2.month);
    System.out.println(d2.day);
    d2.print();
  }
}

d객체
- 여기 필드는 디폴트 접근제어자이므로 d.year로 바로 접근해서 출력 ㅏㄱ능
- 메소드 통해서 출력하는 방법되 있다.
- '//1생성자호출'에서 기본생성자를 호출해서 year=2016,month=4,day=1 로 초기화됨

d2객체
- 또다시 heap 상에서 새로운 공간을 생성함.
- 이 공간은 d2객체의 필드들을 저장하기 위한 공간이다

this.
- 내부 레퍼런스 변수
- this는 그 객체 를 의미함
- 객체 생성되어 매개변수 있는 생성자 호출할 때, 이 객체 d2가 가진 주솟값을 갖는게 this다
- 즉 this == d2를 의미한다 ( d2를 받는다 )
- 사용법 : this.필드 = 매개변수
- 생성자 안에서 멤버변수와 매개변수가 이름이 동일한 경우에 사용

- d2객체를 생성했을 때, 매개변수를 3개 가진 생성자를 호출한다, 그럼 year month day 값은 2017, 7, 19 로 설정이 된다.
- d2가 이 것들을 가리키고 있는데 this는 이 d2가 가리키는 것들을 똑같이 가리킨다 
- 즉 d2랑 this는 같은 주소를 갖고 있다
- d2.year == this.year
+ this. 을 안썼다고 오류가 생기진 않지만 매개변수의 값이 필드로 들어가지 않음 (값전달이안됨)-> 출력시 다 0이 나오는걸로 알 수 있다

 

그림



생성자의 매개변수로 멤버변수값 초기화하는법
1. 멤버변수와 매개변수의 이름을 다르게 설정
2. 멤버변수와 매개변수의 이름이 같고, 멤버변수 앞에 this를 붙인다.

생성자의 사용법
- 객체마다 언제나 같은 값으로 필드값 다 같게 설정할땐 기본생성자를 사용하고
- 객체가 생성될때마다 초기화할 값을(필드를) 다 다르게 설정하기 위해선 매개변수가 있는 생성자를 사용하는것임!

메소드가 하는 일
- 필드값을 수정, 출력, 필드값을 돌려주기

이클립스 생성자 만들기 기능
- 이클립스에 생성자 만들어주는 기능이 있다
- 오른쪽마우스 -> Source -> Generate Constructor using Fields
- Insertion point : 생성자가 들어갈 위치 지정
- Omit call to default constructor super() : 생성자 내부에 super()를 생략하기 위해서 체크(상속 공부한 뒤 공부)
- 자동으로 생성된 생성자에도 this 사용한다


this. 정리
- 생성자에서도 사용가능하고 메소드에서도 사용가능! (메소드에서 this.쓰는거 곧 한다)
- 생성자와 메소드 안에서 멤버변수와 매개변수 이름이 동일한 경우에 주로 사용함
- ex)

public Test(int a, int b) {
	this.a = a;
	this.b = b;
}


this() 정리
- 같은 클래스안에 있는 생성자를 호출할때 사용함(다른 클래스의 생성자는 안됨)
- 객체를 생성할때만 생성자를 호출할 수 있는게 아니라 this()를 통해서도 생성자를 호출 할 수도 있다.
- this()는 많이 쓰이진 않음

+ 상속 공부 후 super. , super() 를 배울것

메소드를 통해 필드값을 set 시키는 예제 (MyDate06/ConstructorTest06)

- 생성자를 통해서 객체를 생성할 때 필드값을 초기화 시킬 수 있다.
- 하지만 "중간에" 어떤 필드값 하나를 수정하고 싶을떄 생성자는 그 역할을 할 수 없다
- 생성자는 객체 호출시에 실행되므로
-> 중간에 변경하고 싶을때 메소드를 통해서 필드값 수정할 수 있다

메소드 역할 정리
1. 필드값 출력
2. 필드값 수정/변경 (생성자는 못함) -> set
3. 리턴자료형을 통해서 필드값을 돌려주는 역할도 함 (메소드 호출한곳으로 돌려줌) -> get

 

package p2022_06_28;

class MyDate06 {
	private int year; // 필드
	private int month;
	private int day;

//  public MyDate(){	//default 생성자
//  }  
	public MyDate06(int new_year, int new_month, int new_day) {
		year = new_year; // 2017
		month = new_month; // 7
		day = new_day; // 19
	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {
		this.month = month;
	}

	public int getDay() {
		return day;
	}

	public void setDay(int day) {
		this.day = day;
	}

	public void print() {
		System.out.println(year + "/" + month + "/" + day);
	}
}

public class ConstructorTest06 {
	public static void main(String[] args) {

		MyDate06 d = new MyDate06(2017, 7, 19);
		d.print();

		d.setYear(2022);
		d.setMonth(6);
		d.setDay(28);
		d.print();

		System.out.println("year : " + d.getYear());
		System.out.println("month : " + d.getMonth());
		System.out.println("day : " + d.getDay());
	}
}

- 필드값들은 private
- 디폴트생성자는 쓰는 일이없으면 안만들어도됨
- 생성자로 필드값을 초기화 하고 있다
- 연도값을 수정하고 싶을땐? -> 생성자가 할수없다 메소드가 해야함 -> 메소드로 수정
- 다른 클래스에 있는 main에서 호출 하여 필드값 수정할 것이므로 메소드 접근제어자는 public / default 여야한다. 

 

그림


메소드에서 this. 사용
- setYear 메소드에서 필드와 매게변수가 또 같은 이름이다
- 매개변수값이 필드에 안들어감 즉 수정이안됨
-> 수정 위해서는 this.를 붙여줘야함
- 생성자도 그렇고 메소드 안에서도 this. 쓸 수 있다.

메소드를 통한 필드값 수정 정리
- 생성자통해 필드값 수정변경 불가능
- 또 다른 객체를 생성하면서 새로운 공간을 만들지 않도록 주의
- 기존값을 수정하기위해선 메소드를 이용해야한다

이클립스 필드값 수정해주는 메소드 생성
- 오른쪽 버튼 -> Source -> Generate Getters and Setters

Sort by
- Fields in getter/setter pairs : getYear setYear getMonth setMonth  순서
- First getters the setters : getYear getMonth setYear setMonth 순서

getters 와 setters
- set으로 시작하는 메소드를 setters 메소드
- get으로 시작하는 메소드를 getters 메소드
- getters method : getYear(), getMonth(), getDay()
- setters method : setYear(), setMonth(), setDay()

setters
- 필드값을 매개변수로 전달된 값으로 설정/수정하기 위한 메소드이다
- 생성자는 객체 생성시에 초기값 설정할떄만 가능한거고 변경은 setters 메소드로 해야한다

getters
- 이 getters 메소드 앞에 있는 자료형에 맞게 값을 돌려주는데 생성자에의해 할당되거나 수정된 필드값을 값을 호출한 곳으로 돌려줌
ex) getYear() 은 year 란 필드값을 돌려줌 return year;

this() 사용 예제
- this() : 같은 클래스 안에 있는 생성자를 호출하라는 의미로 사용됨

class MyDate10{   

  private int year;    
  private int month;    
  private int day;

  public MyDate10(){
    this(2016, 1, 1);                   
  }  
  public MyDate10(int new_year){
    this(new_year, 1, 1);                
  }  
  public MyDate10(int new_year, int new_month){
     this(new_year, new_month, 1);    
  }  
  public MyDate10(int new_year,int new_month,int new_day){
    year=new_year;
    month=new_month;
    day=new_day;
  }    

  public void print(){
	System.out.println(year+ "/" +month+ "/" +day); 
  }
}

public class ConstructorTest10 {     
  public static void main(String[] args) {
    MyDate10 d=new MyDate10(2017, 7, 19);  
    d.print();
    MyDate10 d2=new MyDate10(2017, 7);     
    d2.print();
    MyDate10 d3=new MyDate10(2017);       
    d3.print();
    MyDate10 d4=new MyDate10();          
    d4.print();
  }
}

생성자 호출
- MyDate06 예제에서 클래스의 객체를 만들 때는 다른 클래스에서 만든다
- 즉, MyDate06 예제에서 생성자를 호출 할 때는 다른 클래스의 생성자를 호출 했다.
- 일반적으로 다른 클래스의 생성자 호출도 가능하고 같은 클래스의 생성자 호출도 가능하다
ex) ConstructorTest10 클래스안의 main 메소드 안에서 MyDate10 d = new MyDate10(2017,7,19) 
하는건 MyDate10 클래스 안의 생성자 즉 다른 클래스의 생성자를 호출한거임
- 하지만 this() 는 같은 클래스 안에 있는 생성자만 호출할 수 있다

 

위 예제 생성자 부분만 보기

  public MyDate10(){
    this(2016, 1, 1);                   
  }  
  public MyDate10(int new_year){
    this(new_year, 1, 1);                
  }  
  public MyDate10(int new_year, int new_month){
     this(new_year, new_month, 1);    
  }  
  public MyDate10(int new_year,int new_month,int new_day){
    year=new_year;
    month=new_month;
    day=new_day;
  }

생성자 오버로딩
- 여기서 MyDate10 생성자가 4개다
- 생성자 이름이 같아도 구분이 된다면 같은 이름의 생성자가 여러개 있어도 됨
- 한개의 클래스 안에 여러개의 생성자를 만드는 것 = 생성자 오버로딩 (생성자의 이름은 클래스명이랑 같아야한다)

생성자 오버로딩을 위한 구분
1. 매개변수의 자료형을 다르게 하는법
2. 매개변수의 개수를 다르게 하는법
3. 매개변수가 여러개있을때 순서를 바꾸는방법! 도 된다. 자료형,개수 같아도 순서가 다르면 구분됨

+ MyDate10 클래스에선 생성자의 구분을 매개변수의 개수 로 하고 있다.

 

위 예제 설명

    MyDate10 d2=new MyDate10(2017, 7);     
    d2.print();

1. 여기서 MyDate10(2017,7) 을 할 때, 매개변수가 2개인 생성자가 위에있다

  public MyDate10(int new_year, int new_month){
     this(new_year, new_month, 1);    
  }

2. 로 가서 위의 this(new_year, new_month, 1);  가

  public MyDate10(int new_year,int new_month,int new_day){
    year=new_year;
    month=new_month;
    day=new_day;
  }

3. 인 매개변수가 3개인 생성자를 부르면서 (new_year, new_month, 1) 를 매개변수로 전달
+ 이 매개변수가 3개인 생성자가 있어야만 this(2017,7, 1); 이게 가능한거임

MyDate10 d3=new MyDate10(2017);

- 시에

  public MyDate10(int new_year){
    this(new_year, 1, 1);                
  }

- 이 생성자가 호출되서 여기서 다시 this()로 매개변수가 3개인 생성자를 호출 하면서 (2017,1,1)값을 전달

+

  MyDate10 d4=new MyDate10();

- 를 main에 쓰면

  public MyDate10(){ //기본생성자
    this(2016, 1, 1);                   
  }

- 여기로 가서 this() 통해서 매개변수가 3개인 생성자 다시 호출하면서 매개변수로 값을 2016,1,1 넘겨줌

 

생성자 오버로딩 예시(String 클래스 by api 문서)
String 클래스의 생성자
- 모두 전부 이름이 String 이고 매개변수 부분이 다르다. = "생성자 오버로딩"
- 생성자 호출할때 구분이 가능해야 생성자 오버로딩이 잘 된거임
- 우리는 String(String original) 생성자를 사용

+ Recent posts