본문 바로가기
언어/java

[Java] 6. 클래스 (2) - 5~7

by 젼젼39 2025. 3. 22.

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