1. 생성자( constructor )
역할
: heap 메모리에 생성된 인스턴스내의 인스턴스 변수를 초기화하는 역할.
인스턴스를 직접접근할수도 있으나 권장하지 않음.
이유는 잘못된 데이터를 필터링없이 저장이 가능하기 때문이다.
ex) c1.age = 2000; // 문법적으로는 문제가 없으나 논리적으로 문제가있음.
문법:
public 클래스명( [변수, 변수, ...] ) {
// 인스턴스 변수 초기화
}
- 파라미터([변수, 변수, ...]) 가 있을수도 있고 없을수도 있다.
특징:
- 반드시 생성자가 수행이 될려면 반드시 생성자를 호출해야 된다.
- 호출방법:
클래스명( );
ex) new Cat( );
- 생성자는 명시적으로 지정할 수도 있고 자동으로 지정될 수 있다.
자동으로 지정되는 생성자의 형식은 다음과 같다.
public 클래스명( ) {
}
// 자동으로 지정되는 생성자는 `기본생성자, default 생성자`
라고한다.
단, 명시적으로 생성자를 지정하면 기본생성자는 생성안됨.
이유는 기본생성자로 new 하지 말고 명시적으로 지정한 생성자로
new 하라는 의미이다.
(기본생성자는 파라미터가 없는 생성자를 얘기한다.)
필요시 기본생성자를 명시적으로 지정할 수 있다.
- 필요시 생성자를 여러개 지정할 수 있다.
식별이 가능하기 위해서 반드시 생성자( [파라미터,...] ) 의 파라미터는
달라야 된다.
argument list(인자리스트; [파라미터,...])는 개수 또는 타입 또는 순서
가 달라야한다.
이렇게 하나의 클래스에 여러개의 생성자를 지정할 수 있고
이것을 `오버로딩(overloading) 생성자` 라고 부른다.
- 생성자이용해서 초기화 장점 2가지
1) 생성자안에서 값의 유효성체크가 가능하다.
2) 직접접근한 방법보다 훨씬 빠르게 초기화가 가능하다.
- 오버로딩 생성자 지원하는 이유?
사용자가 모든 인스턴스변수의 값을 알고 있지 못한 경우도 있다.
따라서 알고있는 값만 초기화하는 역할의 오버로딩 생성자가 필요하다.
- 이클립스에서 오버로딩 생성자 코드를 자동으로 추가할수 있게 지원됨.
package exam09_클래스2_생성자;
// 고양이 객체 관리용도
/*
*
1.클래스 문법:
접근지정자 class 클래스명 {
}
2. 클래스명
- 사용자 정의 식별자
- 반드시 첫글자는 대문자
- 의미있는 명사형
3. 클래스 구성요소
- 변수 (멤버, 멤버변수, 인스턴스 변수)
- 메서드 (멤버, 멤버메서드)
- 생성자( constructor ) : 멤버에 포함안됨.
4. 클래스 사용
- 반드시 객체생성해야 된다.
객체 생성 작업을 '인스턴스화' 한다고 함.
- new 이용. 생성된 클래스는 heap 메모리에 인스턴스로 생성됨.
- 문법:
클래스명 변수명 = new 클래스명([값1, 값2, ...]);
* arguments([값1, 값2, ...]) 라고 하는데 있을수도 있고 없을수도 있다.
*/
public class Cat1 {
// 인스턴스 변수
// heap 메모리에는 자동으로 초기화가 되어있다.
String name; // null
int age; // 0
String gender; // null
// 생성자
// => 인스턴스변수를 초기화
// 기본생성자는 자동으로 생성됨.
public Cat1( ) {
System.out.println("Cat() 생성자 호출");
}
// 명시적으로 생성자를 만들면 기본생성자는 자동생성이 되자않는다.
public Cat1(String n) {}
}
package exam09_클래스2_생성자;
public class TestCat1 {
// 기본생성자는 자동으로 생성됨.
// public TestCat() { }
public static void main(String[] args) {
Cat1 c1 = new Cat1(); // Cat 에서는 파라미터가있는데 여기에는 없어서 오류가 발생
// new Cat(); : 생성자 호출
// 초기화1) 직접초기화
// ==> 객체생성후 인스턴스변수를 직접 접근해서 초기화
c1.name = "야옹이";
c1.age = 2;
c1.gender = "암컷";
System.out.printf("이름: %s, 나이: %d, 성별: %s", c1.name, c1.age, c1.gender);
// 단점: 문법적으로는 문제가 없으나 논리적으로 문제가 있음
// ex) age = 2000; => 논리적으로 문제가 있음.
// 초기화2) 생성자이용 (권장함)
}
}
################################################################################################
package exam09_클래스2_생성자2;
// 고양이 객체 관리용도
/*
*
1.클래스 문법:
접근지정자 class 클래스명 {
}
2. 클래스명
- 사용자 정의 식별자
- 반드시 첫글자는 대문자
- 의미있는 명사형
3. 클래스 구성요소
- 변수 (멤버, 멤버변수, 인스턴스 변수)
- 메서드 (멤버, 멤버메서드)
- 생성자( constructor ) : 멤버에 포함안됨.
4. 클래스 사용
- 반드시 객체생성해야 된다.
객체 생성 작업을 '인스턴스화' 한다고 함.
- new 이용. 생성된 클래스는 heap 메모리에 인스턴스로 생성됨.
- 문법:
클래스명 변수명 = new 클래스명([값1, 값2, ...]);
* arguments([값1, 값2, ...]) 라고 하는데 있을수도 있고 없을수도 있다.
*/
public class Cat2 {
// 인스턴스 변수
// heap 메모리에는 자동으로 초기화가 되어있다.
String name; // null
int age; // 0
String gender; // null
// 생성자
// => 인스턴스변수를 초기화
// 기본생성자는 자동으로 생성됨.
public Cat2( ) {
System.out.println("Cat() 생성자");
}
// 명시적으로 생성자를 만들면 기본생성자는 자동생성이 되자않는다.
public Cat2(String n) {
System.out.println("Cat(String n) 생성자");
}
public Cat2(int n) {
System.out.println("Cat(int n) 생성자");
}
public Cat2(String n, int n2) {
System.out.println("Cat(String n, int n2) 생성자");
}
public Cat2(String n, int n2, String n3) {
System.out.println("Cat(String n, int n2, String n3) 생성자");
}
}
package exam09_클래스2_생성자2;
public class TestCat2 {
// 기본생성자는 자동으로 생성됨.
// public TestCat() { }
public static void main(String[] args) {
Cat2 c1 = new Cat2("야옹이"); // -> Cat(String n)
Cat2 c2 = new Cat2(); // -> Cat()
Cat2 c3 = new Cat2(2); // -> Cat(int n)
Cat2 c4 = new Cat2("야옹이",2); // Cat(String n , int n2)
// Cat c5 = new Cat(2,"야옹이") 에러발생 -> 관련 파라미터를 가진 생성자가 없기때문.
Cat2 c6 = new Cat2("야옹이",2,"암컷");
// new Cat(); : 생성자 호출
// 초기화1) 직접초기화
// ==> 객체생성후 인스턴스변수를 직접 접근해서 초기화
c1.name = "야옹이";
c1.age = 2;
c1.gender = "암컷";
System.out.printf("이름: %s, 나이: %d, 성별: %s \n", c1.name, c1.age, c1.gender);
// 단점: 문법적으로는 문제가 없으나 논리적으로 문제가 있음
// ex) age = 2000; => 논리적으로 문제가 있음.
// 초기화2) 생성자이용 (권장함)
}
}
################################################################################################
package exam09_클래스2_생성자3_초기화;
// 고양이 객체 관리용도
/*
*
1.클래스 문법:
접근지정자 class 클래스명 {
}
2. 클래스명
- 사용자 정의 식별자
- 반드시 첫글자는 대문자
- 의미있는 명사형
3. 클래스 구성요소
- 변수 (멤버, 멤버변수, 인스턴스 변수)
- 메서드 (멤버, 멤버메서드)
- 생성자( constructor ) : 멤버에 포함안됨.
4. 클래스 사용
- 반드시 객체생성해야 된다.
객체 생성 작업을 '인스턴스화' 한다고 함.
- new 이용. 생성된 클래스는 heap 메모리에 인스턴스로 생성됨.
- 문법:
클래스명 변수명 = new 클래스명([값1, 값2, ...]);
* arguments([값1, 값2, ...]) 라고 하는데 있을수도 있고 없을수도 있다.
*/
public class Cat3 {
// 인스턴스 변수
// heap 메모리에는 자동으로 초기화가 되어있다.
String name; // null
int age; // 0
String gender; // null
// 생성자
// => 인스턴스변수를 초기화
// 기본생성자는 자동으로 생성됨.
public Cat3( ) {
System.out.println("Cat() 생성자");
}
public Cat3(String n, int n2, String n3) {
System.out.println("Cat(String n, int n2, String n3) 생성자");
System.out.println(n + "\t" + n2 + "\t" + n3);
// 유효성 체크가 가능하다.
name = n;
if(n2 <= 20) {
age = n2;
} else {
System.out.println("유효성체크: age 를 확인하세요.");
}
gender = n3;
}
}
package exam09_클래스2_생성자3_초기화;
public class TestCat3 {
// 기본생성자는 자동으로 생성됨.
// public TestCat() { }
public static void main(String[] args) {
// 야옹이 2 암컷
// 초기화2 : 생성자 이용 (권장)
// -> Cat(String n, int n2, String n3)
Cat3 c1 = new Cat3("야옹이",2000,"암컷");
// 변수(인스턴스변수)출력
System.out.printf("이름: %s, 나이: %d, 성별: %s \n", c1.name, c1.age, c1.gender);
///////////////////////////////////////////////////////////////////
Cat3 c2 = new Cat3();
// -> Cat( )
// 초기화1 ==> 객체생성후 인스턴스변수를 직접 접근해서 초기화 (권장안함)
c2.name = "야옹이";
c2.age = 2000;
c2.gender = "암컷";
// 변수출력
System.out.printf("이름: %s, 나이: %d, 성별: %s", c2.name, c2.age, c2.gender);
}
}
'[study]이론정리 > JAVA(eclipse)' 카테고리의 다른 글
java 6일차 _01. 생성자(3) 생성자를 좀더 쉽게 생성 (0) | 2024.03.15 |
---|---|
java 6일차 _01. 생성자(2) (0) | 2024.03.15 |
java 6일차_ 5일차 정리 (0) | 2024.03.15 |
참고사이트(1일차 ~ 5일차) (0) | 2024.03.14 |
java 5일차 _ 06. 객체 및 클래스( (1) Cat 클래스작성 ) (0) | 2024.03.14 |