back-end&DB/Java
JAVA 생성자와 접근제한자
Hoon0211
2023. 5. 19. 14:36
728x90
1.생성자
1.1 생성자의 특징
- 생성자는 하나 이상 선언되어야 함
- 생성자 이름은 클래스 이름과 동일
- 생성자는 리턴 타입을 지정 할 수 없다.
- 생성자는 new를 통해 객체를 생성할 때만 호출됨
- 생성자는 메소드다
개발자는 생성자를 정의하지 않으면 자동으로 기본 생성자가 정의됨
컴파일러에 의해 자동 생성
기본 생성자를 디폴트 생성자(default constructor)라고도 함
만약 default 생성자만 존재하고 default에 아무런 기능이 없을 경우 생략이 가능함
public class Student { // 클래스의 이름과 동일
String name;
String number;
int age;
public Student(String name, String number, int age) { // 클래스의 이름과 동일
this.name = name; //리턴 타입은 없다.
this.number = number; //리턴 타입은 없다.
this.int = age; //리턴 타입은 없다.
}
// default 생략이 가능하다.
aaa.name = "에이군";
aaa numner = "20230001";
aaa age = 20;
Student aaa = new Student("에이군","20230001",20,);
2. 생성자 종류
- public
모든 클래스 파일에서 사용이 가능하다.
-protected
같은 클래스 같은 패키지에서 불러오는것이 가능하다.
- default
같은 클래스 같은 패키지에서 불러오는 것이 가능하다.
default 는 클래스에서 접근 제한자 생략이 가능하다.
String default_string;
void method_test() {
}
- pruvate
본인 클래스 파일에서만 접근이 가능
private int hp;
private int attack;
private int defense;
private int speed;
private String type;
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
public | ㅇ | ㅇ | ㅇ | ㅇ |
protected | ㅇ | ㅇ | ㅇ | |
default | ㅇ | ㅇ | ||
private | ㅇ |
- this
생성자의 이름으로 클래스이름 대신 this를 사용
한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능
public Pokemon(int hp, int attack, int defense, int speed, String type) {
this.hp = hp;
this.attack = attack;
this.defense = defense;
this.speed = speed;
this.type = type;
}
3. 캡슐화(Encapsulation)
외부에서 공개된 메소드를 통해 접근이 가능
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
4. 생성자 예제
- Calculator 클래스를 작성하세요
Calculator클래스의 필드 | |||
접근지정자 | 타입 | 변수명 | 설명 |
private | int | num1 | 첫 번째 정수 |
private | int | num2 | 두 번째 정수 |
Calculator클래스의 메소드 | |||
이름 | 리턴타입 | 매개변수 | 설명 |
calculator | X | int 변수이름, int 변수이름 |
2개의 매개변수를 가진 생성자로 num1, num2 |
sum | int | - | num1 과 num2를 더한 값 |
sub | int | - | num1 과 num2를 뺀 값 |
mul | int | - | num1 과 num2를 곱한 값 |
div | double | - | num1 과 num2를 나눈 값 |
public class Calculator {
private int num1;
private int num2;
public Calculator(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public int sum() {
return num1 + num2;
}
public int sub() {
return num1 - num2;
}
public int mul() {
return num1 * num2;
}
public double div() {
return (double)num1/num2;
}
}
public class Calculator_main {
public static void main(String[] args) {
Calculator cal = new Calculator(75, 5);
int sum_result = cal.sum();
System.out.println(sum_result);
...
}
5. 메소드 오버로딩
메소드 이름이 같아야 한다.
매겨변수의 개수 또는 타입이 달라야 한다.
- 오버로딩의 장점
메소드의 이름 낭비 방지
같은 메소드에 여러종류의 매개변수를 받을 수 있음
public class Calculator {
private int num1;
private int num2;
public Calculator(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public Calculator(int num1) { // << 오버로딩
this.num1 = num1;
}
public int square() {
return num1 * num1;
}
Calculator cal = new Calculator(75, 5);
int sum_result = cal.sum();
System.out.println(sum_result);
System.out.println(cal.sub());
Calculator cal2 = new Calculator(12);
System.out.println(cal2.square());
728x90