변수의 종류
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) 생성자를 사용
'국비지원 과정 > JAVA' 카테고리의 다른 글
코딩 8일 / 2022.06.30 / JAVA의 싱글톤, final, 날짜시간 관련 클래스 (0) | 2022.07.07 |
---|---|
코딩 7일 / 2022.06.29 / JAVA의 접근제어자,메소드 오버로딩,정적 변수,정적 메소드 (0) | 2022.07.05 |
코딩 5일 / 2022.06.27 / JAVA의 배열2,참조형,클래스,객체 (0) | 2022.06.28 |
코딩 4일 / 2022.06.24 / JAVA의 제어문3,메소드,배열1 (0) | 2022.06.27 |
코딩 3일 / 2022.06.23 / JAVA의 제어문2, 난수발생 (0) | 2022.06.26 |