객체 사용 단계
1. 라이브러리 파일에서 생성자 선언
2. 실행 파일에서 new 연산자를 통해 생성자 실행
3. 힙 영역에 객체가 생성됨
4. 객체의 번지가 리턴되면서 클래스 변수에 저장됨
기본 생성자
- 생성자란 ? 객체의 초기화 담당
- 클래스는 항상 생성자를 가진다.
- 생성자 선언 생략 시 컴파일러가 자동으로 기본 생성자를 만들어준다.
- 기본 생성자 앞에 public이 붙을지에 대해서는 해당 클래스를 따라간다. 해당 클래스가 public 으로 선언되면 기본 생성자도 public이 붙는다.
- 기본 생성자가 자동으로 생성되는데도 굳이 생성자를 명시적으로 선언하는 이유는 객체를 다양한 값으로 초기화하기 위함이다.
생성자 선언부
- 형태 : 클래스 이름 (매개변수 선언 부분)
- 매개변수 : new 연산자로 생성자를 호출할 때 값을 생성자 블록 안으로 전달해주는 역할을 한다. 생략할 수도 있고 여러 개 선언도 가능하다.
class Car {
//생성자
Car(int speed, String model) {
}
}
public class CarExample {
public static void main(String[] args) {
//생성자 호출
Car myCar = new Car(60, "그랜저"); // 타입에 맞춰서 호출
}
}
필드 초기화
방법 1. 초기화 안함 -> 기본 초기값으로 자동 설정됨
방법 2. 필드를 선언할 때 초기화 -> 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 가지게 됨
값 변경이 가능하긴 하지만 생성되는 시점에는 필드 값이 같음
방법 3. 생성자에서 초기화 -> 초기화될 때부터 서로 다른 값들로 초기화해주어야한다면 생성자에서 초기값을 주면 된다.
방법 4. 매개변수를 통해서 초기화 -> ' this.필드 = 매개변수 ' 의 형태로 작성하여 실행 파일에서 new 연산자를 통해 초기화해준다.
public class Korean {
//필드
String nation = "대한민국"; // 필드에서 초기화
String name;
String ssn;
//생성자
public Korean(String n, String s) { // 생성자에서 매개변수를 받아 초기화
this.name = n;
this.ssn = s;
}
}
public class KoreanExample {
public static void main(String[] args) {
Korean k1 = new Korean("김자바","123"); // 생성자로 매개변수 전달
System.out.println("k1.name : " + k1.name);
System.out.println("k1.ssn : " + k1.ssn);
Korean k2 = new Korean("박자바", "456"); // 생성자로 매개변수 전달
System.out.println("k2.name : " + k2.name);
System.out.println("k2.ssn : " + k2.ssn);
}
}
k1.name : 김자바
k1.ssn : 123
k2.name : 박자바
k2.ssn : 456
- 통상적으로 매개변수 이름은 필드와 동일하게 지정해준다.
- 같은 이름으로 지정했을 때 생성자 내부에서 필드로 접근이 불가능해진다. (매개변수가 필드보다 더 우선순위라서..)
- 이를 해결하기위해 필드 앞에 this.를 붙여준다.
this 참조 변수
- Math.random 처럼 참조 변수를 사용할때 온점 ( . ) 을 사용하여 접근한다.
- 마찬가지로 여기서 this는 객체 자기 자신의 참조이고 this.필드라고 쓰는 것은 this 라는 참조 변수로 필드를 사용하는 것이다.
- 매개변수로 초기화할 때 생성자에 매개변수 입력시 필드 개수 만큼 선언해야한다.
- 보통의 경우 중요한 몇 개 필드는 매개변수로 초기화, 나머지 필드는 필드 선언할 때 혹은 생성자 내부에서 초기화된다.
생성자 오버로딩
- 생성자 오버로딩이란, 생성자를 여러 개 선언하는 것
- 생성자를 왜 여러개나 선언해주어야 할까? -> 실행 파일에서 데이터를 제공할때 매개변수를 하나만 보내줄 수도 있고 두 개 혹은 그 이상 보내줄 수가 있다.
- 그 때마다 모든 조건에 수용할 수 있어야하는데 기본 생성자는 그럴 수가 없다. 따라서 우리가 직접 생성자를 여러 개 생성해준다.
- 주의 : 매개변수의 이름만 바뀐 것은 서로 다른 생성자를 만들었다고 할 수 없다.
class Car2 {
// 필드
String company = "현대자동차";
String model;
String color;
int maxSpeed;
// 생성자
Car2() { //(1)번 생성자
}
Car2(String model) { //(2)번 생성자
this.model = model;
}
Car2(String model, String color) { //(3)번 생성자
this.model = model;
this.color = color;
}
Car2(String model, String color, int maxSpeed) { //(4)번 생성자
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
public class Car2Example {
public static void main(String[] args) {
Car2 c1 = new Car2(); //(1)번 생성자를 선택함
System.out.println(c1.company); // 현대자동차
System.out.println(c1.color); // null이 뜸
Car2 c2 = new Car2("자가용"); //(2)번 생성자를 선택함
System.out.println(c2.company); // 현대자동차
System.out.println(c2.model); // 자가용
Car2 c3 = new Car2("자가용","빨강"); //(3)번 생성자를 선택함
System.out.println(c3.company); // 현대자동차
System.out.println(c3.model); // 자가용
System.out.println(c3.color); // 빨강
Car2 c4 = new Car2("택시","노랑", 100); //(4)번 생성자를 선택함
System.out.println(c4.company); // 현대자동차
System.out.println(c4.model); // 택시
System.out.println(c4.color); // 노랑
System.out.println(c4.maxSpeed); // 100
}
}
오버로딩(Overloading) vs 오버라이딩(Overriding)
shaking blog :: [JAVA] 오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점 (tistory.com)
다른 생성자 호출 : this ( ) 코드 사용
- 아까 this.필드명이랑 다름
- 생성자 오버로딩이 많아지면 코드가 중복이 된다.
- 중복 코드를 제거하기위해 this ( ) 코드를 사용한다.
- 자신의 다른 생성자를 호출하는 코드로서 반드시 생성자의 첫번째 줄에만 나올 수 있다.
public class Car3 {
// 생성자
String company = "현대자동차";
String model;
String color;
int maxSpeed;
//필드
Car3() {
}
Car3(String model) {
this(model,"초록", 200);
}
Car3(String model, String color) {
this(model, color, 400);
}
Car3(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
public class Car3Example {
public static void main(String[] args) {
Car3 c1 = new Car3();
Car3 c2 = new Car3("아반떼");
Car3 c3 = new Car3("그랜저","분홍");
Car3 c4 = new Car3("그랜저","노랑",300);
System.out.println(c1.company); // 현대자동차
System.out.println(c1.model); // null
System.out.println(c1.color); // null
System.out.println(c1.maxSpeed); // 0
System.out.println(c2.company); // 현대자동차
System.out.println(c2.model); // 아반떼
System.out.println(c2.color); // 초록
System.out.println(c2.maxSpeed); // 200
System.out.println(c3.company); // 현대자동차
System.out.println(c3.model); // 그랜저
System.out.println(c3.color); // 분홍
System.out.println(c3.maxSpeed); // 400
System.out.println(c4.company); // 현대자동차
System.out.println(c4.model); // 그랜저
System.out.println(c4.color); // 노랑
System.out.println(c4.maxSpeed); // 300
}
}
'👨💻 2. 웹개발_Back end > 2-1 Java' 카테고리의 다른 글
[JAVA] 06-5 인스턴스 멤버와 정적 멤버 (0) | 2021.08.03 |
---|---|
[JAVA] 06-4 메소드 (0) | 2021.08.02 |
[JAVA] 06-2 필드 (0) | 2021.08.02 |
[JAVA] 06-1 객체 지향 프로그래밍 (0) | 2021.07.30 |
[JAVA] 05-3 열거 타입 (0) | 2021.07.30 |
댓글