/* 생성자
* 생성자란 클래스가 인스턴스화 되어질 때 인스턴스를 생성시켜주는 코드
*
* 생성자는 이 외에도 아래가 같은 기능이 있음
* 1. 클래스의 인스턴스 생성
* 2. 멤버 필드 초기화
* 3. 필요에 따라 초기화 메소드를 실행
*
* 생성자 없이는 인스턴스를 발생시틸 수 없음
*
* 생성자의 형식
* 메소드와 유사하게 생김. 하지만 메소드와 기능적인 부분에서 차이가 있음
* 1. 생성자 이름은 반드시 클래스 이름과 같아야 함
* 2. 메소드가 아니기 때문에 리턴 타입을 선언할 수 없음
*
* 기본 생성자 (Default Constructor)
* 자바에서는 모든 클래스마다 컴파일 시 기본 생성자를 자동으로 넣어줌
* 단, 클래스에 생성자가 하나라도 있으면 기본 생성자를 제공하지 않음
* 기본 생성자는 파라미터가 없는 생성자를 말함
* 기본 생성자를 통해 생성된 객체를 기본 객체라고 함, 또한 모든 필드 값은 기본 값으로 초기화
*/
class Apple {
String name;
int age;
int money;
Apple() { // 기본 생성자, 리턴 타입이 없어 생성자 역할을 함
System.out.println("생성자가 동작합니다.");
}
Apple(String name) { // 생성자
this.name = name;
}
Apple (String name, int age) { // 생성자, 파타미터에 변수가 들어감
// this.name = name; name 만 사용하는 생성자를 호출하는 것으로 대신할 수 있음
this(name); // Apple(String name) 생성자 호출
this.age = age;
}
Apple (int age, String name) { // 위 생성자와 다른 생성자, 위치가 다르면 다른 생성자로 인식
this.name = name;
this.age = age;
}
Apple(String name, int age, int money) {
// this.name = name;
// this.age = age;
this(name, age); // Apple (String name, int age) 생성자 호출
/*
* 같은 클래스에서 정의된 다른 생성자를 호출하는 키워드 this(type)
* 호출하려는 새엇ㅇ자의 파라미터 순서에 맞게 호출하면 자동 호출
* this 생성자 호출은 생성자 첫 머리에서만 호출 가능
* 딱 한 번만 호출 가능
*/
this.money = money;
}
/* 생성자(메소드) 오버로드/오버로딩
* 같은 이름의 메소드 또는 생성자를 정의할 때
* 같은 지의 판별요소로 적용되는 기준을 메소드/생성자 시그니쳐라고 함
* 시그니쳐는 파라미터의 개수, 순서, 타입이 모두 같을 때 같은 생성자/메소드 라고 인지
* 하나라도 다르다면 다른 메소드/생성자로 인식합니다.
* 호출 시 호출하는 파라미터의 시그니쳐를 보고 해당 생성자/메소드를 동적으로 호출
* 이렇게 같은 이름의 생성자/메소드를 시그니쳐만 다르게 하여
* 정의하는 기술을 오버로드/오버로딩 이라고 함
*/
void Apple() {} // 클래스와 같은 이름이지만 메소드 역할을 함
// 생성자는 리턴 타입이 없기 때문에 생성자가 될 수 없음
int sleep() {
return 0;
}
}
public class Constructor01 {
public static void main(String[] args) {
Apple apple = new Apple(); // 생성자가 동작합니다. 출력
apple = new Apple("홍길동", 1);
Apple apple2 = new Apple("김길동");
Apple apple3 = new Apple("김길동", 1);
Apple apple4 = new Apple(120, "김길동");
Apple apple5 = new Apple("김길동", 1, 20000);
}
}
Getter 와 Setter
package com.poseidon.constructor; // Human 클래스가 들어있는 패키지
public class Human {
String name;
int age;
String addr;
int money;
public Human() { }
public Human(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { // get 은 리턴 타입이 있음
return name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) { // set 은 리턴이 없음, 파라미터가 있음
this.money = money;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public void setName_Age(String name, int age) {
this.name = name;
this.age = age;
}
}
Human 클래스를 사용하는 다른 패키지의 클래스
package test; // 다른 패키지
import com.poseidon.constructor.Human; // 패키지 주소와 클래스 이름까지 import
public class Test01 {
public static void main(String[] args) {
Human h1 = new Human("홍길동", 15);
// System.out.println(h1.name);
// Human 클래스에서 h1.name, name 이 public 이 아니라 호출 불가
// 대신에 Getter, Setter 사용, Human 클래스에 Getter, Setter 메소드 생성
System.out.println(h1.getName()); // 홍길동 출력
h1.setMoney(3000);
System.out.println(h1.getMoney()); // 3000 출력
h1.setAddr("서울시 서대문구");
System.out.println(h1.getAddr()); // 서울시 서대문구 출력
h1.setName_Age("홍홍길동", 150);
}
}
질문
- class 앞에 public 이 없고 메소드에 public 이 있으면 메소드만 패키지 외부에서 사용 가능한지
답 : class 가 외부로 나가지를 못하니 메소드도 외부에서 호출 불가능
setter 는 한번에 여러 개 설정이 가능한데 getter 는 한번에 여러 개 리턴이 가능한 지
답 : 리턴은 한번에 하나만, 여러 개 리턴이 필요 할 경우 배열이나 다른 방법으로 해야 함
'JAVA' 카테고리의 다른 글
231219 Java (0) | 2023.12.19 |
---|---|
231218 Java (0) | 2023.12.18 |
231214 Java 객체지향 (2) | 2023.12.14 |
231213 Java (0) | 2023.12.13 |
231212 Java (0) | 2023.12.12 |