6.5 클래스의 구성 멤버
(1) 필드
: 객체의 데이터를 저장하는 역할 수행
- 선언 형태는 변수 선언과 비슷, 하지만 쓰임새가 다름
(2) 생성자
: new 연산자로 객체를 생성할 때 객체의 초기화 역할 담당
- 선언 형태는 메소드와 비슷, 하지만 리턴 타입 X, 클래스 이름과 이름 동일
(3) 메소드
: 객체가 수행할 동작. 객체와 객체 간 상호 작용을 위해 호출됨
public class ClassName {
//필드 선언
int fieldName;
//생성자
ClassName() {
}
//메소드 선언
int methodName() {
}
}
6.6 필드 선언과 사용
필드 선언
타입 필드명 [ = 초기값 ] ;
필드와 로컬변수의 차이
구분 | 필드 | 로컬변수 |
선언 위치 | 클래스 선언 블록 | 생성자, 메소드 선언 블록 |
존재 위치 | 객체 내부에 존재 (heap 또는 메소드) | 생성자, 메소드 호출 시에만 존재 (스택) |
사용 위치 | 객체 내, 외부 어디든 사용 | 생성자, 메소드 블록 내부에서만 사용 (중괄호 안) |
- 초기값을 제공하지 않을 경우, 필드는 객체 생성 시 자동으로 기본값으로 초기화됨 (0, 0.0, false / 참조 - null)
필드 사용
: 필드값을 읽고 변경하는 것
- 필드는 객체의 데이터.
객체가 존재하지 않으면 필드도 존재하지 않음 => 클래스로부터 객체가 생성된 후에 필드 사용 가능
- 객체 내부의 생성자와 메소드 내부에서 사용 가능
- 객체 외부에서도 접근해 사용 가능 (. 도트 연산자)
6.7 생성자 선언과 호출
- new 연산자 : 객체를 생성한 후 연이어 생성자를 호출해 객체를 초기화하는 역할 수행
생성자가 성공적으로 실행이 끝나면 new 연산자는 객체의 주소를 리턴,
리턴된 주소는 클래스 변수에 대입되어 객체의 필드나 메소드에 접근할 때 이용됨
*객체 초기화 = 필드 초기화를 하거나 메소드를 호출해 객체를 사용할 준비를 하는 것
클래스 변수 = new 클래스();
//클래스() 부분 = 생성자 호출 부분
기본 생성자
- 모든 클래스는 생성자가 하나 이상 존재함
- 클래스에 생성자 선언이 없다면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가시킴
[public] 클래스() { }
i) 클래스가 public class로 선언 -> 기본 생성자도 public이 붙음
public class Car {
}
public class Car{
public Car() { } //자동 추가
}
따라서 아래와 같이 new 연산자 뒤에 기본 생성자 호출 가능
Car myCar = new Car(); // Car()로 기본 생성자 호출
ii) 클래스가 public 없이 class로만 선언 -> 기본 생성자에도 public이 붙지 않음
(+) 개발자가 생성자를 선언할 경우 객체를 다양하게 초기화 가능
* 개발자가 명시적으로 선언한 생성자가 있다면 컴파일러는 기본 생성자를 추가하지 않음
생성자 선언
- 생성자는 메소드와 비슷한 모양을 가짐
(but) 리턴 타입 없음, 클래스 이름과 동일
클래스(매개변수, ...) {
//객체의 초기화 코드
}
매개변수 : new 연산자로 생성자를 호출할 때 매개값을 생성자 블록 내부로 전달하는 역할 수행
Car myCar = new Car("그랜저", "검정", "300");
public class Car {
//생성자 선언
Car(String model, String color, int maxSpeed) {...}
}
필드 초기화
i) 객체마다 동일한 값을 갖고 있다면 -> 필드 선언 시 초기값 대입
ii) 객체마다 다른 값을 가져야 함 -> 생성자에서 필드 초기화
public class Korean{
//필드 선언
String nation = "대한민국"; //객체마다 동일한 값 가진다면 여기서 초기값 대입
String name;
String ssn;
//생성자 선언
public Korean(String n, String s){
name = n;
ssn = s;
}
//매개값으로 받은 이름과 주민등록번호를 필드 초기값으로 사용
}
- 생성자의 매개값 : new 연산자로 생성자 호출 시 주어짐, 각각으로 해당하는 필드가 초기화됨
* 이름 겹칠 시 this 사용
public class Korean{
//필드 선언
String nation = "대한민국";
String name;
String ssn;
//생성자 선언
public Korean(String name, String ssn){
this.name = name; //이름 겹칠 시, 현재 객체의 데이터(필드)를 this.name 이렇게 표현
this.ssn = ssn;
}
}
생성자 오버로딩
: 매개변수를 달리하는(매개변수의 타입, 개수, 순서가 다른) 생성자를 여러 개 선언하는 것.
- 매개값으로 객체의 필드를 다양하게 초기화하기 위해 필요
public class Car{
//필드 선언
String company = "현대자동차"
String model;
String color;
int maxSpeed;
//Car car1 = new Car();
Car() {}
//Car car2 = new Car("자가용");
Car(String model) {
this.model = model;
}
//Car car3 = new Car("자가용", "빨강");
Car(String model, String color) {
this.model = model;
this.color = color;
}
//Car car4 = new Car("택시", "검정", 200);
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
* 매개변수의 타입과 개수, 선언된 순서가 똑같을 경우, 매개변수 이름만 바꾸는 것은 생성자 오버로딩 아님(컴파일 에러)
Car(String model, String color) {...}
Car(String color, String model) {...}
//위와 같은 경우, 둘 다 String 타입이기 때문에 생성자 오버로딩이 아님
- 생성자가 오버로딩되어있을 경우, new 연산자로 생성자 호출 시 제공되는 매개값의 타입, 수에 따라 실행될 생성자가 결정됨
다른 생성자 호출
- 생성자 오버로딩이 많아질 경우, 생성자 간 중복된 코드 발생
=> 공통 코드를 한 생성자에만 집중적으로 작성, 나머지 생성자는 this(...)를 사용해 공통 코드를 가지고 있는 생성자 호출
Car(String model){
this(model, "은색", 250);
}
Car(String model, String color){
this(model, color, 250);
}
Car(String model, String color, int maxSpeed){
//공통 초기화 코드
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
- this(매개값, ...) 은 생성자의 첫 줄에 작성되며 다른 생성자를 호출하는 역할 수행
- 호출하고 싶은 생성자의 매개변수에 맞게 매개값 제공
- this() 다음에는 추가적인 실행문을 작성, 호출되는 생성자의 실행이 끝나면 원래 생성자로 복귀해 다음 실행문 실행
Car(String model){
this(model, "은색", 250);
//추가적인 실행문... this 실행 이후 여기로 복귀함
}
Car(String model, String color, int maxSpeed){
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
// this(model, "은색", 250); 이런 식으로 기본값 넣어 공통 생성자 호출할 수도 있음
'언어 > java' 카테고리의 다른 글
[Java] 6. 클래스 (1) 1~4 (0) | 2025.03.22 |
---|---|
[Java] 5. 참조 타입 (3) - 7~10 (2) | 2025.03.16 |
[Java] 5. 참조 타입 (2) - 5~6 (1) | 2025.03.16 |
[Java] 5. 참조 타입 (1) - 1~4 (0) | 2025.03.16 |